Work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON. Derives from the dt-app-dashboards skill with notebook-specific differences documented here.
78
66%
Does it follow best practices?
Impact
100%
1.26xAverage score across 3 eval scenarios
Advisory
Suggest reviewing before use
Optimize this skill with Tessl
npx tessl skill review --optimize ./skills/dt-app-notebooks/SKILL.mdNotebooks and dashboards are structurally similar. Follow the dt-app-dashboards skill for all workflows (creating, modifying, querying, analyzing), applying the differences documented below.
dtctl query '<DQL>' --plain before adding to the notebook"autoSelectVisualization": true in visualizationSettings unless the user explicitly requests a specific visualization typedeploy_notebook.sh — never use dtctl apply directly:
bash scripts/deploy_notebook.sh notebook.jsondtctl get notebook <id> -o json --plain > notebook.json, modify, then deploy. Never reconstruct from scratch or inject an id manually.{
"name": "My Notebook",
"type": "notebook",
"content": {
"version": "7",
"defaultTimeframe": { "from": "now()-2h", "to": "now()" },
"sections": [
{ "id": "uuid-1", "type": "markdown", "markdown": "# Title\nContext" },
{
"id": "uuid-2", "type": "dql", "title": "Query Section", "showInput": true,
"state": {
"input": { "value": "fetch logs | summarize count()" },
"visualization": "table",
"visualizationSettings": { "autoSelectVisualization": true, "chartSettings": {} },
"querySettings": {
"maxResultRecords": 1000, "defaultScanLimitGbytes": 500,
"maxResultMegaBytes": 1, "defaultSamplingRatio": 10, "enableSampling": false
}
}
}
]
}
}| Aspect | Dashboard | Notebook |
|---|---|---|
type | "dashboard" | "notebook" |
content.version | 21 (number) | "7" (string) |
| Content blocks | tiles (object map) + layouts (object map) | sections (ordered array) |
| Variables | content.variables[] with query, csv, text types | None |
| Layout/grid | 24-unit grid via layouts with x, y, w, h | None — sections render top-to-bottom in array order |
| Default timeframe | Controlled by UI time picker | content.defaultTimeframe object with from/to |
Dashboards have two tile types (markdown, data). Notebooks have three section types:
markdown — Same concept. Fields: id, type, markdowndql — Equivalent to dashboard data tiles, but query and visualization are nested inside state (see table below)| Field | Dashboard tile | Notebook DQL section |
|---|---|---|
| Query string | tile.query | section.state.input.value |
| Visualization type | tile.visualization | section.state.visualization |
| Visualization settings | tile.visualizationSettings | section.state.visualizationSettings |
| Query settings | tile.querySettings | section.state.querySettings |
| Section-specific timeframe | N/A (UI picker controls all tiles) | section.state.input.timeframe |
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.showTitle (boolean) — show/hide section titleshowInput (boolean, default true) — show/hide query editor. Always set to true unless explicitly requested otherwise.height (number, px) — section height (default ~400)drilldownPath — navigation path for drilldown interactionsfilterSegments — section-level filter segmentsdavis — Davis AI copilot configurationNotebooks support: table, lineChart, areaChart, barChart, categoricalBarChart, pieChart, donutChart, singleValue, bandChart, histogram, honeycomb, raw, recordView
$Var, array($Var)), dependency resolution, variable validation.x, y, w, h.content.defaultTimeframe sets the default, and each section can override via section.state.input.timeframe. Hardcoded time filters in queries are acceptable in notebooks.Use the scripts in scripts/:
notebook-validator.js — Validates notebook structure and executes all DQL queries. Run via:
cat notebook.json | jq '{notebook: .}' | dtctl exec function -f scripts/notebook-validator.js --data - --plain | jq -r .resultOr by notebook ID: echo '{"notebookId":"<id>"}' | dtctl exec function -f scripts/notebook-validator.js --data - --plain | jq -r .result
deploy_notebook.sh — Validates then deploys:
bash scripts/deploy_notebook.sh notebook.json
bash scripts/deploy_notebook.sh --dry-run notebook.json7cbe1ef
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.