
Dt App Notebooks
- 1.5k installs
- 119 repo stars
- Updated July 29, 2026
- dynatrace/dynatrace-for-ai
dt-app-notebooks provides documented workflows for Work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON including sections, DQL queries, and visualizations.
About
The dt-app-notebooks skill work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON including sections, DQL queries, and visualizations. # Dynatrace Notebook Skill ## Overview Dynatrace notebooks are JSON documents stored in the Document Store containing an ordered array of **sections** - markdown blocks for narrative and `dql` blocks for DQL queries with visualizations. Sections render top-to-bottom in array order. **When to use:** Creating, modifying, querying, or analyzing notebooks. ## Notebook JSON Structure ```json { "name": "My Notebook", "type": "notebook", "content": { "version": "7", "defaultTimeframe": { "from": "now()-2h", "to": "now()" }, "sections": [ { "id": "1", "type": "markdown", "markdown": "# Title" }, { "id": "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 } } } ] } } ``` - Sections render in ar.
- Sections render in array order.
- Section types: `markdown`, `dql`. (`function` exists but is rare.)
- Use string-int IDs (`"1"`, `"2"`, …); UUIDs are also accepted.
- `content.defaultTimeframe` sets the default timeframe; each section can override via `section.state.input.timeframe`. Ha
- Load domain skills BEFORE generating queries - do not invent DQL.
Dt App Notebooks by the numbers
- 1,525 all-time installs (skills.sh)
- +79 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #144 of 1,435 DevOps & CI/CD skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
dt-app-notebooks capabilities & compatibility
- Capabilities
- sections render in array order. · section types: `markdown`, `dql`. (`function` ex · use string int ids (`"1"`, `"2"`, …); uuids are · `content.defaulttimeframe` sets the default time · load domain skills before generating queries d
- Use cases
- documentation
What dt-app-notebooks says it does
Sections render top-to-bottom in array order.
**When to use:** Creating, modifying, querying, or analyzing notebooks.
npx skills add https://github.com/dynatrace/dynatrace-for-ai --skill dt-app-notebooksAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.5k |
|---|---|
| repo stars | ★ 119 |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 29, 2026 |
| Repository | dynatrace/dynatrace-for-ai ↗ |
How do I use dt-app-notebooks for the task described in its SKILL.md triggers?
Work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON including sections, DQL queries, and visualizations.
Who is it for?
Teams invoking dt-app-notebooks when the user request matches documented triggers and prerequisites.
Skip if: Skip when cached docs are missing, the request is a negative trigger, or another sibling skill owns the workflow.
When should I use this skill?
Work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON including sections, DQL queries, and visualizations.
What you get
Step-by-step guidance grounded in dt-app-notebooks documentation and reference files.
- Dynatrace notebook JSON with DQL sections
By the numbers
- Uses Dynatrace notebook schema version 7
- Default notebook timeframe spans now()-2h to now()
Files
Dynatrace Notebook Skill
Overview
Dynatrace notebooks are JSON documents stored in the Document Store containing an ordered array of sections — markdown blocks for narrative and dql blocks for DQL queries with visualizations. Sections render top-to-bottom in array order.
When to use: Creating, modifying, querying, or analyzing notebooks.
Notebook JSON Structure
{
"name": "My Notebook",
"type": "notebook",
"content": {
"version": "7",
"defaultTimeframe": { "from": "now()-2h", "to": "now()" },
"sections": [
{ "id": "1", "type": "markdown", "markdown": "# Title" },
{
"id": "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
}
}
}
]
}
}- Sections render in array order.
- Section types:
markdown,dql. (functionexists but is rare.) - Use string-int IDs (
"1","2", …); UUIDs are also accepted. content.defaultTimeframesets the default timeframe; each section can override viasection.state.input.timeframe. Hardcoded time filters in DQL are allowed.
Optional content properties: defaultSegments.
Create/Update Workflow (Mandatory Order)
Carefully follow the workflow described in references/create-update.md.
Key rules:
- Load domain skills BEFORE generating queries — do not invent DQL.
- Validate ALL section queries before adding to the notebook.
- Set
namebefore deploying. - Prefer `autoSelectVisualization: true` in
visualizationSettingsunless the user requested a specific visualization type — whenfalse,state.visualizationmust be set explicitly. - Updating — ALWAYS download first:
dtctl get notebook <id> -o json --plain > notebook.json, modify, then deploy the downloaded file. Never reconstruct JSON from scratch or inject anidmanually — both silently overwrite UI edits the user made since last deployment. - Deploy with `dtctl apply` — validation runs automatically, and the local file is deleted on success.
Visualization Types
Notebooks support a subset of Dynatrace visualizations:
- Time-series (require
timeseries/makeTimeseries):lineChart,areaChart,barChart,bandChart - Categorical (
summarize ... by:{field}):categoricalBarChart,pieChart,donutChart - Single value / gauge / meter:
singleValue,meterBar,gauge - Tabular (any data shape):
table,raw,recordView - Distribution/status:
histogram,honeycomb - Geographic maps:
choropleth,dotMap,connectionMap,bubbleMap - Matrix/correlation:
heatmap,scatterplot
Required field types per visualization: references/sections.md.
References
| File | When to Load |
|---|---|
| create-update.md | Creating/updating notebooks |
| sections.md | Section types, visualization field requirements, settings |
| analyzing.md | Reading notebooks, extracting queries, purpose identification |
{
"name": "Example Notebook",
"type": "notebook",
"content": {
"version": "7",
"defaultTimeframe": {
"from": "now()-2h",
"to": "now()"
},
"defaultSegments": [],
"sections": [
{
"id": "1",
"type": "markdown",
"markdown": "# Example Notebook\nDemonstrates a markdown intro and two DQL sections."
},
{
"id": "2",
"type": "dql",
"title": "Logs by level (table)",
"showTitle": true,
"showInput": true,
"state": {
"input": {
"value": "fetch logs\n| summarize count(), by:{loglevel, dt.system.bucket, dt.smartscape.host}"
},
"visualization": "table",
"visualizationSettings": {
"autoSelectVisualization": true,
"chartSettings": {}
},
"querySettings": {
"maxResultRecords": 1000,
"defaultScanLimitGbytes": 500,
"maxResultMegaBytes": 1,
"defaultSamplingRatio": 10,
"enableSampling": false
}
}
},
{
"id": "3",
"type": "dql",
"title": "Host CPU idle (line chart)",
"showTitle": true,
"showInput": true,
"state": {
"input": {
"value": "timeseries avg(dt.host.cpu.idle), by:{dt.smartscape.host}"
},
"visualizationSettings": {
"autoSelectVisualization": true,
"chartSettings": {}
},
"querySettings": {
"maxResultRecords": 1000,
"defaultScanLimitGbytes": 500,
"maxResultMegaBytes": 1,
"defaultSamplingRatio": 10,
"enableSampling": false
}
}
}
]
}
}
{
// Reference for visualizationSettings by visualization type.
// All properties are optional unless noted. Only visualization-specific
// differences are shown; shared patterns (legend, tooltip, zoom,
// unitsOverrides, coloring, thresholds) apply to most chart types.
//
// For notebooks, the path is `section.state.visualizationSettings`.
// Set `autoSelectVisualization: true` to let Dynatrace pick the
// visualization type for the query result.
// ── Shared patterns (apply to most visualizations) ──
// legend: { "position": "auto", "showLegend": true, "textTruncationMode": "end", "ratio": "auto" }
// tooltip: { "variant": "single", "seriesDisplayMode": "single-line" }
// zoom: { "isActive": true, "zoom": {"enabled": true}, "pan": {"enabled": true}, "zoomX": {"enabled": true} }
// coloring: { "colorRules": [], "thresholdRules": [] }
// unitsOverrides: [{ "identifier": "field", "unitCategory": "time", "baseUnit": "microsecond", "displayUnit": null, "decimals": null, "suffix": "", "delimiter": false, "added": <timestamp> }]
// ── Time-series charts (lineChart, areaChart, barChart, bandChart) ──
"lineChart": {
"visualizationSettings": {
"dataMapping": { "time": null, "displayedFields": [], "series": [], "interval": null },
"axes": {
"xAxis": { "label": "", "showLabel": false, "displayTimeFrame": "auto" },
"yAxis": { "label": "", "min": {"mode": "auto"}, "max": {"mode": "auto"}, "scale": "linear", "showLabel": false },
"rightYAxis": { "label": "", "min": {"mode": "auto"}, "max": {"mode": "auto"}, "scale": "linear", "showLabel": false }
},
"valueSettings": { "valueRepresentation": "absolute" },
"seriesOverrides": [],
"seriesConfig": { "curve": "linear", "pointsDisplay": "auto", "gapPolicy": "gap" },
"colorModeType": { "colorPalette": "categorical", "seriesCustomColors": [] }
}
},
// areaChart, barChart: same structure as lineChart
// bandChart: adds dataMapping.min and dataMapping.max for upper/lower band fields
// ── Categorical charts (categoricalBarChart, pieChart, donutChart) ──
"categoricalBarChart": {
"visualizationSettings": {
"categoryAxis": { "label": {"label": "", "showLabel": true}, "tickLayout": "horizontal" },
"numericAxis": { "label": {"showLabel": true, "label": ""}, "scale": "linear" },
"dataMapping": { "displayedFields": [], "values": [] },
"valueBoundaries": { "max": {"mode": "auto"}, "min": {"mode": "auto"} },
"valueSettings": { "valueRepresentation": "absolute" },
"layout": { "groupMode": "stacked", "position": "horizontal" },
"colorModeType": { "colorCategoryMode": "multi-color", "colorPalette": "categorical", "customCategoryColors": {} }
}
},
"pieChart": {
"visualizationSettings": {
"dataMapping": { "value": "", "displayedFields": [] },
"labels": { "showLabels": true },
"valueSettings": { "valueRepresentation": "absolute" },
"groupingSettings": { "groupingStrategy": "absolute", "limit": 0, "label": "" }
}
},
// donutChart: same as pieChart plus "totalLabel" in labels and "showTotals" in valueSettings
// ── Single value / gauge / meter ──
"singleValue": {
"visualizationSettings": {
"alignment": "center",
"colorThresholdTarget": "value",
"dataMapping": { "record": null, "timeseries": null, "value": null, "label": null },
"icon": "AnalyticsIcon",
"showIcon": false,
"label": { "label": "", "mode": "custom" },
"sparkline": { "color": "#3f8cff", "isVisible": true, "lineType": "linear", "variant": "line", "gapPolicy": "connect" },
"trend": { "isVisible": null, "valueRepresentation": "relative", "trendType": "auto" },
"valueBoundaries": { "min": {"mode": "auto"}, "max": {"mode": "auto"} }
}
},
"meterBar": {
"visualizationSettings": {
"valueBoundaries": { "min": {"mode": "auto"}, "max": {"mode": "auto"} },
"icon": { "showIcon": true, "icon": "MeterbarIcon" },
"label": { "showLabel": true, "label": "" },
"dataMapping": { "value": null, "maxDataField": null, "minDataField": null }
}
},
// gauge: same structure as meterBar (different default icon)
// ── Table / raw / recordView ──
"table": {
"visualizationSettings": {
"table": {
"colorThresholdTarget": "value",
"columnOrder": [],
"hiddenColumns": [],
"rowDensity": "condensed",
"sortBy": [],
"columnWidthStrategy": "content",
"enableSparklines": false,
"linewrapEnabled": false
}
}
},
// ── Distribution / status ──
"histogram": {
"visualizationSettings": {
"axes": {
"xAxis": { "label": "", "showLabel": false, "scale": "linear" },
"yAxis": { "label": "Frequency", "showLabel": true, "scale": "linear" }
},
"dataMapping": { "displayedFields": [], "value": "", "range": "" }
}
},
"honeycomb": {
"visualizationSettings": {
"shape": "hexagon",
"valueBoundaries": { "min": {"mode": "auto"}, "max": {"mode": "auto"} },
"dataMapping": { "dimension": null, "displayedFields": [] },
"labels": { "showLabels": false }
}
},
// ── Geographic maps ──
// Shared: mapView { "defaultZoom": "data", "longitude": 0, "latitude": 0, "zoom": 0 }
// Shared: regions { "showRegions": false, "regions": [] }
"choropleth": {
"visualizationSettings": {
"dataMapping": { "countryCode": null, "dimension": null, "displayedFields": [] }
}
},
"dotMap": {
"visualizationSettings": {
"dataMapping": { "bearingValue": null, "dimension": null, "latitude": null, "longitude": null, "displayedFields": [] },
"mapShape": { "bearing": 0, "shape": "pin", "shapeSize": 32, "shapeStyle": "shape" }
}
},
"connectionMap": {
"visualizationSettings": {
"dataMapping": { "latitudeList": null, "longitudeList": null, "dimension": null, "displayedFields": [] },
"mapLine": { "curve": "smooth", "directionIndicator": "start", "line": "solid", "thickness": 2 }
}
},
"bubbleMap": {
"visualizationSettings": {
"dataMapping": { "latitude": null, "longitude": null, "radius": null, "dimension": null, "displayedFields": [] },
"mapRadius": { "sizeInterpolation": "zoom", "scale": "linear", "radius": 12, "radiusRange": [10, 100] }
}
},
// ── Matrix / correlation ──
"heatmap": {
"visualizationSettings": {
"dataMapping": { "xAxis": null, "yAxis": null, "bucketValue": null },
"axes": {
"xAxis": { "label": "", "showLabel": false, "position": "bottom" },
"yAxis": { "label": "", "showLabel": false, "position": "left" }
}
}
},
"scatterplot": {
"visualizationSettings": {
"dataMapping": { "xAxis": null, "yAxis": null, "displayedFields": [] }
}
}
}
Notebook Analysis & Information Extraction
Two Main Workflows
1. Look into the notebook — read global context, then sections in display order 2. Search for something — find specific content by keyword
---
Workflow 1: Read Notebook
Global Context
Read .content.version for the schema version, .content.defaultTimeframe for the notebook's default time range, and count entries in .content.sections for total section count.
Sections in Display Order
Sections render top-to-bottom in array order.
Iterate .content.sections in order. For each section, read: id, type, title, state.input.value (the DQL query), and state.visualization.
For a specific section, find the entry where .id == "<id>" and read: title, state.input.value, visualization, and state.visualizationSettings.
Per section, extract: title (what it shows), query (DQL), visualization (chart type), thresholds (color interpretation), markdown (markdown text).
---
Workflow 2: Search
To search by title: iterate .content.sections and find entries where .title (case-insensitive) contains the keyword.
To search by query content: iterate .content.sections and find entries where .state.input.value contains the search pattern.
---
Executing Queries from a Section
1. Extract query (section.state.input.value) with title, visualization, and thresholds for context 2. Check for hardcoded timeframe (section.state.input.timeframe) — if absent, the notebook's content.defaultTimeframe applies 3. Execute the query and interpret results based on visualization type and thresholds
---
Purpose Identification
Analyze section titles and data sources to infer notebook purpose:
- "Request Rate", "Error Count", "Response Time" → Service Health (RED)
- "CPU Usage", "Memory Usage" → Infrastructure Monitoring
- "SLI", "Error Budget" → SLO Tracking
- Single values with thresholds → Executive / KPI overview
To identify data sources, scan .content.sections[].state.input.value for fetch <entity> patterns to see which Dynatrace entity types are queried.
Notebook Create & Update Workflows
Mandatory 7-Step Order
1. Define purpose and load required skills, references and assets 2. Explore available data fields/metrics 3. Plan notebook structure: section order, markdown vs DQL sections 4. Design and validate all DQL with dtctl query '<DQL>' --plain 5. (Update only) Download existing notebook JSON from the server 6. Construct new notebook JSON (create) or modify the downloaded JSON (update) 7. Deploy with dtctl apply — when updating, deploy the file downloaded in step 5
---
Mandatory Requirements
- DQL validation — test ALL section queries before adding
- Skill-based queries — load domain skills BEFORE generating queries;
do not invent DQL queries, field names, or data sources
- Verify field names — run a sample query (e.g.
| limit 1) and only use
fields that actually exist in the result
- Time-range filters in queries — hardcoded time filters are fine in
notebooks. The default timeframe is content.defaultTimeframe; each section can override via section.state.input.timeframe.
DQL Validation
Syntax + execution validation is mandatory for all queries. Section queries may return empty results (e.g. error logs when no errors exist) — empty is OK, but the query must execute without errors.
Creating Notebooks
Step 1: Define Purpose
Identify metrics, audience, and actions. Then load relevant domain skills.
Step 2: Explore Data
For fields and metrics already documented in the loaded domain skill, skip exploration — confirm with one | limit 1 query. Only run broader discovery queries for data models not covered by the skill.
Step 3: Plan Structure
Sections render top-to-bottom in content.sections array order. Use markdown sections to introduce groups of DQL sections (e.g. one markdown header followed by 2–3 related DQL sections).
Step 4: Design and Validate Queries
dtctl query '<your DQL query>' --plainAlways use single quotes around the DQL string to avoid shell interpretation of $, \, and other special characters.
Use limit to cap results. Use summarize before visualization. Source queries from loaded skills.
Step 5 (Update only): Download Existing Notebook JSON
Skip when creating. Download the current server state before making any modifications:
dtctl get notebook <id> -o json --plain > notebook.jsonThis preserves user UI edits since the last deployment. The downloaded file contains the id — do not add or change it manually.
Step 6: Construct New or Modify Downloaded Notebook JSON
For new notebooks, build JSON from scratch (no id — server assigns one). For updates, modify the file downloaded in Step 5 — do not construct new JSON and inject an id.
{
"name": "My Notebook Name", // "id" is present when updating (from downloaded JSON)
"type": "notebook",
"content": {
"version": "7",
"defaultTimeframe": { "from": "now()-2h", "to": "now()" },
"sections": [
{ "id": "1", "type": "markdown", "markdown": "# Title" },
{
"id": "2", "type": "dql", "title": "Metric", "showInput": true,
"state": {
"input": { "value": "fetch ... | summarize ..." },
"visualizationSettings": { "autoSelectVisualization": true, "chartSettings": {} },
"querySettings": {
"maxResultRecords": 1000, "defaultScanLimitGbytes": 500,
"maxResultMegaBytes": 1, "defaultSamplingRatio": 10, "enableSampling": false
}
}
}
]
}
}Visualization tip: prefer visualizationSettings.autoSelectVisualization: true and omit state.visualization. Set both only when the user wants a specific chart type.
Checklist before writing JSON:
- Every
dqlsection has: uniqueid, validated DQL,visualizationSettings,
querySettings
- Section IDs are unique across the
sectionsarray - When updating: confirm the JSON is the downloaded file (
idfield
present), not a freshly constructed one
See sections.md for visualization types and field requirements.
Step 7: Deploy
dtctl apply -f notebook.json -o yaml
# preview without persisting:
dtctl apply -f notebook.json -o yaml --dry-runValidation runs automatically before deployment (every DQL query is executed against the tenant and visualization compatibility is checked). If validation fails, fix all reported errors before re-running — do not fix one error and re-deploy in a loop.
When updating: ensure notebook.json is the file downloaded in Step 5. A missing id field means a fresh JSON is being deployed — a new notebook will be created instead of updating.
On success, dtctl apply outputs the deployment result (action, id, name, url) and the local file is deleted automatically. Present the URL to the user.
---
Anti-Patterns
- Inventing queries without loading skills first
- Inventing DQL field names without checking sample output
- Missing
namein notebook JSON - Setting a custom
idon a new notebook (server assigns IDs; only downloaded
notebooks carry their id)
- Skipping the download when updating — building JSON from scratch loses
user UI edits made since last deployment
- Injecting an `id` into freshly-constructed JSON — same as above;
overwrites server state with stale content
- Downloading but not using the file — deploying a freshly-constructed JSON
instead of the downloaded one defeats the download step
Notebook Sections
Sections are stored in content.sections as an ordered array. Each section has its own id field. Section types: markdown and dql.
Section Types
Markdown Sections
{ "id": "1", "type": "markdown", "markdown": "# Section Header" }DQL Sections
{
"id": "2", "type": "dql", "title": "Section Name",
"showInput": true,
"state": {
"input": { "value": "timeseries avg(metric), by:{dimension}" },
"visualization": "lineChart",
"visualizationSettings": { "autoSelectVisualization": true, "chartSettings": {} },
"querySettings": {
"maxResultRecords": 1000, "defaultScanLimitGbytes": 500,
"maxResultMegaBytes": 1, "defaultSamplingRatio": 10, "enableSampling": false
}
}
}Optional properties: showTitle, height, drilldownPath, filterSegments, davis.
Section properties:
autoSelectVisualization(boolean, invisualizationSettings) — when
true, Dynatrace automatically picks the best visualization. Prefer `true` unless the user requested a specific visualization. When false, state.visualization must be set explicitly.
showTitle(boolean) — show/hide section titleshowInput(boolean, defaulttrue) — show/hide query editor. Keeptrue
unless told otherwise
height(number, px) — section height (default ~400)
Visualization Types and Required Field Types
Each visualization requires specific field types in the query result. If the query produces wrong types, the section renders blank or errors. Field types correspond to DQL output types: timestamp, timeframe, long, double, duration, string, numericArray (array of long/double — output of timeseries/makeTimeseries value columns).
Legend: R = required, O = optional, C = conditional.
Time-Series Charts
`lineChart`, `areaChart`, `barChart`: Display metric data over time.
| Slot | Accepted types | Count | Req |
|---|---|---|---|
| Time | timestamp, timeframe | 1 | R |
| Interval | duration | 1 | C — required when Values is numericArray |
| Values | long, double, duration, numericArray | 1+ | R |
| Names | any | 1+ | O |
When the query uses timeseries or makeTimeseries, values are numericArrays and the interval field (duration) must be present. If you pipe through | fields after timeseries, always include interval and timeframe.
`bandChart`: Same as above plus two additional required numericArray slots for band min and band max values.
Categorical Charts
`categoricalBarChart`, `pieChart`, `donutChart`: Show values grouped by categories.
| Slot | Accepted types | Count | Req |
|---|---|---|---|
| Values | long, double, duration | 1+ | R |
| Categories | any | 1+ | R |
Typical query pattern: summarize <agg>, by:{category}.
`barChart` vs `categoricalBarChart`: barChart is a time-series chart requiring a timestamp/timeframe axis. For "values per category" (e.g. request count per service), use categoricalBarChart. If you use barChart with summarize ... by:{category} (no time axis), the section will fail validation.
Timeseries data in categorical charts: If you need to show summarized metrics (not over time), first convert the timeseries arrays to scalars using array functions (arrayAvg, arraySum, etc.), then use categoricalBarChart.
Single Value
`singleValue`: Displays a single metric.
| Slot | Accepted types | Count | Req |
|---|---|---|---|
| Single value | any | 1 | R |
| Sparkline | numericArray | 1 | O |
Tabular
`table`, `raw`, `recordView`: Any data shape. No field-type requirements.
Distribution / Status
`histogram`: Shows distribution of values.
| Slot | Accepted types | Count | Req |
|---|---|---|---|
| Range | range (object with start/end) | 1 | R |
| Values | long, double, duration | 1 | R |
| Names | any | 1+ | O |
`honeycomb`: Grid of colored cells.
| Slot | Accepted types | Count | Req |
|---|---|---|---|
| Values | long, double, duration | 1 | R |
| Names | any | 1+ | O |
Visualization Settings
See assets/visualization-settings.reference.jsonc for the complete per-visualization settings reference.
Common settings across visualizations: legend, tooltip, zoom, unitsOverrides, coloring, thresholds, colorModeType.
Visualization tip: when you don't have a strong reason to pick a specific visualization, set visualizationSettings.autoSelectVisualization: true and omit state.visualization — Dynatrace picks a sensible default for the query result.
Related skills
FAQ
What does dt-app-notebooks do?
Work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON including sections, DQL queries, and visualizations.
When should I use dt-app-notebooks?
Work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON including sections, DQL queries, and visualizations.
What are common prerequisites?
--- name: dt-app-notebooks description: Work with Dynatrace notebooks - create, modify, query, and analyze notebook JSON including sections, DQL queries, and visualizations.
Is Dt App Notebooks safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.