{"id":"47f319cf-fe12-4dfb-8825-aa3edbdfbbfc","shortId":"xeenZk","kind":"skill","title":"dt-app-notebooks","tagline":"Work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON. Derives from the dt-app-dashboards skill with notebook-specific differences documented here.","description":"# Dynatrace Notebook Skill\n\n## How to Use This Skill\n\nNotebooks and dashboards are structurally similar. **Follow the `dt-app-dashboards` skill for all workflows** (creating, modifying, querying, analyzing), applying the differences documented below.\n\n### Mandatory Create/Update Workflow\n\n1. Load domain skills BEFORE generating queries — do not invent DQL\n2. Validate ALL queries via `dtctl query '<DQL>' --plain` before adding to the notebook\n3. **Always set `\"autoSelectVisualization\": true`** in `visualizationSettings` unless the user explicitly requests a specific visualization type\n4. **ALWAYS deploy via `deploy_notebook.sh`** — never use `dtctl apply` directly:\n   ```\n   bash scripts/deploy_notebook.sh notebook.json\n   ```\n   The script validates the notebook first and blocks deployment on errors. Skipping it risks deploying broken notebooks.\n   On successful deployment, the local file is deleted.\n5. When updating an existing notebook: **download first** with `dtctl get notebook <id> -o json --plain > notebook.json`, modify, then deploy. Never reconstruct from scratch or inject an `id` manually.\n\n## Notebook JSON Structure\n\n```json\n{\n  \"name\": \"My Notebook\",\n  \"type\": \"notebook\",\n  \"content\": {\n    \"version\": \"7\",\n    \"defaultTimeframe\": { \"from\": \"now()-2h\", \"to\": \"now()\" },\n    \"sections\": [\n      { \"id\": \"uuid-1\", \"type\": \"markdown\", \"markdown\": \"# Title\\nContext\" },\n      {\n        \"id\": \"uuid-2\", \"type\": \"dql\", \"title\": \"Query Section\", \"showInput\": true,\n        \"state\": {\n          \"input\": { \"value\": \"fetch logs | summarize count()\" },\n          \"visualization\": \"table\",\n          \"visualizationSettings\": { \"autoSelectVisualization\": true, \"chartSettings\": {} },\n          \"querySettings\": {\n            \"maxResultRecords\": 1000, \"defaultScanLimitGbytes\": 500,\n            \"maxResultMegaBytes\": 1, \"defaultSamplingRatio\": 10, \"enableSampling\": false\n          }\n        }\n      }\n    ]\n  }\n}\n```\n\n## Key Differences from Dashboards\n\n### Document Structure\n\n| Aspect | Dashboard | Notebook |\n|--------|-----------|----------|\n| `type` | `\"dashboard\"` | `\"notebook\"` |\n| `content.version` | `21` (number) | `\"7\"` (string) |\n| Content blocks | `tiles` (object map) + `layouts` (object map) | `sections` (ordered array) |\n| Variables | `content.variables[]` with query, csv, text types | **None** |\n| Layout/grid | 24-unit grid via `layouts` with x, y, w, h | **None** — sections render top-to-bottom in array order |\n| Default timeframe | Controlled by UI time picker | `content.defaultTimeframe` object with `from`/`to` |\n\n### Section Types vs Tile Types\n\nDashboards have two tile types (`markdown`, `data`). Notebooks have three section types:\n\n- **`markdown`** — Same concept. Fields: `id`, `type`, `markdown`\n- **`dql`** — Equivalent to dashboard `data` tiles, but query and visualization are nested inside `state` (see table below)\n\n### Query & Visualization Path Mapping\n\n| Field | Dashboard tile | Notebook DQL section |\n|-------|---------------|---------------------|\n| Query string | `tile.query` | `section.state.input.value` |\n| Visualization type | `tile.visualization` | `section.state.visualization` |\n| Visualization settings | `tile.visualizationSettings` | `section.state.visualizationSettings` |\n| Query settings | `tile.querySettings` | `section.state.querySettings` |\n| Section-specific timeframe | N/A (UI picker controls all tiles) | `section.state.input.timeframe` |\n\n### Notebook-Only Section Properties\n\n- `autoSelectVisualization` (boolean, in `visualizationSettings`) — when `true`, Dynatrace automatically selects the best visualization type for the query result. **Prefer `true` when the user has no specific visualization preference.** When set to `false`, you must explicitly set `state.visualization` to the desired type.\n- `showTitle` (boolean) — show/hide section title\n- `showInput` (boolean, default `true`) — show/hide query editor. Always set to `true` unless explicitly requested otherwise.\n- `height` (number, px) — section height (default ~400)\n- `drilldownPath` — navigation path for drilldown interactions\n- `filterSegments` — section-level filter segments\n- `davis` — Davis AI copilot configuration\n\n### Available Visualizations\n\nNotebooks support: `table`, `lineChart`, `areaChart`, `barChart`, `categoricalBarChart`, `pieChart`, `donutChart`, `singleValue`, `bandChart`, `histogram`, `honeycomb`, `raw`, `recordView`\n\n### What Does NOT Apply from the Dashboard Skill\n\n- **Variables** — Notebooks have no variables. Ignore all variable sections: types, substitution patterns (`$Var`, `array($Var)`), dependency resolution, variable validation.\n- **Layouts/grid** — No positioning system. Section order in the array = display order. No `x`, `y`, `w`, `h`.\n- **Tile ID / Layout ID matching** — Not applicable (no layouts object).\n- **UI timeframe picker warnings** — Notebooks don't have a dashboard-style time picker that controls all queries. Instead, `content.defaultTimeframe` sets the default, and each section can override via `section.state.input.timeframe`. Hardcoded time filters in queries are acceptable in notebooks.\n- **Variable substitution in queries** — Not applicable.\n\n## Validation & Deployment\n\nUse the scripts in `scripts/`:\n\n- **`notebook-validator.js`** — Validates notebook structure and executes all DQL queries. Run via:\n  ```\n  cat notebook.json | jq '{notebook: .}' | dtctl exec function -f scripts/notebook-validator.js --data - --plain | jq -r .result\n  ```\n  Or by notebook ID: `echo '{\"notebookId\":\"<id>\"}' | dtctl exec function -f scripts/notebook-validator.js --data - --plain | jq -r .result`\n\n- **`deploy_notebook.sh`** — Validates then deploys:\n  ```\n  bash scripts/deploy_notebook.sh notebook.json\n  bash scripts/deploy_notebook.sh --dry-run notebook.json\n  ```\n\n## Related Skills\n\n- **dt-app-dashboards** — Base skill for all workflows; this skill documents only the differences\n- **dt-dql-essentials** — DQL query syntax, functions, and optimization","tags":["app","notebooks","dynatrace","for","agent-skills","ai-agents","claude-code","devops","dql","mcp","observability"],"capabilities":["skill","source-dynatrace","skill-dt-app-notebooks","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-devops","topic-dql","topic-dynatrace","topic-mcp","topic-observability"],"categories":["dynatrace-for-ai"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Dynatrace/dynatrace-for-ai/dt-app-notebooks","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Dynatrace/dynatrace-for-ai","source_repo":"https://github.com/Dynatrace/dynatrace-for-ai","install_from":"skills.sh"}},"qualityScore":"0.489","qualityRationale":"deterministic score 0.49 from registry signals: · indexed on github topic:agent-skills · 78 github stars · SKILL.md body (5,968 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:56:47.444Z","embedding":null,"createdAt":"2026-05-11T18:57:13.324Z","updatedAt":"2026-05-18T18:56:47.444Z","lastSeenAt":"2026-05-18T18:56:47.444Z","tsv":"'-1':195 '-2':188,203 '1':67,230 '10':232 '1000':226 '2':78 '21':248 '24':272 '3':91 '4':107 '400':453 '5':145 '500':228 '7':184,250 'accept':577 'ad':87 'ai':468 'alway':92,108,439 'analyz':13,58 'app':3,21,49,651 'appli':59,115,491 'applic':537,585 'areachart':477 'array':262,290,509,523 'aspect':241 'automat':394 'autoselectvisu':94,221,387 'avail':471 'bandchart':483 'barchart':478 'base':653 'bash':117,638,641 'best':397 'block':127,253 'boolean':388,428,433 'bottom':288 'broken':135 'cat':604 'categoricalbarchart':479 'chartset':223 'concept':323 'configur':470 'content':182,252 'content.defaulttimeframe':299,560 'content.variables':264 'content.version':247 'control':294,378,556 'copilot':469 'count':217 'creat':9,55 'create/update':65 'csv':267 'dashboard':22,41,50,238,242,245,309,331,350,494,551,652 'dashboard-styl':550 'data':315,332,613,629 'davi':466,467 'default':292,434,452,563 'defaultsamplingratio':231 'defaultscanlimitgbyt':227 'defaulttimefram':185 'delet':144 'depend':511 'deploy':109,128,134,139,163,587,637 'deploy_notebook.sh':111,634 'deriv':16 'desir':425 'differ':28,61,236,663 'direct':116 'display':524 'document':29,62,239,660 'domain':69 'donutchart':481 'download':151 'dql':77,205,328,353,600,666,668 'dri':644 'drilldown':458 'drilldownpath':454 'dry-run':643 'dt':2,20,48,650,665 'dt-app-dashboard':19,47,649 'dt-app-notebook':1 'dt-dql-essenti':664 'dtctl':83,114,154,608,624 'dynatrac':7,31,393 'echo':622 'editor':438 'enablesampl':233 'equival':329 'error':130 'essenti':667 'exec':609,625 'execut':598 'exist':149 'explicit':101,420,444 'f':611,627 'fals':234,417 'fetch':214 'field':324,349 'file':142 'filter':464,573 'filterseg':460 'first':125,152 'follow':45 'function':610,626,671 'generat':72 'get':155 'grid':274 'h':189,281,530 'hardcod':571 'height':447,451 'histogram':484 'honeycomb':485 'id':171,193,201,325,532,534,621 'ignor':501 'inject':169 'input':212 'insid':340 'instead':559 'interact':459 'invent':76 'jq':606,615,631 'json':15,158,174,176 'key':235 'layout':257,276,533,539 'layout/grid':271 'layouts/grid':515 'level':463 'linechart':476 'load':68 'local':141 'log':215 'mandatori':64 'manual':172 'map':256,259,348 'markdown':197,198,314,321,327 'match':535 'maxresultmegabyt':229 'maxresultrecord':225 'modifi':10,56,161 'must':419 'n/a':375 'name':177 'navig':455 'ncontext':200 'nest':339 'never':112,164 'none':270,282 'notebook':4,8,14,26,32,39,90,124,136,150,156,173,179,181,243,246,316,352,383,473,497,545,579,595,607,620 'notebook-on':382 'notebook-specif':25 'notebook-validator.js':593 'notebook.json':119,160,605,640,646 'notebookid':623 'number':249,448 'o':157 'object':255,258,300,540 'optim':673 'order':261,291,520,525 'otherwis':446 'overrid':568 'path':347,456 'pattern':507 'picker':298,377,543,554 'piechart':480 'plain':85,159,614,630 'posit':517 'prefer':404,413 'properti':386 'px':449 'queri':11,57,73,81,84,207,266,335,345,355,367,402,437,558,575,583,601,669 'queryset':224 'r':616,632 'raw':486 'reconstruct':165 'recordview':487 'relat':647 'render':284 'request':102,445 'resolut':512 'result':403,617,633 'risk':133 'run':602,645 'scratch':167 'script':121,590,592 'scripts/deploy_notebook.sh':118,639,642 'scripts/notebook-validator.js':612,628 'section':192,208,260,283,304,319,354,372,385,430,450,462,504,519,566 'section-level':461 'section-specif':371 'section.state.input.timeframe':381,570 'section.state.input.value':358 'section.state.querysettings':370 'section.state.visualization':362 'section.state.visualizationsettings':366 'see':342 'segment':465 'select':395 'set':93,364,368,415,421,440,561 'show/hide':429,436 'showinput':209,432 'showtitl':427 'similar':44 'singlevalu':482 'skill':23,33,38,51,70,495,648,654,659 'skill-dt-app-notebooks' 'skip':131 'source-dynatrace' 'specif':27,104,373,411 'state':211,341 'state.visualization':422 'string':251,356 'structur':43,175,240,596 'style':552 'substitut':506,581 'success':138 'summar':216 'support':474 'syntax':670 'system':518 'tabl':219,343,475 'text':268 'three':318 'tile':254,307,312,333,351,380,531 'tile.query':357 'tile.querysettings':369 'tile.visualization':361 'tile.visualizationsettings':365 'time':297,553,572 'timefram':293,374,542 'titl':199,206,431 'top':286 'top-to-bottom':285 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-devops' 'topic-dql' 'topic-dynatrace' 'topic-mcp' 'topic-observability' 'true':95,210,222,392,405,435,442 'two':311 'type':106,180,196,204,244,269,305,308,313,320,326,360,399,426,505 'ui':296,376,541 'unit':273 'unless':98,443 'updat':147 'use':36,113,588 'user':100,408 'uuid':194,202 'valid':79,122,514,586,594,635 'valu':213 'var':508,510 'variabl':263,496,500,503,513,580 'version':183 'via':82,110,275,569,603 'visual':105,218,337,346,359,363,398,412,472 'visualizationset':97,220,390 'vs':306 'w':280,529 'warn':544 'work':5 'workflow':54,66,657 'x':278,527 'y':279,528","prices":[{"id":"9287b445-7c99-4535-bc76-4094eac0388b","listingId":"47f319cf-fe12-4dfb-8825-aa3edbdfbbfc","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Dynatrace","category":"dynatrace-for-ai","install_from":"skills.sh"},"createdAt":"2026-05-11T18:57:13.324Z"}],"sources":[{"listingId":"47f319cf-fe12-4dfb-8825-aa3edbdfbbfc","source":"github","sourceId":"Dynatrace/dynatrace-for-ai/dt-app-notebooks","sourceUrl":"https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-app-notebooks","isPrimary":false,"firstSeenAt":"2026-05-11T18:57:13.324Z","lastSeenAt":"2026-05-18T18:56:47.444Z"}],"details":{"listingId":"47f319cf-fe12-4dfb-8825-aa3edbdfbbfc","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Dynatrace","slug":"dt-app-notebooks","github":{"repo":"Dynatrace/dynatrace-for-ai","stars":78,"topics":["agent-skills","ai-agents","claude-code","devops","dql","dynatrace","mcp","observability"],"license":"apache-2.0","html_url":"https://github.com/Dynatrace/dynatrace-for-ai","pushed_at":"2026-05-15T16:06:09Z","description":"Skills, prompts, and instructions for building AI agents on top of Dynatrace production context","skill_md_sha":"6ca84e9374716721bda1def1defe3a3e131bfb9a","skill_md_path":"skills/dt-app-notebooks/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-app-notebooks"},"layout":"multi","source":"github","category":"dynatrace-for-ai","frontmatter":{"name":"dt-app-notebooks","license":"Apache-2.0","description":"Work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON. Derives from the dt-app-dashboards skill with notebook-specific differences documented here."},"skills_sh_url":"https://skills.sh/Dynatrace/dynatrace-for-ai/dt-app-notebooks"},"updatedAt":"2026-05-18T18:56:47.444Z"}}