dt-app-dashboards — Claude Code skill: what it does, how to install
Works with Dynatrace dashboards as JSON documents: creates layouts, adds DQL tiles, configures variables, and deploys via dtctl.
npx skills add Dynatrace/dynatrace-for-ai --skill dt-app-dashboards -a claude-codeWhat dt-app-dashboards does
This skill guides AI agents through modifying Dynatrace dashboard JSON files stored in the Document Store. It structures the grid layout, sets up markdown and data tiles, and wires DQL queries to specific visualization types like charts, tables, or single-value gauges.
Reading a dashboard requires dtctl get dashboard <id> -o json because describe returns metadata only. During updates, you must fetch and edit the existing dashboard.json before running dtctl apply. Rebuilding the JSON from scratch silently destroys any layout or query changes teammates made directly in the Dynatrace UI.
What it helps with
- generate valid Dynatrace dashboard JSON with DQL tiles and grid positioning
- update existing dashboards via
dtctl applywithout overwriting UI changes - configure single-select and multi-select dashboard variables for DQL queries
- inspect dashboard structure and layout properties via
dtctl get
Example prompts for the agent
- Fetch dashboard
<id>with dtctl, add a categoricalBarChart tile, and validate the DQL query - Create a Dynatrace dashboard JSON file with a Service variable and a full-width lineChart
- Validate the DQL queries before updating
dashboard.jsonand deploy via dtctl
How to install dt-app-dashboards
1Skills CLI (Vercel)
npx skills add Dynatrace/dynatrace-for-ai --skill dt-app-dashboards -a claude-code2Manually: put the files in place
~/.claude/skills/dt-app-dashboards/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/dt-app-dashboards/
1Skills CLI (Vercel)
npx skills add Dynatrace/dynatrace-for-ai --skill dt-app-dashboards -a codex2Manually: put the files in place
.agents/skills/dt-app-dashboards/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add Dynatrace/dynatrace-for-ai --skill dt-app-dashboards -a cursor2Manually: put the files in place
.cursor/skills/dt-app-dashboards/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install Dynatrace/dynatrace-for-ai dt-app-dashboards2Manually: put the files in place
.github/skills/dt-app-dashboards/SKILL.md1Skills CLI (Vercel)
npx skills add Dynatrace/dynatrace-for-ai --skill dt-app-dashboards -a gemini-cli2Platform CLI
gemini skills install https://github.com/Dynatrace/dynatrace-for-ai --path skills/dt-app-dashboardsManually: put the files in place
.devin/skills/dt-app-dashboards/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add Dynatrace/dynatrace-for-ai --skill dt-app-dashboards -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about dt-app-dashboards
How to install dt-app-dashboards in Claude Code?
Run npx skills add Dynatrace/dynatrace-for-ai --skill dt-app-dashboards -a claude-code in your terminal.
What does dt-app-dashboards do?
It provides workflow rules for AI coding assistants to generate, inspect, and update Dynatrace dashboards using dtctl and valid DQL.
Why must updates start with dtctl get dashboard <id> -o json?
Creating the JSON from scratch or manually injecting an ID silently overwrites changes made in the Dynatrace web UI. Fetching the live JSON first prevents data loss.
Source text
SKILL.md · Apache-2.0
---
name: dt-app-dashboards
description: Work with Dynatrace dashboards - create, modify, query, and analyze dashboard JSON including tiles, layouts, DQL queries, variables, and visualizations.
license: Apache-2.0
---
# Dynatrace Dashboard Skill
## Overview
Dynatrace dashboards are JSON documents stored in the Document Store containing
tiles (content/visualizations), layouts (grid positioning), and variables
(dynamic query parameters).
**When to use:** Creating, modifying, querying, or analyzing dashboards.
## Dashboard JSON Structure
```json
{
"name": "My Dashboard",
"type": "dashboard",
"content": {
"version": 21,
"variables": [],
"tiles": { "<id>": { "type": "data|markdown", ... } },
"layouts": { "<id>": { "x": 0, "y": 0, "w": 24, "h": 8 } }
}
}
```
- Tile IDs in `tiles` must match IDs in `layouts`
- Grid is 24 units wide. Common widths: 24 (full), 12 (half), 6 (quarter)
- Two tile types: `markdown` (text content) and `data` (DQL query + visualization)
**Optional content properties:** `settings`, `refreshRate`, `annotations`
## Reading & Analyzing
Fetch full content with `dtctl get dashboard <id> -o json` (`describe` returns metadata only), then inspect the JSON to discover its available properties. Carefully read [references/analyzing.md](references/analyzing.md) before analyzing.
## Create/Update Workflow (Mandatory Order)
Carefully follow the workflow described in [references/create-update.md](references/create-update.md).
**Key rules:**
- Load domain skills BEFORE generating queries — do not invent DQL
- Validate ALL queries before adding to dashboard
- No time-range filters in queries unless explicitly requested by user
- Set `name` before deploying
- **Updating — ALWAYS read the current state first:** `dtctl get dashboard <id> -o json`, save it as `dashboard.json`, modify that file, then deploy it. Never reconstruct JSON from scratch or inject an `id` manually — both silently overwrite any UI edits the user made since last deployment.
- **Deploy with `dtctl apply`** — validation runs automatically. If it fails, fix **all** reported errors before re-applying.
## Visualization Types
- **Time-series** (require `timeseries`/`makeTimeseries`): `lineChart`, `areaChart`, `barChart`, `bandChart`
- **Categorical** (`summarize ... by:{field}`): `categoricalBarChart`, `pieChart`, `donutChart`
- **Single value/gauge** (single numeric record): `singleValue`, `meterBar`, `gauge`
- **Tabular** (any data shape): `table`, `raw`, `recordList`
- **Distribution/status**: `histogram`, `honeycomb`
- **Maps**: `choroplethMap`, `dotMap`, `connectionMap`, `bubbleMap`
- **Matrix**: `heatmap`, `scatterplot`
Required field types per visualization: [references/tiles.md](references/tiles.md)
## Variables Quick Reference
```json
{ "version": 2, "key": "Service", "type": "query", "visible": true,
"editable": true, "input": "smartscapeNodes SERVICE | fields name",
"multiple": false }
```
- **Single-select:** `filter service.name == $Service`
- **Multi-select:** `filter in(service.name, array($Service))`
- Types: `query` (DQL-populated), `csv` (static list), `text` (free-form)
Full variable reference: [references/variables.md](references/variables.md)
## References
| File | When to Load |
|------|-------------|
| [create-update.md](references/create-update.md) | Creating/updating dashboards |
| [tiles.md](references/tiles.md) | Tile types, visualization field requirements, settings |
| [variables.md](references/variables.md) | Variable types, replacement strategies, patterns |
| [analyzing.md](references/analyzing.md) | Reading dashboards, extracting queries, health assessment |
© Dynatrace · Apache-2.0 · Dynatrace/dynatrace-for-ai