
Dt App Notebooks
Bootstrap Dynatrace notebook sections with DQL for logs tables and host CPU timeseries without hand-authoring dashboard JSON from scratch.
Overview
dt-app-notebooks is an agent skill for the Operate phase that provides a Dynatrace notebook JSON skeleton with DQL log and host CPU visualization sections.
Install
npx skills add https://github.com/dynatrace/dynatrace-for-ai --skill dt-app-notebooksWhat is this skill?
- Notebook JSON (version 7) with default timeframe now()-2h to now()
- DQL section: fetch logs with summarize count() by loglevel, bucket, and smartscape host
- Second DQL section: timeseries avg(dt.host.cpu...) for chart visualization
- Per-section query limits: up to 1000 records, sampling and scan limits configurable
- Davis integration flags for log-inclusive analysis where available
- Notebook schema version 7
- Default query maxResultRecords 1000 with defaultScanLimitGbytes 500
- Default timeframe last 2 hours (now()-2h to now())
Adoption & trust: 688 installs on skills.sh; 87 GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need a Dynatrace notebook fast but do not want to reverse-engineer section IDs, DQL state, and visualization settings by trial and error.
Who is it for?
Indie operators already on Dynatrace who want agent help editing notebook JSON and DQL for logs and host metrics.
Skip if: Builders without Dynatrace, greenfield frontend work, or teams that only need Next.js or generative media tooling.
When should I use this skill?
Authoring or extending Dynatrace app notebooks with DQL table and chart sections for logs and infrastructure metrics.
What do I get? / Deliverables
You get an import-ready notebook structure with two DQL panels you can edit for your services, then iterate alerts and dashboards from that baseline.
- Notebook JSON with configurable DQL sections and visualization state
- Adapted queries for service-specific drilldowns
Recommended Skills
Journey fit
Operate is the natural home because the artifact is live observability—log summarization and infrastructure metrics over a default two-hour window. Monitoring subphase matches DQL log fetch, summarize by log level and host, and timeseries CPU visualization patterns in the notebook template.
How it compares
Notebook template skill for Dynatrace DQL—not an MCP telemetry server or a generic Grafana dashboard generator.
Common Questions / FAQ
Who is dt-app-notebooks for?
Solo builders and small teams using AI coding agents to maintain Dynatrace observability notebooks after shipping SaaS or API workloads.
When should I use dt-app-notebooks?
In Operate monitoring when standing up log volume tables and CPU timeseries views, or after Grow analytics when you need deeper infra correlation in Dynatrace.
Is dt-app-notebooks safe to install?
The skill content is configuration JSON; risk depends on the parent repo. Check the Security Audits panel on this Prism page and validate DQL cost limits before running in production tenants.
SKILL.md
READMESKILL.md - Dt App Notebooks
{ "version": "7", "defaultTimeframe": { "from": "now()-2h", "to": "now()" }, "defaultSegments": [], "sections": [ { "id": "01536f9b-e20b-41aa-b546-f288ec054f4d", "type": "dql", "title": "Table Visualization Section ", "showTitle": false, "drilldownPath": [], "filterSegments": [], "previousFilterSegments": [], "state": { "input": { "timeframe": { "from": "now()-2h", "to": "now()" }, "value": "fetch logs \n| summarize count(), by:{loglevel, dt.system.bucket, dt.smartscape.host}" }, "visualizationSettings": { "chartSettings": {} }, "querySettings": { "maxResultRecords": 1000, "defaultScanLimitGbytes": 500, "maxResultMegaBytes": 1, "defaultSamplingRatio": 10, "enableSampling": false }, "davis": { "includeLogs": true, "davisVisualization": { "isAvailable": true } } } }, { "id": "1a282acd-4508-47da-af98-1540a2f5a6a3", "type": "dql", "title": "Chart Visualization Section", "showTitle": false, "drilldownPath": [], "filterSegments": [], "previousFilterSegments": [], "state": { "input": { "timeframe": { "from": "now()-2h", "to": "now()" }, "value": "timeseries avg(dt.host.cpu.idle), by:{dt.smartscape.host}" }, "visualizationSettings": { "chartSettings": {} }, "querySettings": { "maxResultRecords": 1000, "defaultScanLimitGbytes": 500, "maxResultMegaBytes": 1, "defaultSamplingRatio": 10, "enableSampling": false }, "davis": { "includeLogs": true, "davisVisualization": { "isAvailable": true } } } } ] } #!/usr/bin/env bash set -euo pipefail usage() { cat <<EOF Usage: $0 [--dry-run] <notebook.json> Options: --dry-run Validate and preview apply without persisting changes -h, --help Show this help message EOF } DRY_RUN=false INPUT="" while [[ $# -gt 0 ]]; do case "$1" in --dry-run) DRY_RUN=true shift ;; -h|--help) usage exit 0 ;; -*) echo "Error: Unknown option: $1" >&2 usage >&2 exit 1 ;; *) if [[ -n "$INPUT" ]]; then echo "Error: Multiple input files provided" >&2 usage >&2 exit 1 fi INPUT="$1" shift ;; esac done [[ -z "$INPUT" ]] && { usage >&2; exit 1; } # ── Input guards ───────────────────────────────────────────────── [[ -f "$INPUT" ]] || { echo "Error: File not found: $INPUT" >&2; exit 1; } jq empty "$INPUT" 2>/dev/null || { echo "Error: File is not valid JSON: $INPUT" >&2; exit 1; } # ── Validate ───────────────────────────────────────────────────── SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" EXECUTOR="$SCRIPT_DIR/notebook-validator.js" VALIDATION_OUTPUT=$(cat "$INPUT" | jq '{notebook: .}' \ | dtctl exec function -f "$EXECUTOR" --data - --plain \ | jq -r .result) || { echo "Validation failed. Deployment aborted." >&2 exit 1 } echo "$VALIDATION_OUTPUT" >&2 echo "$VALIDATION_OUTPUT" | grep -q "VALIDATION SUCCEEDED" || { echo "Validation failed. Deployment aborted." >&2 exit 1 } # ── Deploy ─────────────────────────────────────────────────────── APPLY_ARGS=(-f "$INPUT" -o yaml --plain) if [[ "$DRY_RUN" == "true" ]]; then APPLY_ARGS+=(--dry-run) fi APPLY_OUTPUT=$(dtctl apply "${APPLY_ARGS[@]}" 2>&1) || { echo "$APPLY_OUTPUT" >&2 exit 1 } echo "$APPLY_OUTPUT" if [[ "$DRY_RUN" == "false" ]]; then rm -- "$INPUT" echo "Notebook deployed successfully. The local file has been deleted. To make further changes, download the deployed notebook first: dtctl get notebook <id> -o json --pl