[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-axiom-building-dashboards":3,"mdc-r5enjn-key":34,"related-repo-axiom-building-dashboards":3701,"related-org-axiom-building-dashboards":3801},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":30,"sourceUrl":32,"mdContent":33},"building-dashboards","build Axiom dashboards via API","Designs and builds Axiom dashboards via API. Covers chart types, APL and metrics\u002FMPL query patterns, SmartFilters, layout, and configuration options. Use when creating dashboards, migrating from Splunk, or configuring chart options.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"axiom","Axiom","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Faxiom.png","axiomhq",[13,17,20,21],{"name":14,"slug":15,"type":16},"Observability","observability","tag",{"name":18,"slug":19,"type":16},"Dashboards","dashboards",{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},"APL","apl",11,"https:\u002F\u002Fgithub.com\u002Faxiomhq\u002Fskills","2026-04-06T18:04:23.452912",null,1,[],{"repoUrl":25,"stars":24,"forks":28,"topics":31,"description":27},[],"https:\u002F\u002Fgithub.com\u002Faxiomhq\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fbuilding-dashboards","---\nname: building-dashboards\ndescription: Designs and builds Axiom dashboards via API. Covers chart types, APL and metrics\u002FMPL query patterns, SmartFilters, layout, and configuration options. Use when creating dashboards, migrating from Splunk, or configuring chart options.\n---\n\n# Building Dashboards\n\n## Philosophy\n\n1. **Decisions first.** Every panel answers a question that leads to an action.\n2. **Overview → drilldown → evidence.** Start broad, narrow on click\u002Ffilter, end with raw logs.\n3. **Rates and percentiles over averages.** Averages hide problems; p95\u002Fp99 expose them.\n4. **Simple beats dense.** One question per panel. No chart junk.\n5. **Validate with data.** Never guess fields—discover schema first.\n6. **Compute what's asked, or defer.** If a panel can't be computed, replace it with a `Note` documenting the blocker. Never substitute a different quantity, even disclosed. See [Compute or Defer](#compute-or-defer).\n\n---\n\n## Entry Points\n\n| Starting from | Workflow |\n|---------------|----------|\n| **Vague description** | Intake → check dataset kind → design blueprint (APL or MPL) → queries per panel → deploy |\n| **Template** | Pick template → customize dataset\u002Fservice\u002Fenv → deploy |\n| **Splunk dashboard** | Extract SPL → translate via spl-to-apl → map to chart types → deploy |\n| **Grafana dashboard** | Project canonical panel spec (`expr`, `legendFormat`, `unit`, `title`, `description`) → translate PromQL → map chart types → deploy. See [reference\u002Fgrafana-migration.md](.\u002Freference\u002Fgrafana-migration.md). |\n| **Exploration** | Use axiom-sre to discover schema\u002Fsignals → productize into panels |\n\n---\n\n## Intake: What to Ask First\n\n1. **Audience & decision**\n   - Oncall triage? (fast refresh, error-focused)\n   - Team health? (daily trends, SLO tracking)\n   - Exec reporting? (weekly summaries, high-level)\n\n2. **Scope**\n   - Service, environment, region, cluster, endpoint?\n   - Single service or cross-service view?\n\n3. **Dataset kind.** Run `scripts\u002Fmetrics\u002Fdatasets \u003Cdeploy>` and check `kind`.\n   - `otel:metrics:v1` → metrics dataset, follow the **Metrics path**.\n   - anything else → events\u002Flogs dataset, follow the **APL path**.\n\n   > **Never run `getschema` on a metrics dataset.** It returns 0 rows without error.\n\n   **APL path:** discover fields with `['dataset'] | where _time between (ago(1h) .. now()) | getschema`. Continue to steps 4–5.\n\n   **Metrics path:**\n   - `scripts\u002Fmetrics\u002Fmetrics-spec \u003Cdeploy> \u003Cdataset>` — required before any MPL query.\n   - `scripts\u002Fmetrics\u002Fmetrics-info \u003Cdeploy> \u003Cdataset> metrics | tags | tags \u003Ctag> values` for discovery.\n   - If discovery is empty, retry with `--start` 7 days ago (sparse metrics).\n   - `find-metrics \u003Cvalue>` searches tag *values*, not metric names — use it only with a known entity name.\n   - Skip to the **Metrics\u002FMPL Blueprint**.\n\n4. **Golden signals** (APL path)\n   - Traffic: requests\u002Fsec, events\u002Fmin\n   - Errors: error rate, 5xx count\n   - Latency: p50, p95, p99 duration\n   - Saturation: CPU, memory, queue depth, connections\n\n5. **Drilldown dimensions** (APL path)\n   - What do users filter\u002Fgroup by? (service, route, status, pod, customer_id)\n\n---\n\n## Dashboard Blueprint\n\nPick the blueprint matching the dataset kind.\n\n### APL Blueprint (events\u002Flogs datasets)\n\n#### 1. At-a-Glance (Statistic panels)\nSingle numbers that answer \"is it broken right now?\"\n- Error rate (last 5m)\n- p95 latency (last 5m)\n- Request rate (last 5m)\n- Active alerts (if applicable)\n\n#### 2. Trends (TimeSeries panels)\nTime-based patterns that answer \"what changed?\"\n- Traffic over time\n- Error rate over time\n- Latency percentiles over time\n- Stacked by status\u002Fservice for comparison\n\n#### 3. Breakdowns (Table\u002FPie panels)\nTop-N analysis that answers \"where should I look?\"\n- Top 10 failing routes\n- Top 10 error messages\n- Worst pods by error rate\n- Request distribution by status\n\n#### 4. Evidence (LogStream + SmartFilter)\nRaw events that answer \"what exactly happened?\"\n- LogStream filtered to errors\n- SmartFilter for service\u002Fenv\u002Froute\n- Key fields projected for readability\n\n### Metrics\u002FMPL Blueprint (metrics datasets)\n\nUse `align to $__interval using …` for bucketing — `$__interval` is supplied by the dashboard runtime. Hard-coded windows over- or under-resolve. Validate every pipeline with `scripts\u002Fmetrics\u002Fmpl-validate-chart`; both it and `chart-add --mpl` reject inline time ranges (`[1h..]`).\n\nException: for sparse metrics where `$__interval` rounds to empty buckets, a fixed wider window (e.g. `1h`) is acceptable; document why on the chart.\n\n#### 1. At-a-Glance (Statistic panels)\nCurrent values — \"what's the state right now?\"\n- Use `group using avg` (gauges) or `group using last` (counters).\n- Read the metric's `unit` via `metrics-info … metrics \u003Cm> info` and pass it to `chart-add --unit`. Ratio metrics (0–1) need `| map * 100` in MPL before `--unit \"%\"`.\n\n#### 2. Trends (TimeSeries panels)\nTrends over time — \"what changed?\"\n- `align to $__interval using avg|sum|last`.\n- Group by low-cardinality tags only (≤10 series per chart).\n- Embed the unit in `--name` (`\"P95 Latency (ms)\"`, `\"Memory (MiB)\"`); scale magnitudes in MPL (`| map \u002F 1048576` for bytes → MiB).\n\n#### 3. Breakdowns (TimeSeries or Table panels)\nPer-entity detail — \"where should I look?\"\n- Metrics broken down by entity (host, pod, service).\n- Filter to keep series count manageable.\n- One dimension per panel; don't overload a single chart.\n\n#### 4. Entity State (TimeSeries or Table panels)\nBoolean\u002Fstate metrics — answer \"what is on\u002Foff\u002Factive?\"\n- Use `align to $__interval using last`.\n- Sparse state metrics may need a fixed wider interval (1h+).\n\n---\n\n## Required Chart Structure\n\nEach chart needs a unique kebab-case `id` (`error-rate`, `p95-latency`); every layout `i` must match one. Pass the same id to `chart-add --id` and `layout-pack \u003Cid>:…`. `dashboard-assemble` cross-checks before emit.\n\n---\n\n## Chart Unit Configuration\n\nPass a friendly unit string to `chart-add --unit` (`\"%\"`, `\"s\"`, `\"ms\"`, `\"B\"`, `\"req\u002Fs\"`). The script picks `unit` enum + `customUnits` suffix per chart type. `customUnits` is a label, not a formatter — scale magnitudes in MPL (`| map \u002F 1048576` for bytes → MiB, `| map \u002F 1000000` for bytes → MB, `| map * 100` for 0–1 ratio → percent). For metrics charts, read the source unit from `metrics-info … metrics \u003Cm> info` and pass it through. Internals (advanced options the agent may merge with `jq`): [reference\u002Fchart-config.md](.\u002Freference\u002Fchart-config.md).\n\n---\n\n## Compute or Defer\n\nEach panel either computes the requested quantity, or it's replaced by a `Note` documenting the blocker. Substituting a different quantity is never acceptable — disclaimers don't reach whoever acts on the number.\n\nDefer template (use `chart-add --type Note`):\n\n```\n**Deferred — blocked by:** \u003Cone-line reason>.\n\n**Original spec:** \u003Cwhat the panel should compute, dimensions, unit>.\n\n**To unblock:** \u003Cpointer to the fix>.\n```\n\nCommon blockers: MPL parser limits, missing tag with no reverse-tag equivalent, missing metric with no OTel rename match. Full rationale: [reference\u002Fdesign-playbook.md § Substituting a Different Quantity](.\u002Freference\u002Fdesign-playbook.md#substituting-a-different-quantity-for-the-asked-one).\n\n---\n\n## Chart Types\n\n| Type          | When                                                | Key constraint                                                       |\n|---------------|-----------------------------------------------------|----------------------------------------------------------------------|\n| Statistic     | Single KPI, current value                           | Query must return one row.                                           |\n| TimeSeries    | Trends over time, percentile overlays               | `bin_auto(_time)`; `percentiles_array()` for multi-percentile.       |\n| Table         | Top-N lists, breakdowns                             | Bound with `top N`; control columns via `project`.                   |\n| Pie           | Share-of-total for ≤6 categories                    | Aggregate to ≤6 slices; never high-cardinality.                      |\n| LogStream     | Raw event inspection                                | `take 100–500`; `project-keep` to relevant fields; filter hard.      |\n| Heatmap       | Distribution \u002F latency density                      | `summarize histogram(field, buckets) by bin_auto(_time)`.            |\n| Scatter Plot  | Correlate two metrics per group                     | `summarize avg(x), avg(y) by group`.                                 |\n| SmartFilter   | Interactive filter bar                              | Each panel query needs `declare query_parameters`. See `reference\u002Fsmartfilter.md`. |\n| Monitor List  | Monitor status display                              | No APL — select monitors in UI.                                      |\n| Note          | Markdown context, headers, runbook links            | `chart-add --type Note --text \"\u003Cmd>\"`.                               |\n\nPer-type APL recipes: `reference\u002Fchart-cookbook.md`.\n\n---\n\n## Chart Configuration\n\n`chart-add` covers the common path (type, id, name, query, dataset, unit, sparkline). For options it doesn't expose — `aggChartOpts` variants on TimeSeries, `tableSettings.columns` on Table\u002FLogStream, `hideHeader`, etc. — start from a `chart-add` output and merge the extra fields with `jq`. See `reference\u002Fchart-config.md` for the full option set, and the rejected-field list before merging anything bespoke.\n\n---\n\n## APL Patterns\n\n### Time Filtering\n\nDashboard chart queries inherit time from the picker — omit `_time` filters. Ad-hoc queries (Axiom Query tab, `axiom-sre`) need an explicit `where _time between (ago(1h) .. now())`.\n\n### Bin Size Selection\n\nUse `bin_auto(_time)` — it adjusts to the dashboard time window. Manual `bin(_time, …)` is only justified for non-standard cases (e.g. matching an upstream batch interval); document why.\n\n### Cardinality Guardrails\n\nBound `summarize … by …` with `top N` or a filter. Unbounded grouping on high-cardinality fields (`user_id`, `trace_id`) blows up.\n\n```apl\n| summarize count() by route | top 10 by count_   \u002F\u002F bounded\n| summarize count() by user_id                    \u002F\u002F unbounded — avoid\n```\n\n### Field Escaping\nFields with dots need bracket notation:\n\n```apl\n| where ['kubernetes.pod.name'] == \"frontend\"\n```\n\nFields with dots IN the name (not hierarchy) need escaping:\n\n```apl\n| where ['kubernetes.labels.app\\\\.kubernetes\\\\.io\u002Fname'] == \"frontend\"\n```\n\n### Recipes\n\nTraffic, error-rate, latency-percentile, and other golden-signal APL recipes: `reference\u002Fchart-cookbook.md`.\n\n---\n\n## Layout Composition\n\n`layout-pack` packs charts row-major into the 12-column grid using per-type defaults (Statistic 3×3, TimeSeries 6×4, Table 6×5, LogStream 12×6, Note 12×2). Override with `id:WxH` when needed. Section blueprints: `reference\u002Flayout-recipes.md`. Naming and panel-ordering conventions: `reference\u002Fdesign-playbook.md`.\n\n---\n\n## Dashboard Settings\n\n### Refresh Rate\n\n`dashboard-assemble --refresh oncall|team|exec` (60\u002F300\u002F900s) or pass an explicit integer (≥60). Short refresh + long time range = expensive queries; pick the longer end for exec\u002Fweekly boards.\n\n### Sharing\n\nAPI tokens create shared dashboards only (`owner: \"X-AXIOM-EVERYONE\"`); private dashboards aren't supported. Per-user data visibility is still enforced by dataset permissions.\n\n### URL Time Range Parameters\n\n`?t_qr=24h` (quick range), `?t_ts=...&t_te=...` (custom), `?t_against=-1d` (comparison)\n\n---\n\n## Setup\n\nTools, prerequisites, and `~\u002F.axiom.toml` configuration: see `README.md`. Verify with `scripts\u002Fsetup`.\n\n---\n\n## Deployment\n\n### Scripts\n\n| Script | Usage |\n|--------|-------|\n| `scripts\u002Fchart-add --type \u003CT> --id \u003Cid> --name \u003Cn> [--apl \u003Cq> \\| --mpl \u003Cq> --dataset \u003Cd>] [--unit \u003Cu>]` | **Emit a single chart JSON** to stdout. Splits APL vs MPL; MPL queries are checked for inline time ranges; unit fields applied per chart type. |\n| `scripts\u002Flayout-pack \u003Cid>:\u003CType\\|WxH> ...` | **Emit a layout JSON array** to stdout. Row-major into a 12-column grid; type names map to default sizes. |\n| `scripts\u002Fdashboard-assemble --name … --datasets … --layout F.json [opts] CHART_FILES…` | **Compose a complete dashboard JSON** from chart files + layout. Owns the envelope (`owner`, `schemaVersion`, `qr-` prefix, `refreshTime` validation, id cross-checks). |\n| `scripts\u002Fdashboard-list \u003Cdeploy>` | List all dashboards |\n| `scripts\u002Fdashboard-get \u003Cdeploy> \u003Cid>` | Fetch dashboard JSON |\n| `scripts\u002Fdashboard-validate \u003Cfile>` | Validate JSON structure |\n| `scripts\u002Fdashboard-create \u003Cdeploy> \u003Cfile>` | Create dashboard |\n| `scripts\u002Fdashboard-update \u003Cdeploy> \u003Cid> \u003Cfile>` | Update (needs version) |\n| `scripts\u002Fdashboard-chart-patch \u003Cdeploy> \u003Cid> \u003Cchart-id> \u003Cpatch-file> (--version \u003Cversion> \\| --overwrite)` | Patch one chart |\n| `scripts\u002Fdashboard-copy \u003Cdeploy> \u003Cid>` | Clone dashboard |\n| `scripts\u002Fdashboard-link \u003Cdeploy> \u003Cid>` | Get shareable URL |\n| `scripts\u002Fdashboard-delete \u003Cdeploy> \u003Cid>` | Delete (with confirm) |\n| `scripts\u002Faxiom-api \u003Cdeploy> \u003Cmethod> \u003Cpath>` | **Dashboard\u002Fapp API only** (rewrites to `app.*`). For data\u002Fmetrics endpoints use `scripts\u002Fmetrics\u002Faxiom-api` |\n| `scripts\u002Fmetrics\u002Faxiom-api \u003Cdeploy> \u003Cmethod> \u003Cpath>` | **Data\u002Fmetrics API** (supports `AXIOM_URL_OVERRIDE` for edge routing) |\n| `scripts\u002Fmetrics\u002Fdatasets \u003Cdeploy>` | List datasets with `kind` and edge deployment |\n| `scripts\u002Fmetrics\u002Fmetrics-spec \u003Cdeploy> \u003Cdataset>` | Fetch MPL query specification |\n| `scripts\u002Fmetrics\u002Fmetrics-info \u003Cdeploy> \u003Cdataset> ...` | Discover metrics, tags, and values |\n| `scripts\u002Fmetrics\u002Fmetrics-query \u003Cdeploy> \u003Cmpl> \u003Cstart> \u003Cend>` | Execute a metrics query (raw — no `$__interval` injection) |\n| `scripts\u002Fmetrics\u002Fmpl-validate-chart \u003Cdeploy> '\u003CMPL>' [start] [end] [--interval D]` | **Validate a chart MPL pipeline.** Auto-injects `param $__interval: Duration;` and `-p __interval=…`; rejects inline time ranges. Use this in place of raw `metrics-query` when authoring chart queries. |\n\n> The two `axiom-api` scripts are not interchangeable. `scripts\u002Faxiom-api` is for the dashboard app API; `scripts\u002Fmetrics\u002Faxiom-api` is for data\u002Fmetrics endpoints and edge routing. Wrong one → 404.\n\n### Targeted Chart Updates\n\nUse `scripts\u002Fdashboard-chart-patch` when changing one existing chart and the dashboard layout, metadata, and other charts should remain untouched. It calls `PATCH \u002Fv2\u002Fdashboards\u002Fuid\u002F{uid}\u002Fcharts\u002F{chartId}` with a JSON Merge Patch under the `chart` request field.\n\nPatch files contain only the chart fields to change:\n\n```json\n{\n  \"name\": \"Error Rate (5m)\",\n  \"query\": { \"apl\": \"['logs'] | summarize errors=countif(status >= 500)\" },\n  \"config\": { \"stale\": null }\n}\n```\n\n`null` removes an existing field. Nested objects merge recursively. If `id` is present in the patch, it must match the `\u003Cchart-id>` path argument. The server validates the resulting full dashboard before saving.\n\nUse `--version \u003Cversion>` for optimistic concurrency after fetching the dashboard with `dashboard-get`. Use `--overwrite` only when last-write-wins behavior is intended. Continue using `dashboard-update` for layout changes, multi-chart edits, dashboard metadata, owner, refresh interval, or time window updates.\n\n### Workflow\n\n`chart-add`, `layout-pack`, and `dashboard-assemble` own the JSON shape. Each chart lives in its own temp file; nothing chart-shaped re-enters the agent's context.\n\n1. Discover schema (`axiom-sre` \u002F `getschema` for events; `metrics-spec` + `metrics-info` for metrics).\n2. Write each panel query. Validate APL via `axiom-sre` with an explicit time filter; validate MPL via `scripts\u002Fmetrics\u002Fmpl-validate-chart`.\n3. `chart-add --type … --apl '\u003CAPL>'` *or* `chart-add --type … --mpl '\u003CMPL>' --dataset \u003Cname>` per chart, redirected to its own file.\n4. `layout-pack \u003Cid>:\u003CType|WxH> …` for the layout (ids in display order).\n5. `dashboard-assemble --name … --datasets … --layout LAYOUT CHART_FILES…` to compose.\n6. `dashboard-validate` then `dashboard-create` (or `dashboard-update`).\n7. `dashboard-link` for the URL — never hand-construct.\n\n---\n\n## Sibling Skill Integration\n\n- **spl-to-apl** — Splunk SPL → APL (`timechart` → TimeSeries, `stats` → Statistic\u002FTable). See `reference\u002Fsplunk-migration.md`.\n- **axiom-sre** — schema discovery via `getschema`, baseline exploration.\n- **query-metrics** — metrics dataset\u002Ftag\u002Fvalue discovery; same scripts vendored under `scripts\u002Fmetrics\u002F`.\n\n---\n\n## Templates\n\nCompose with `chart-add` + `layout-pack` + `dashboard-assemble`. Pre-built templates remain under `reference\u002Ftemplates\u002F` (`blank.json`, `service-overview.json`, `service-overview-with-filters.json`, `api-health.json`) for legacy use; `dashboard-from-template` instantiates them but assumes specific field names (`service`, `status`, `route`, `duration_ms`) and needs sed-fixing. Prefer composition for new work.\n\n---\n\n## Common Pitfalls\n\n| Problem | Cause | Solution |\n|---------|-------|----------|\n| `getschema` returns 0 rows | Dataset is `otel:metrics:v1` | Use `scripts\u002Fmetrics\u002Fmetrics-info` for metrics discovery. |\n| Metrics discovery returns empty | Sparse metrics outside the 24h default window | Retry with `--start` 7 days ago. |\n| 404 from metrics API calls | Used `scripts\u002Faxiom-api` (dashboard) instead of `scripts\u002Fmetrics\u002Faxiom-api` | Use `scripts\u002Fmetrics\u002Faxiom-api` for `\u002Fv1\u002Fquery\u002F*`, `\u002Fv1\u002Fdatasets`. |\n| Statistic shows `1` instead of `100%` for a 0–1 ratio | `Percent` enum doesn't auto-multiply | `\\| map * 100` in MPL, then `chart-add --unit \"%\"`. |\n| OTel histogram chart shows nonsense | Histogram aligned as a scalar | Use `bucket … using interpolate_cumulative_histogram` (or `_delta` per `temporality`). See [promql-to-mpl.md § Histogram translation](.\u002Freference\u002Fpromql-to-mpl.md#histogram-translation-histogram_quantile--bucket--using-interpolate__histogram). |\n| Grafana migration filters\u002Fgroups on the wrong subset | Read `expr` without `description`, or vice versa | Project all five panel fields before authoring; see [reference\u002Fgrafana-migration.md](.\u002Freference\u002Fgrafana-migration.md). |\n| PromQL metric name not found | Skipped OTel rename rules | Drop `_total`, decompose histograms, normalise units; validate with `metrics-info`. Labels need reverse-tag discovery. See [grafana-migration.md § Name Mapping](.\u002Freference\u002Fgrafana-migration.md#name-mapping-promql--otel-ingest). |\n| MPL chart aggregates across a dimension PromQL filtered\u002Fgrouped on | Dropped a selector or `by(...)` during translation | Every `{label=…}` → `where`; every `by(…)` → `group by`. See [reference\u002Fpromql-to-mpl.md](.\u002Freference\u002Fpromql-to-mpl.md). |\n| Panel shipped a different quantity than asked | Substituted instead of deferring | Replace with a `Note` documenting the blocker. See [Compute or Defer](#compute-or-defer). |\n| 403 \"creating private dashboards\" | API tokens only create shared dashboards | Leave `owner` as `dashboard-assemble`'s default (`X-AXIOM-EVERYONE`). |\n\n---\n\n## Reference\n\n- `reference\u002Fchart-config.md` — All chart configuration options (JSON)\n- `reference\u002Fmetrics-mpl.md` — Metrics\u002FMPL chart contract and discovery scripts\n- `reference\u002Fsmartfilter.md` — SmartFilter\u002FFilterBar full configuration\n- `reference\u002Fchart-cookbook.md` — APL patterns per chart type\n- `reference\u002Flayout-recipes.md` — Grid layouts and section blueprints\n- `reference\u002Fsplunk-migration.md` — Splunk panel → Axiom mapping\n- `reference\u002Fgrafana-migration.md` — Grafana panel → Axiom mapping (canonical-spec projection, PromQL→MPL pointers, OTel rename rules)\n- `reference\u002Fpromql-to-mpl.md` — PromQL → MPL translation rules (selectors, groupings, rate, histograms, ratios, reverse-tag discovery)\n- `reference\u002Fdesign-playbook.md` — Decision-first design principles\n- `reference\u002Ftemplates\u002F` — Ready-to-use dashboard JSON files\n\nFor APL syntax: https:\u002F\u002Faxiom.co\u002Fdocs\u002Fapl\u002Fintroduction\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,47,54,138,142,148,300,303,309,584,587,593,598,605,612,617,640,646,651,674,680,685,708,714,719,737,743,788,808,813,818,884,889,894,948,954,959,977,983,988,1007,1010,1016,1075,1078,1084,1197,1200,1205,1217,1230,1242,1254,1257,1263,1541,1553,1556,1562,1617,1620,1626,1632,1660,1666,1685,1691,1726,1753,1759,1764,1778,1783,1797,1803,1814,1817,1823,1857,1860,1866,1872,1883,1889,1902,1908,1935,1938,1944,1972,1975,1981,1987,2449,2480,2486,2514,2519,2703,2729,2765,2770,2793,2932,2935,2941,3010,3013,3019,3116,3119,3125,3570,3573,3579,3683,3695],{"type":40,"tag":41,"props":42,"children":43},"element","h1",{"id":4},[44],{"type":45,"value":46},"text","Building Dashboards",{"type":40,"tag":48,"props":49,"children":51},"h2",{"id":50},"philosophy",[52],{"type":45,"value":53},"Philosophy",{"type":40,"tag":55,"props":56,"children":57},"ol",{},[58,70,80,90,100,110],{"type":40,"tag":59,"props":60,"children":61},"li",{},[62,68],{"type":40,"tag":63,"props":64,"children":65},"strong",{},[66],{"type":45,"value":67},"Decisions first.",{"type":45,"value":69}," Every panel answers a question that leads to an action.",{"type":40,"tag":59,"props":71,"children":72},{},[73,78],{"type":40,"tag":63,"props":74,"children":75},{},[76],{"type":45,"value":77},"Overview → drilldown → evidence.",{"type":45,"value":79}," Start broad, narrow on click\u002Ffilter, end with raw logs.",{"type":40,"tag":59,"props":81,"children":82},{},[83,88],{"type":40,"tag":63,"props":84,"children":85},{},[86],{"type":45,"value":87},"Rates and percentiles over averages.",{"type":45,"value":89}," Averages hide problems; p95\u002Fp99 expose them.",{"type":40,"tag":59,"props":91,"children":92},{},[93,98],{"type":40,"tag":63,"props":94,"children":95},{},[96],{"type":45,"value":97},"Simple beats dense.",{"type":45,"value":99}," One question per panel. No chart junk.",{"type":40,"tag":59,"props":101,"children":102},{},[103,108],{"type":40,"tag":63,"props":104,"children":105},{},[106],{"type":45,"value":107},"Validate with data.",{"type":45,"value":109}," Never guess fields—discover schema first.",{"type":40,"tag":59,"props":111,"children":112},{},[113,118,120,127,129,136],{"type":40,"tag":63,"props":114,"children":115},{},[116],{"type":45,"value":117},"Compute what's asked, or defer.",{"type":45,"value":119}," If a panel can't be computed, replace it with a ",{"type":40,"tag":121,"props":122,"children":124},"code",{"className":123},[],[125],{"type":45,"value":126},"Note",{"type":45,"value":128}," documenting the blocker. Never substitute a different quantity, even disclosed. See ",{"type":40,"tag":130,"props":131,"children":133},"a",{"href":132},"#compute-or-defer",[134],{"type":45,"value":135},"Compute or Defer",{"type":45,"value":137},".",{"type":40,"tag":139,"props":140,"children":141},"hr",{},[],{"type":40,"tag":48,"props":143,"children":145},{"id":144},"entry-points",[146],{"type":45,"value":147},"Entry Points",{"type":40,"tag":149,"props":150,"children":151},"table",{},[152,171],{"type":40,"tag":153,"props":154,"children":155},"thead",{},[156],{"type":40,"tag":157,"props":158,"children":159},"tr",{},[160,166],{"type":40,"tag":161,"props":162,"children":163},"th",{},[164],{"type":45,"value":165},"Starting from",{"type":40,"tag":161,"props":167,"children":168},{},[169],{"type":45,"value":170},"Workflow",{"type":40,"tag":172,"props":173,"children":174},"tbody",{},[175,192,208,224,284],{"type":40,"tag":157,"props":176,"children":177},{},[178,187],{"type":40,"tag":179,"props":180,"children":181},"td",{},[182],{"type":40,"tag":63,"props":183,"children":184},{},[185],{"type":45,"value":186},"Vague description",{"type":40,"tag":179,"props":188,"children":189},{},[190],{"type":45,"value":191},"Intake → check dataset kind → design blueprint (APL or MPL) → queries per panel → deploy",{"type":40,"tag":157,"props":193,"children":194},{},[195,203],{"type":40,"tag":179,"props":196,"children":197},{},[198],{"type":40,"tag":63,"props":199,"children":200},{},[201],{"type":45,"value":202},"Template",{"type":40,"tag":179,"props":204,"children":205},{},[206],{"type":45,"value":207},"Pick template → customize dataset\u002Fservice\u002Fenv → deploy",{"type":40,"tag":157,"props":209,"children":210},{},[211,219],{"type":40,"tag":179,"props":212,"children":213},{},[214],{"type":40,"tag":63,"props":215,"children":216},{},[217],{"type":45,"value":218},"Splunk dashboard",{"type":40,"tag":179,"props":220,"children":221},{},[222],{"type":45,"value":223},"Extract SPL → translate via spl-to-apl → map to chart types → deploy",{"type":40,"tag":157,"props":225,"children":226},{},[227,235],{"type":40,"tag":179,"props":228,"children":229},{},[230],{"type":40,"tag":63,"props":231,"children":232},{},[233],{"type":45,"value":234},"Grafana dashboard",{"type":40,"tag":179,"props":236,"children":237},{},[238,240,246,248,254,255,261,262,268,269,275,277,283],{"type":45,"value":239},"Project canonical panel spec (",{"type":40,"tag":121,"props":241,"children":243},{"className":242},[],[244],{"type":45,"value":245},"expr",{"type":45,"value":247},", ",{"type":40,"tag":121,"props":249,"children":251},{"className":250},[],[252],{"type":45,"value":253},"legendFormat",{"type":45,"value":247},{"type":40,"tag":121,"props":256,"children":258},{"className":257},[],[259],{"type":45,"value":260},"unit",{"type":45,"value":247},{"type":40,"tag":121,"props":263,"children":265},{"className":264},[],[266],{"type":45,"value":267},"title",{"type":45,"value":247},{"type":40,"tag":121,"props":270,"children":272},{"className":271},[],[273],{"type":45,"value":274},"description",{"type":45,"value":276},") → translate PromQL → map chart types → deploy. See ",{"type":40,"tag":130,"props":278,"children":280},{"href":279},".\u002Freference\u002Fgrafana-migration.md",[281],{"type":45,"value":282},"reference\u002Fgrafana-migration.md",{"type":45,"value":137},{"type":40,"tag":157,"props":285,"children":286},{},[287,295],{"type":40,"tag":179,"props":288,"children":289},{},[290],{"type":40,"tag":63,"props":291,"children":292},{},[293],{"type":45,"value":294},"Exploration",{"type":40,"tag":179,"props":296,"children":297},{},[298],{"type":45,"value":299},"Use axiom-sre to discover schema\u002Fsignals → productize into panels",{"type":40,"tag":139,"props":301,"children":302},{},[],{"type":40,"tag":48,"props":304,"children":306},{"id":305},"intake-what-to-ask-first",[307],{"type":45,"value":308},"Intake: What to Ask First",{"type":40,"tag":55,"props":310,"children":311},{},[312,339,360,534,567],{"type":40,"tag":59,"props":313,"children":314},{},[315,320],{"type":40,"tag":63,"props":316,"children":317},{},[318],{"type":45,"value":319},"Audience & decision",{"type":40,"tag":321,"props":322,"children":323},"ul",{},[324,329,334],{"type":40,"tag":59,"props":325,"children":326},{},[327],{"type":45,"value":328},"Oncall triage? (fast refresh, error-focused)",{"type":40,"tag":59,"props":330,"children":331},{},[332],{"type":45,"value":333},"Team health? (daily trends, SLO tracking)",{"type":40,"tag":59,"props":335,"children":336},{},[337],{"type":45,"value":338},"Exec reporting? (weekly summaries, high-level)",{"type":40,"tag":59,"props":340,"children":341},{},[342,347],{"type":40,"tag":63,"props":343,"children":344},{},[345],{"type":45,"value":346},"Scope",{"type":40,"tag":321,"props":348,"children":349},{},[350,355],{"type":40,"tag":59,"props":351,"children":352},{},[353],{"type":45,"value":354},"Service, environment, region, cluster, endpoint?",{"type":40,"tag":59,"props":356,"children":357},{},[358],{"type":45,"value":359},"Single service or cross-service view?",{"type":40,"tag":59,"props":361,"children":362},{},[363,368,370,376,378,384,385,416,439,443,448,450,456,458,461,466],{"type":40,"tag":63,"props":364,"children":365},{},[366],{"type":45,"value":367},"Dataset kind.",{"type":45,"value":369}," Run ",{"type":40,"tag":121,"props":371,"children":373},{"className":372},[],[374],{"type":45,"value":375},"scripts\u002Fmetrics\u002Fdatasets \u003Cdeploy>",{"type":45,"value":377}," and check ",{"type":40,"tag":121,"props":379,"children":381},{"className":380},[],[382],{"type":45,"value":383},"kind",{"type":45,"value":137},{"type":40,"tag":321,"props":386,"children":387},{},[388,405],{"type":40,"tag":59,"props":389,"children":390},{},[391,397,399,404],{"type":40,"tag":121,"props":392,"children":394},{"className":393},[],[395],{"type":45,"value":396},"otel:metrics:v1",{"type":45,"value":398}," → metrics dataset, follow the ",{"type":40,"tag":63,"props":400,"children":401},{},[402],{"type":45,"value":403},"Metrics path",{"type":45,"value":137},{"type":40,"tag":59,"props":406,"children":407},{},[408,410,415],{"type":45,"value":409},"anything else → events\u002Flogs dataset, follow the ",{"type":40,"tag":63,"props":411,"children":412},{},[413],{"type":45,"value":414},"APL path",{"type":45,"value":137},{"type":40,"tag":417,"props":418,"children":419},"blockquote",{},[420],{"type":40,"tag":421,"props":422,"children":423},"p",{},[424,437],{"type":40,"tag":63,"props":425,"children":426},{},[427,429,435],{"type":45,"value":428},"Never run ",{"type":40,"tag":121,"props":430,"children":432},{"className":431},[],[433],{"type":45,"value":434},"getschema",{"type":45,"value":436}," on a metrics dataset.",{"type":45,"value":438}," It returns 0 rows without error.",{"type":40,"tag":440,"props":441,"children":442},"br",{},[],{"type":40,"tag":63,"props":444,"children":445},{},[446],{"type":45,"value":447},"APL path:",{"type":45,"value":449}," discover fields with ",{"type":40,"tag":121,"props":451,"children":453},{"className":452},[],[454],{"type":45,"value":455},"['dataset'] | where _time between (ago(1h) .. now()) | getschema",{"type":45,"value":457},". Continue to steps 4–5.",{"type":40,"tag":440,"props":459,"children":460},{},[],{"type":40,"tag":63,"props":462,"children":463},{},[464],{"type":45,"value":465},"Metrics path:",{"type":40,"tag":321,"props":467,"children":468},{},[469,480,491,504,523],{"type":40,"tag":59,"props":470,"children":471},{},[472,478],{"type":40,"tag":121,"props":473,"children":475},{"className":474},[],[476],{"type":45,"value":477},"scripts\u002Fmetrics\u002Fmetrics-spec \u003Cdeploy> \u003Cdataset>",{"type":45,"value":479}," — required before any MPL query.",{"type":40,"tag":59,"props":481,"children":482},{},[483,489],{"type":40,"tag":121,"props":484,"children":486},{"className":485},[],[487],{"type":45,"value":488},"scripts\u002Fmetrics\u002Fmetrics-info \u003Cdeploy> \u003Cdataset> metrics | tags | tags \u003Ctag> values",{"type":45,"value":490}," for discovery.",{"type":40,"tag":59,"props":492,"children":493},{},[494,496,502],{"type":45,"value":495},"If discovery is empty, retry with ",{"type":40,"tag":121,"props":497,"children":499},{"className":498},[],[500],{"type":45,"value":501},"--start",{"type":45,"value":503}," 7 days ago (sparse metrics).",{"type":40,"tag":59,"props":505,"children":506},{},[507,513,515,521],{"type":40,"tag":121,"props":508,"children":510},{"className":509},[],[511],{"type":45,"value":512},"find-metrics \u003Cvalue>",{"type":45,"value":514}," searches tag ",{"type":40,"tag":516,"props":517,"children":518},"em",{},[519],{"type":45,"value":520},"values",{"type":45,"value":522},", not metric names — use it only with a known entity name.",{"type":40,"tag":59,"props":524,"children":525},{},[526,528,533],{"type":45,"value":527},"Skip to the ",{"type":40,"tag":63,"props":529,"children":530},{},[531],{"type":45,"value":532},"Metrics\u002FMPL Blueprint",{"type":45,"value":137},{"type":40,"tag":59,"props":535,"children":536},{},[537,542,544],{"type":40,"tag":63,"props":538,"children":539},{},[540],{"type":45,"value":541},"Golden signals",{"type":45,"value":543}," (APL path)",{"type":40,"tag":321,"props":545,"children":546},{},[547,552,557,562],{"type":40,"tag":59,"props":548,"children":549},{},[550],{"type":45,"value":551},"Traffic: requests\u002Fsec, events\u002Fmin",{"type":40,"tag":59,"props":553,"children":554},{},[555],{"type":45,"value":556},"Errors: error rate, 5xx count",{"type":40,"tag":59,"props":558,"children":559},{},[560],{"type":45,"value":561},"Latency: p50, p95, p99 duration",{"type":40,"tag":59,"props":563,"children":564},{},[565],{"type":45,"value":566},"Saturation: CPU, memory, queue depth, connections",{"type":40,"tag":59,"props":568,"children":569},{},[570,575,576],{"type":40,"tag":63,"props":571,"children":572},{},[573],{"type":45,"value":574},"Drilldown dimensions",{"type":45,"value":543},{"type":40,"tag":321,"props":577,"children":578},{},[579],{"type":40,"tag":59,"props":580,"children":581},{},[582],{"type":45,"value":583},"What do users filter\u002Fgroup by? (service, route, status, pod, customer_id)",{"type":40,"tag":139,"props":585,"children":586},{},[],{"type":40,"tag":48,"props":588,"children":590},{"id":589},"dashboard-blueprint",[591],{"type":45,"value":592},"Dashboard Blueprint",{"type":40,"tag":421,"props":594,"children":595},{},[596],{"type":45,"value":597},"Pick the blueprint matching the dataset kind.",{"type":40,"tag":599,"props":600,"children":602},"h3",{"id":601},"apl-blueprint-eventslogs-datasets",[603],{"type":45,"value":604},"APL Blueprint (events\u002Flogs datasets)",{"type":40,"tag":606,"props":607,"children":609},"h4",{"id":608},"_1-at-a-glance-statistic-panels",[610],{"type":45,"value":611},"1. At-a-Glance (Statistic panels)",{"type":40,"tag":421,"props":613,"children":614},{},[615],{"type":45,"value":616},"Single numbers that answer \"is it broken right now?\"",{"type":40,"tag":321,"props":618,"children":619},{},[620,625,630,635],{"type":40,"tag":59,"props":621,"children":622},{},[623],{"type":45,"value":624},"Error rate (last 5m)",{"type":40,"tag":59,"props":626,"children":627},{},[628],{"type":45,"value":629},"p95 latency (last 5m)",{"type":40,"tag":59,"props":631,"children":632},{},[633],{"type":45,"value":634},"Request rate (last 5m)",{"type":40,"tag":59,"props":636,"children":637},{},[638],{"type":45,"value":639},"Active alerts (if applicable)",{"type":40,"tag":606,"props":641,"children":643},{"id":642},"_2-trends-timeseries-panels",[644],{"type":45,"value":645},"2. Trends (TimeSeries panels)",{"type":40,"tag":421,"props":647,"children":648},{},[649],{"type":45,"value":650},"Time-based patterns that answer \"what changed?\"",{"type":40,"tag":321,"props":652,"children":653},{},[654,659,664,669],{"type":40,"tag":59,"props":655,"children":656},{},[657],{"type":45,"value":658},"Traffic over time",{"type":40,"tag":59,"props":660,"children":661},{},[662],{"type":45,"value":663},"Error rate over time",{"type":40,"tag":59,"props":665,"children":666},{},[667],{"type":45,"value":668},"Latency percentiles over time",{"type":40,"tag":59,"props":670,"children":671},{},[672],{"type":45,"value":673},"Stacked by status\u002Fservice for comparison",{"type":40,"tag":606,"props":675,"children":677},{"id":676},"_3-breakdowns-tablepie-panels",[678],{"type":45,"value":679},"3. Breakdowns (Table\u002FPie panels)",{"type":40,"tag":421,"props":681,"children":682},{},[683],{"type":45,"value":684},"Top-N analysis that answers \"where should I look?\"",{"type":40,"tag":321,"props":686,"children":687},{},[688,693,698,703],{"type":40,"tag":59,"props":689,"children":690},{},[691],{"type":45,"value":692},"Top 10 failing routes",{"type":40,"tag":59,"props":694,"children":695},{},[696],{"type":45,"value":697},"Top 10 error messages",{"type":40,"tag":59,"props":699,"children":700},{},[701],{"type":45,"value":702},"Worst pods by error rate",{"type":40,"tag":59,"props":704,"children":705},{},[706],{"type":45,"value":707},"Request distribution by status",{"type":40,"tag":606,"props":709,"children":711},{"id":710},"_4-evidence-logstream-smartfilter",[712],{"type":45,"value":713},"4. Evidence (LogStream + SmartFilter)",{"type":40,"tag":421,"props":715,"children":716},{},[717],{"type":45,"value":718},"Raw events that answer \"what exactly happened?\"",{"type":40,"tag":321,"props":720,"children":721},{},[722,727,732],{"type":40,"tag":59,"props":723,"children":724},{},[725],{"type":45,"value":726},"LogStream filtered to errors",{"type":40,"tag":59,"props":728,"children":729},{},[730],{"type":45,"value":731},"SmartFilter for service\u002Fenv\u002Froute",{"type":40,"tag":59,"props":733,"children":734},{},[735],{"type":45,"value":736},"Key fields projected for readability",{"type":40,"tag":599,"props":738,"children":740},{"id":739},"metricsmpl-blueprint-metrics-datasets",[741],{"type":45,"value":742},"Metrics\u002FMPL Blueprint (metrics datasets)",{"type":40,"tag":421,"props":744,"children":745},{},[746,748,754,756,762,764,770,772,778,780,786],{"type":45,"value":747},"Use ",{"type":40,"tag":121,"props":749,"children":751},{"className":750},[],[752],{"type":45,"value":753},"align to $__interval using …",{"type":45,"value":755}," for bucketing — ",{"type":40,"tag":121,"props":757,"children":759},{"className":758},[],[760],{"type":45,"value":761},"$__interval",{"type":45,"value":763}," is supplied by the dashboard runtime. Hard-coded windows over- or under-resolve. Validate every pipeline with ",{"type":40,"tag":121,"props":765,"children":767},{"className":766},[],[768],{"type":45,"value":769},"scripts\u002Fmetrics\u002Fmpl-validate-chart",{"type":45,"value":771},"; both it and ",{"type":40,"tag":121,"props":773,"children":775},{"className":774},[],[776],{"type":45,"value":777},"chart-add --mpl",{"type":45,"value":779}," reject inline time ranges (",{"type":40,"tag":121,"props":781,"children":783},{"className":782},[],[784],{"type":45,"value":785},"[1h..]",{"type":45,"value":787},").",{"type":40,"tag":421,"props":789,"children":790},{},[791,793,798,800,806],{"type":45,"value":792},"Exception: for sparse metrics where ",{"type":40,"tag":121,"props":794,"children":796},{"className":795},[],[797],{"type":45,"value":761},{"type":45,"value":799}," rounds to empty buckets, a fixed wider window (e.g. ",{"type":40,"tag":121,"props":801,"children":803},{"className":802},[],[804],{"type":45,"value":805},"1h",{"type":45,"value":807},") is acceptable; document why on the chart.",{"type":40,"tag":606,"props":809,"children":811},{"id":810},"_1-at-a-glance-statistic-panels-1",[812],{"type":45,"value":611},{"type":40,"tag":421,"props":814,"children":815},{},[816],{"type":45,"value":817},"Current values — \"what's the state right now?\"",{"type":40,"tag":321,"props":819,"children":820},{},[821,841],{"type":40,"tag":59,"props":822,"children":823},{},[824,825,831,833,839],{"type":45,"value":747},{"type":40,"tag":121,"props":826,"children":828},{"className":827},[],[829],{"type":45,"value":830},"group using avg",{"type":45,"value":832}," (gauges) or ",{"type":40,"tag":121,"props":834,"children":836},{"className":835},[],[837],{"type":45,"value":838},"group using last",{"type":45,"value":840}," (counters).",{"type":40,"tag":59,"props":842,"children":843},{},[844,846,851,853,859,861,867,869,875,877,883],{"type":45,"value":845},"Read the metric's ",{"type":40,"tag":121,"props":847,"children":849},{"className":848},[],[850],{"type":45,"value":260},{"type":45,"value":852}," via ",{"type":40,"tag":121,"props":854,"children":856},{"className":855},[],[857],{"type":45,"value":858},"metrics-info … metrics \u003Cm> info",{"type":45,"value":860}," and pass it to ",{"type":40,"tag":121,"props":862,"children":864},{"className":863},[],[865],{"type":45,"value":866},"chart-add --unit",{"type":45,"value":868},". Ratio metrics (0–1) need ",{"type":40,"tag":121,"props":870,"children":872},{"className":871},[],[873],{"type":45,"value":874},"| map * 100",{"type":45,"value":876}," in MPL before ",{"type":40,"tag":121,"props":878,"children":880},{"className":879},[],[881],{"type":45,"value":882},"--unit \"%\"",{"type":45,"value":137},{"type":40,"tag":606,"props":885,"children":887},{"id":886},"_2-trends-timeseries-panels-1",[888],{"type":45,"value":645},{"type":40,"tag":421,"props":890,"children":891},{},[892],{"type":45,"value":893},"Trends over time — \"what changed?\"",{"type":40,"tag":321,"props":895,"children":896},{},[897,907,912],{"type":40,"tag":59,"props":898,"children":899},{},[900,906],{"type":40,"tag":121,"props":901,"children":903},{"className":902},[],[904],{"type":45,"value":905},"align to $__interval using avg|sum|last",{"type":45,"value":137},{"type":40,"tag":59,"props":908,"children":909},{},[910],{"type":45,"value":911},"Group by low-cardinality tags only (≤10 series per chart).",{"type":40,"tag":59,"props":913,"children":914},{},[915,917,923,925,931,932,938,940,946],{"type":45,"value":916},"Embed the unit in ",{"type":40,"tag":121,"props":918,"children":920},{"className":919},[],[921],{"type":45,"value":922},"--name",{"type":45,"value":924}," (",{"type":40,"tag":121,"props":926,"children":928},{"className":927},[],[929],{"type":45,"value":930},"\"P95 Latency (ms)\"",{"type":45,"value":247},{"type":40,"tag":121,"props":933,"children":935},{"className":934},[],[936],{"type":45,"value":937},"\"Memory (MiB)\"",{"type":45,"value":939},"); scale magnitudes in MPL (",{"type":40,"tag":121,"props":941,"children":943},{"className":942},[],[944],{"type":45,"value":945},"| map \u002F 1048576",{"type":45,"value":947}," for bytes → MiB).",{"type":40,"tag":606,"props":949,"children":951},{"id":950},"_3-breakdowns-timeseries-or-table-panels",[952],{"type":45,"value":953},"3. Breakdowns (TimeSeries or Table panels)",{"type":40,"tag":421,"props":955,"children":956},{},[957],{"type":45,"value":958},"Per-entity detail — \"where should I look?\"",{"type":40,"tag":321,"props":960,"children":961},{},[962,967,972],{"type":40,"tag":59,"props":963,"children":964},{},[965],{"type":45,"value":966},"Metrics broken down by entity (host, pod, service).",{"type":40,"tag":59,"props":968,"children":969},{},[970],{"type":45,"value":971},"Filter to keep series count manageable.",{"type":40,"tag":59,"props":973,"children":974},{},[975],{"type":45,"value":976},"One dimension per panel; don't overload a single chart.",{"type":40,"tag":606,"props":978,"children":980},{"id":979},"_4-entity-state-timeseries-or-table-panels",[981],{"type":45,"value":982},"4. Entity State (TimeSeries or Table panels)",{"type":40,"tag":421,"props":984,"children":985},{},[986],{"type":45,"value":987},"Boolean\u002Fstate metrics — answer \"what is on\u002Foff\u002Factive?\"",{"type":40,"tag":321,"props":989,"children":990},{},[991,1002],{"type":40,"tag":59,"props":992,"children":993},{},[994,995,1001],{"type":45,"value":747},{"type":40,"tag":121,"props":996,"children":998},{"className":997},[],[999],{"type":45,"value":1000},"align to $__interval using last",{"type":45,"value":137},{"type":40,"tag":59,"props":1003,"children":1004},{},[1005],{"type":45,"value":1006},"Sparse state metrics may need a fixed wider interval (1h+).",{"type":40,"tag":139,"props":1008,"children":1009},{},[],{"type":40,"tag":48,"props":1011,"children":1013},{"id":1012},"required-chart-structure",[1014],{"type":45,"value":1015},"Required Chart Structure",{"type":40,"tag":421,"props":1017,"children":1018},{},[1019,1021,1027,1028,1034,1035,1041,1043,1049,1051,1057,1059,1065,1067,1073],{"type":45,"value":1020},"Each chart needs a unique kebab-case ",{"type":40,"tag":121,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":45,"value":1026},"id",{"type":45,"value":924},{"type":40,"tag":121,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":45,"value":1033},"error-rate",{"type":45,"value":247},{"type":40,"tag":121,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":45,"value":1040},"p95-latency",{"type":45,"value":1042},"); every layout ",{"type":40,"tag":121,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":45,"value":1048},"i",{"type":45,"value":1050}," must match one. Pass the same id to ",{"type":40,"tag":121,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":45,"value":1056},"chart-add --id",{"type":45,"value":1058}," and ",{"type":40,"tag":121,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":45,"value":1064},"layout-pack \u003Cid>:…",{"type":45,"value":1066},". ",{"type":40,"tag":121,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":45,"value":1072},"dashboard-assemble",{"type":45,"value":1074}," cross-checks before emit.",{"type":40,"tag":139,"props":1076,"children":1077},{},[],{"type":40,"tag":48,"props":1079,"children":1081},{"id":1080},"chart-unit-configuration",[1082],{"type":45,"value":1083},"Chart Unit Configuration",{"type":40,"tag":421,"props":1085,"children":1086},{},[1087,1089,1094,1095,1101,1102,1108,1109,1115,1116,1122,1123,1129,1131,1136,1138,1144,1146,1151,1153,1158,1160,1166,1168,1173,1175,1180,1182,1188,1190,1196],{"type":45,"value":1088},"Pass a friendly unit string to ",{"type":40,"tag":121,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":45,"value":866},{"type":45,"value":924},{"type":40,"tag":121,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":45,"value":1100},"\"%\"",{"type":45,"value":247},{"type":40,"tag":121,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":45,"value":1107},"\"s\"",{"type":45,"value":247},{"type":40,"tag":121,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":45,"value":1114},"\"ms\"",{"type":45,"value":247},{"type":40,"tag":121,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":45,"value":1121},"\"B\"",{"type":45,"value":247},{"type":40,"tag":121,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":45,"value":1128},"\"req\u002Fs\"",{"type":45,"value":1130},"). The script picks ",{"type":40,"tag":121,"props":1132,"children":1134},{"className":1133},[],[1135],{"type":45,"value":260},{"type":45,"value":1137}," enum + ",{"type":40,"tag":121,"props":1139,"children":1141},{"className":1140},[],[1142],{"type":45,"value":1143},"customUnits",{"type":45,"value":1145}," suffix per chart type. ",{"type":40,"tag":121,"props":1147,"children":1149},{"className":1148},[],[1150],{"type":45,"value":1143},{"type":45,"value":1152}," is a label, not a formatter — scale magnitudes in MPL (",{"type":40,"tag":121,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":45,"value":945},{"type":45,"value":1159}," for bytes → MiB, ",{"type":40,"tag":121,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":45,"value":1165},"| map \u002F 1000000",{"type":45,"value":1167}," for bytes → MB, ",{"type":40,"tag":121,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":45,"value":874},{"type":45,"value":1174}," for 0–1 ratio → percent). For metrics charts, read the source unit from ",{"type":40,"tag":121,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":45,"value":858},{"type":45,"value":1181}," and pass it through. Internals (advanced options the agent may merge with ",{"type":40,"tag":121,"props":1183,"children":1185},{"className":1184},[],[1186],{"type":45,"value":1187},"jq",{"type":45,"value":1189},"): ",{"type":40,"tag":130,"props":1191,"children":1193},{"href":1192},".\u002Freference\u002Fchart-config.md",[1194],{"type":45,"value":1195},"reference\u002Fchart-config.md",{"type":45,"value":137},{"type":40,"tag":139,"props":1198,"children":1199},{},[],{"type":40,"tag":48,"props":1201,"children":1203},{"id":1202},"compute-or-defer",[1204],{"type":45,"value":135},{"type":40,"tag":421,"props":1206,"children":1207},{},[1208,1210,1215],{"type":45,"value":1209},"Each panel either computes the requested quantity, or it's replaced by a ",{"type":40,"tag":121,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":45,"value":126},{"type":45,"value":1216}," documenting the blocker. Substituting a different quantity is never acceptable — disclaimers don't reach whoever acts on the number.",{"type":40,"tag":421,"props":1218,"children":1219},{},[1220,1222,1228],{"type":45,"value":1221},"Defer template (use ",{"type":40,"tag":121,"props":1223,"children":1225},{"className":1224},[],[1226],{"type":45,"value":1227},"chart-add --type Note",{"type":45,"value":1229},"):",{"type":40,"tag":1231,"props":1232,"children":1236},"pre",{"className":1233,"code":1235,"language":45},[1234],"language-text","**Deferred — blocked by:** \u003Cone-line reason>.\n\n**Original spec:** \u003Cwhat the panel should compute, dimensions, unit>.\n\n**To unblock:** \u003Cpointer to the fix>.\n",[1237],{"type":40,"tag":121,"props":1238,"children":1240},{"__ignoreMap":1239},"",[1241],{"type":45,"value":1235},{"type":40,"tag":421,"props":1243,"children":1244},{},[1245,1247,1253],{"type":45,"value":1246},"Common blockers: MPL parser limits, missing tag with no reverse-tag equivalent, missing metric with no OTel rename match. Full rationale: ",{"type":40,"tag":130,"props":1248,"children":1250},{"href":1249},".\u002Freference\u002Fdesign-playbook.md#substituting-a-different-quantity-for-the-asked-one",[1251],{"type":45,"value":1252},"reference\u002Fdesign-playbook.md § Substituting a Different Quantity",{"type":45,"value":137},{"type":40,"tag":139,"props":1255,"children":1256},{},[],{"type":40,"tag":48,"props":1258,"children":1260},{"id":1259},"chart-types",[1261],{"type":45,"value":1262},"Chart Types",{"type":40,"tag":149,"props":1264,"children":1265},{},[1266,1287],{"type":40,"tag":153,"props":1267,"children":1268},{},[1269],{"type":40,"tag":157,"props":1270,"children":1271},{},[1272,1277,1282],{"type":40,"tag":161,"props":1273,"children":1274},{},[1275],{"type":45,"value":1276},"Type",{"type":40,"tag":161,"props":1278,"children":1279},{},[1280],{"type":45,"value":1281},"When",{"type":40,"tag":161,"props":1283,"children":1284},{},[1285],{"type":45,"value":1286},"Key constraint",{"type":40,"tag":172,"props":1288,"children":1289},{},[1290,1308,1340,1373,1391,1422,1445,1468,1501,1519],{"type":40,"tag":157,"props":1291,"children":1292},{},[1293,1298,1303],{"type":40,"tag":179,"props":1294,"children":1295},{},[1296],{"type":45,"value":1297},"Statistic",{"type":40,"tag":179,"props":1299,"children":1300},{},[1301],{"type":45,"value":1302},"Single KPI, current value",{"type":40,"tag":179,"props":1304,"children":1305},{},[1306],{"type":45,"value":1307},"Query must return one row.",{"type":40,"tag":157,"props":1309,"children":1310},{},[1311,1316,1321],{"type":40,"tag":179,"props":1312,"children":1313},{},[1314],{"type":45,"value":1315},"TimeSeries",{"type":40,"tag":179,"props":1317,"children":1318},{},[1319],{"type":45,"value":1320},"Trends over time, percentile overlays",{"type":40,"tag":179,"props":1322,"children":1323},{},[1324,1330,1332,1338],{"type":40,"tag":121,"props":1325,"children":1327},{"className":1326},[],[1328],{"type":45,"value":1329},"bin_auto(_time)",{"type":45,"value":1331},"; ",{"type":40,"tag":121,"props":1333,"children":1335},{"className":1334},[],[1336],{"type":45,"value":1337},"percentiles_array()",{"type":45,"value":1339}," for multi-percentile.",{"type":40,"tag":157,"props":1341,"children":1342},{},[1343,1348,1353],{"type":40,"tag":179,"props":1344,"children":1345},{},[1346],{"type":45,"value":1347},"Table",{"type":40,"tag":179,"props":1349,"children":1350},{},[1351],{"type":45,"value":1352},"Top-N lists, breakdowns",{"type":40,"tag":179,"props":1354,"children":1355},{},[1356,1358,1364,1366,1372],{"type":45,"value":1357},"Bound with ",{"type":40,"tag":121,"props":1359,"children":1361},{"className":1360},[],[1362],{"type":45,"value":1363},"top N",{"type":45,"value":1365},"; control columns via ",{"type":40,"tag":121,"props":1367,"children":1369},{"className":1368},[],[1370],{"type":45,"value":1371},"project",{"type":45,"value":137},{"type":40,"tag":157,"props":1374,"children":1375},{},[1376,1381,1386],{"type":40,"tag":179,"props":1377,"children":1378},{},[1379],{"type":45,"value":1380},"Pie",{"type":40,"tag":179,"props":1382,"children":1383},{},[1384],{"type":45,"value":1385},"Share-of-total for ≤6 categories",{"type":40,"tag":179,"props":1387,"children":1388},{},[1389],{"type":45,"value":1390},"Aggregate to ≤6 slices; never high-cardinality.",{"type":40,"tag":157,"props":1392,"children":1393},{},[1394,1399,1404],{"type":40,"tag":179,"props":1395,"children":1396},{},[1397],{"type":45,"value":1398},"LogStream",{"type":40,"tag":179,"props":1400,"children":1401},{},[1402],{"type":45,"value":1403},"Raw event inspection",{"type":40,"tag":179,"props":1405,"children":1406},{},[1407,1413,1414,1420],{"type":40,"tag":121,"props":1408,"children":1410},{"className":1409},[],[1411],{"type":45,"value":1412},"take 100–500",{"type":45,"value":1331},{"type":40,"tag":121,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":45,"value":1419},"project-keep",{"type":45,"value":1421}," to relevant fields; filter hard.",{"type":40,"tag":157,"props":1423,"children":1424},{},[1425,1430,1435],{"type":40,"tag":179,"props":1426,"children":1427},{},[1428],{"type":45,"value":1429},"Heatmap",{"type":40,"tag":179,"props":1431,"children":1432},{},[1433],{"type":45,"value":1434},"Distribution \u002F latency density",{"type":40,"tag":179,"props":1436,"children":1437},{},[1438,1444],{"type":40,"tag":121,"props":1439,"children":1441},{"className":1440},[],[1442],{"type":45,"value":1443},"summarize histogram(field, buckets) by bin_auto(_time)",{"type":45,"value":137},{"type":40,"tag":157,"props":1446,"children":1447},{},[1448,1453,1458],{"type":40,"tag":179,"props":1449,"children":1450},{},[1451],{"type":45,"value":1452},"Scatter Plot",{"type":40,"tag":179,"props":1454,"children":1455},{},[1456],{"type":45,"value":1457},"Correlate two metrics per group",{"type":40,"tag":179,"props":1459,"children":1460},{},[1461,1467],{"type":40,"tag":121,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":45,"value":1466},"summarize avg(x), avg(y) by group",{"type":45,"value":137},{"type":40,"tag":157,"props":1469,"children":1470},{},[1471,1476,1481],{"type":40,"tag":179,"props":1472,"children":1473},{},[1474],{"type":45,"value":1475},"SmartFilter",{"type":40,"tag":179,"props":1477,"children":1478},{},[1479],{"type":45,"value":1480},"Interactive filter bar",{"type":40,"tag":179,"props":1482,"children":1483},{},[1484,1486,1492,1494,1500],{"type":45,"value":1485},"Each panel query needs ",{"type":40,"tag":121,"props":1487,"children":1489},{"className":1488},[],[1490],{"type":45,"value":1491},"declare query_parameters",{"type":45,"value":1493},". See ",{"type":40,"tag":121,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":45,"value":1499},"reference\u002Fsmartfilter.md",{"type":45,"value":137},{"type":40,"tag":157,"props":1502,"children":1503},{},[1504,1509,1514],{"type":40,"tag":179,"props":1505,"children":1506},{},[1507],{"type":45,"value":1508},"Monitor List",{"type":40,"tag":179,"props":1510,"children":1511},{},[1512],{"type":45,"value":1513},"Monitor status display",{"type":40,"tag":179,"props":1515,"children":1516},{},[1517],{"type":45,"value":1518},"No APL — select monitors in UI.",{"type":40,"tag":157,"props":1520,"children":1521},{},[1522,1526,1531],{"type":40,"tag":179,"props":1523,"children":1524},{},[1525],{"type":45,"value":126},{"type":40,"tag":179,"props":1527,"children":1528},{},[1529],{"type":45,"value":1530},"Markdown context, headers, runbook links",{"type":40,"tag":179,"props":1532,"children":1533},{},[1534,1540],{"type":40,"tag":121,"props":1535,"children":1537},{"className":1536},[],[1538],{"type":45,"value":1539},"chart-add --type Note --text \"\u003Cmd>\"",{"type":45,"value":137},{"type":40,"tag":421,"props":1542,"children":1543},{},[1544,1546,1552],{"type":45,"value":1545},"Per-type APL recipes: ",{"type":40,"tag":121,"props":1547,"children":1549},{"className":1548},[],[1550],{"type":45,"value":1551},"reference\u002Fchart-cookbook.md",{"type":45,"value":137},{"type":40,"tag":139,"props":1554,"children":1555},{},[],{"type":40,"tag":48,"props":1557,"children":1559},{"id":1558},"chart-configuration",[1560],{"type":45,"value":1561},"Chart Configuration",{"type":40,"tag":421,"props":1563,"children":1564},{},[1565,1571,1573,1579,1581,1587,1589,1595,1597,1602,1604,1609,1610,1615],{"type":40,"tag":121,"props":1566,"children":1568},{"className":1567},[],[1569],{"type":45,"value":1570},"chart-add",{"type":45,"value":1572}," covers the common path (type, id, name, query, dataset, unit, sparkline). For options it doesn't expose — ",{"type":40,"tag":121,"props":1574,"children":1576},{"className":1575},[],[1577],{"type":45,"value":1578},"aggChartOpts",{"type":45,"value":1580}," variants on TimeSeries, ",{"type":40,"tag":121,"props":1582,"children":1584},{"className":1583},[],[1585],{"type":45,"value":1586},"tableSettings.columns",{"type":45,"value":1588}," on Table\u002FLogStream, ",{"type":40,"tag":121,"props":1590,"children":1592},{"className":1591},[],[1593],{"type":45,"value":1594},"hideHeader",{"type":45,"value":1596},", etc. — start from a ",{"type":40,"tag":121,"props":1598,"children":1600},{"className":1599},[],[1601],{"type":45,"value":1570},{"type":45,"value":1603}," output and merge the extra fields with ",{"type":40,"tag":121,"props":1605,"children":1607},{"className":1606},[],[1608],{"type":45,"value":1187},{"type":45,"value":1493},{"type":40,"tag":121,"props":1611,"children":1613},{"className":1612},[],[1614],{"type":45,"value":1195},{"type":45,"value":1616}," for the full option set, and the rejected-field list before merging anything bespoke.",{"type":40,"tag":139,"props":1618,"children":1619},{},[],{"type":40,"tag":48,"props":1621,"children":1623},{"id":1622},"apl-patterns",[1624],{"type":45,"value":1625},"APL Patterns",{"type":40,"tag":599,"props":1627,"children":1629},{"id":1628},"time-filtering",[1630],{"type":45,"value":1631},"Time Filtering",{"type":40,"tag":421,"props":1633,"children":1634},{},[1635,1637,1643,1645,1651,1653,1659],{"type":45,"value":1636},"Dashboard chart queries inherit time from the picker — omit ",{"type":40,"tag":121,"props":1638,"children":1640},{"className":1639},[],[1641],{"type":45,"value":1642},"_time",{"type":45,"value":1644}," filters. Ad-hoc queries (Axiom Query tab, ",{"type":40,"tag":121,"props":1646,"children":1648},{"className":1647},[],[1649],{"type":45,"value":1650},"axiom-sre",{"type":45,"value":1652},") need an explicit ",{"type":40,"tag":121,"props":1654,"children":1656},{"className":1655},[],[1657],{"type":45,"value":1658},"where _time between (ago(1h) .. now())",{"type":45,"value":137},{"type":40,"tag":599,"props":1661,"children":1663},{"id":1662},"bin-size-selection",[1664],{"type":45,"value":1665},"Bin Size Selection",{"type":40,"tag":421,"props":1667,"children":1668},{},[1669,1670,1675,1677,1683],{"type":45,"value":747},{"type":40,"tag":121,"props":1671,"children":1673},{"className":1672},[],[1674],{"type":45,"value":1329},{"type":45,"value":1676}," — it adjusts to the dashboard time window. Manual ",{"type":40,"tag":121,"props":1678,"children":1680},{"className":1679},[],[1681],{"type":45,"value":1682},"bin(_time, …)",{"type":45,"value":1684}," is only justified for non-standard cases (e.g. matching an upstream batch interval); document why.",{"type":40,"tag":599,"props":1686,"children":1688},{"id":1687},"cardinality-guardrails",[1689],{"type":45,"value":1690},"Cardinality Guardrails",{"type":40,"tag":421,"props":1692,"children":1693},{},[1694,1696,1702,1704,1709,1711,1717,1718,1724],{"type":45,"value":1695},"Bound ",{"type":40,"tag":121,"props":1697,"children":1699},{"className":1698},[],[1700],{"type":45,"value":1701},"summarize … by …",{"type":45,"value":1703}," with ",{"type":40,"tag":121,"props":1705,"children":1707},{"className":1706},[],[1708],{"type":45,"value":1363},{"type":45,"value":1710}," or a filter. Unbounded grouping on high-cardinality fields (",{"type":40,"tag":121,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":45,"value":1716},"user_id",{"type":45,"value":247},{"type":40,"tag":121,"props":1719,"children":1721},{"className":1720},[],[1722],{"type":45,"value":1723},"trace_id",{"type":45,"value":1725},") blows up.",{"type":40,"tag":1231,"props":1727,"children":1730},{"className":1728,"code":1729,"language":23,"meta":1239,"style":1239},"language-apl shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","| summarize count() by route | top 10 by count_   \u002F\u002F bounded\n| summarize count() by user_id                    \u002F\u002F unbounded — avoid\n",[1731],{"type":40,"tag":121,"props":1732,"children":1733},{"__ignoreMap":1239},[1734,1744],{"type":40,"tag":1735,"props":1736,"children":1738},"span",{"class":1737,"line":28},"line",[1739],{"type":40,"tag":1735,"props":1740,"children":1741},{},[1742],{"type":45,"value":1743},"| summarize count() by route | top 10 by count_   \u002F\u002F bounded\n",{"type":40,"tag":1735,"props":1745,"children":1747},{"class":1737,"line":1746},2,[1748],{"type":40,"tag":1735,"props":1749,"children":1750},{},[1751],{"type":45,"value":1752},"| summarize count() by user_id                    \u002F\u002F unbounded — avoid\n",{"type":40,"tag":599,"props":1754,"children":1756},{"id":1755},"field-escaping",[1757],{"type":45,"value":1758},"Field Escaping",{"type":40,"tag":421,"props":1760,"children":1761},{},[1762],{"type":45,"value":1763},"Fields with dots need bracket notation:",{"type":40,"tag":1231,"props":1765,"children":1767},{"className":1728,"code":1766,"language":23,"meta":1239,"style":1239},"| where ['kubernetes.pod.name'] == \"frontend\"\n",[1768],{"type":40,"tag":121,"props":1769,"children":1770},{"__ignoreMap":1239},[1771],{"type":40,"tag":1735,"props":1772,"children":1773},{"class":1737,"line":28},[1774],{"type":40,"tag":1735,"props":1775,"children":1776},{},[1777],{"type":45,"value":1766},{"type":40,"tag":421,"props":1779,"children":1780},{},[1781],{"type":45,"value":1782},"Fields with dots IN the name (not hierarchy) need escaping:",{"type":40,"tag":1231,"props":1784,"children":1786},{"className":1728,"code":1785,"language":23,"meta":1239,"style":1239},"| where ['kubernetes.labels.app\\\\.kubernetes\\\\.io\u002Fname'] == \"frontend\"\n",[1787],{"type":40,"tag":121,"props":1788,"children":1789},{"__ignoreMap":1239},[1790],{"type":40,"tag":1735,"props":1791,"children":1792},{"class":1737,"line":28},[1793],{"type":40,"tag":1735,"props":1794,"children":1795},{},[1796],{"type":45,"value":1785},{"type":40,"tag":599,"props":1798,"children":1800},{"id":1799},"recipes",[1801],{"type":45,"value":1802},"Recipes",{"type":40,"tag":421,"props":1804,"children":1805},{},[1806,1808,1813],{"type":45,"value":1807},"Traffic, error-rate, latency-percentile, and other golden-signal APL recipes: ",{"type":40,"tag":121,"props":1809,"children":1811},{"className":1810},[],[1812],{"type":45,"value":1551},{"type":45,"value":137},{"type":40,"tag":139,"props":1815,"children":1816},{},[],{"type":40,"tag":48,"props":1818,"children":1820},{"id":1819},"layout-composition",[1821],{"type":45,"value":1822},"Layout Composition",{"type":40,"tag":421,"props":1824,"children":1825},{},[1826,1832,1834,1840,1842,1848,1850,1856],{"type":40,"tag":121,"props":1827,"children":1829},{"className":1828},[],[1830],{"type":45,"value":1831},"layout-pack",{"type":45,"value":1833}," packs charts row-major into the 12-column grid using per-type defaults (Statistic 3×3, TimeSeries 6×4, Table 6×5, LogStream 12×6, Note 12×2). Override with ",{"type":40,"tag":121,"props":1835,"children":1837},{"className":1836},[],[1838],{"type":45,"value":1839},"id:WxH",{"type":45,"value":1841}," when needed. Section blueprints: ",{"type":40,"tag":121,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":45,"value":1847},"reference\u002Flayout-recipes.md",{"type":45,"value":1849},". Naming and panel-ordering conventions: ",{"type":40,"tag":121,"props":1851,"children":1853},{"className":1852},[],[1854],{"type":45,"value":1855},"reference\u002Fdesign-playbook.md",{"type":45,"value":137},{"type":40,"tag":139,"props":1858,"children":1859},{},[],{"type":40,"tag":48,"props":1861,"children":1863},{"id":1862},"dashboard-settings",[1864],{"type":45,"value":1865},"Dashboard Settings",{"type":40,"tag":599,"props":1867,"children":1869},{"id":1868},"refresh-rate",[1870],{"type":45,"value":1871},"Refresh Rate",{"type":40,"tag":421,"props":1873,"children":1874},{},[1875,1881],{"type":40,"tag":121,"props":1876,"children":1878},{"className":1877},[],[1879],{"type":45,"value":1880},"dashboard-assemble --refresh oncall|team|exec",{"type":45,"value":1882}," (60\u002F300\u002F900s) or pass an explicit integer (≥60). Short refresh + long time range = expensive queries; pick the longer end for exec\u002Fweekly boards.",{"type":40,"tag":599,"props":1884,"children":1886},{"id":1885},"sharing",[1887],{"type":45,"value":1888},"Sharing",{"type":40,"tag":421,"props":1890,"children":1891},{},[1892,1894,1900],{"type":45,"value":1893},"API tokens create shared dashboards only (",{"type":40,"tag":121,"props":1895,"children":1897},{"className":1896},[],[1898],{"type":45,"value":1899},"owner: \"X-AXIOM-EVERYONE\"",{"type":45,"value":1901},"); private dashboards aren't supported. Per-user data visibility is still enforced by dataset permissions.",{"type":40,"tag":599,"props":1903,"children":1905},{"id":1904},"url-time-range-parameters",[1906],{"type":45,"value":1907},"URL Time Range Parameters",{"type":40,"tag":421,"props":1909,"children":1910},{},[1911,1917,1919,1925,1927,1933],{"type":40,"tag":121,"props":1912,"children":1914},{"className":1913},[],[1915],{"type":45,"value":1916},"?t_qr=24h",{"type":45,"value":1918}," (quick range), ",{"type":40,"tag":121,"props":1920,"children":1922},{"className":1921},[],[1923],{"type":45,"value":1924},"?t_ts=...&t_te=...",{"type":45,"value":1926}," (custom), ",{"type":40,"tag":121,"props":1928,"children":1930},{"className":1929},[],[1931],{"type":45,"value":1932},"?t_against=-1d",{"type":45,"value":1934}," (comparison)",{"type":40,"tag":139,"props":1936,"children":1937},{},[],{"type":40,"tag":48,"props":1939,"children":1941},{"id":1940},"setup",[1942],{"type":45,"value":1943},"Setup",{"type":40,"tag":421,"props":1945,"children":1946},{},[1947,1949,1955,1957,1963,1965,1971],{"type":45,"value":1948},"Tools, prerequisites, and ",{"type":40,"tag":121,"props":1950,"children":1952},{"className":1951},[],[1953],{"type":45,"value":1954},"~\u002F.axiom.toml",{"type":45,"value":1956}," configuration: see ",{"type":40,"tag":121,"props":1958,"children":1960},{"className":1959},[],[1961],{"type":45,"value":1962},"README.md",{"type":45,"value":1964},". Verify with ",{"type":40,"tag":121,"props":1966,"children":1968},{"className":1967},[],[1969],{"type":45,"value":1970},"scripts\u002Fsetup",{"type":45,"value":137},{"type":40,"tag":139,"props":1973,"children":1974},{},[],{"type":40,"tag":48,"props":1976,"children":1978},{"id":1977},"deployment",[1979],{"type":45,"value":1980},"Deployment",{"type":40,"tag":599,"props":1982,"children":1984},{"id":1983},"scripts",[1985],{"type":45,"value":1986},"Scripts",{"type":40,"tag":149,"props":1988,"children":1989},{},[1990,2006],{"type":40,"tag":153,"props":1991,"children":1992},{},[1993],{"type":40,"tag":157,"props":1994,"children":1995},{},[1996,2001],{"type":40,"tag":161,"props":1997,"children":1998},{},[1999],{"type":45,"value":2000},"Script",{"type":40,"tag":161,"props":2002,"children":2003},{},[2004],{"type":45,"value":2005},"Usage",{"type":40,"tag":172,"props":2007,"children":2008},{},[2009,2031,2053,2105,2122,2139,2156,2173,2190,2207,2224,2241,2258,2294,2324,2347,2363,2380,2404],{"type":40,"tag":157,"props":2010,"children":2011},{},[2012,2021],{"type":40,"tag":179,"props":2013,"children":2014},{},[2015],{"type":40,"tag":121,"props":2016,"children":2018},{"className":2017},[],[2019],{"type":45,"value":2020},"scripts\u002Fchart-add --type \u003CT> --id \u003Cid> --name \u003Cn> [--apl \u003Cq> | --mpl \u003Cq> --dataset \u003Cd>] [--unit \u003Cu>]",{"type":40,"tag":179,"props":2022,"children":2023},{},[2024,2029],{"type":40,"tag":63,"props":2025,"children":2026},{},[2027],{"type":45,"value":2028},"Emit a single chart JSON",{"type":45,"value":2030}," to stdout. Splits APL vs MPL; MPL queries are checked for inline time ranges; unit fields applied per chart type.",{"type":40,"tag":157,"props":2032,"children":2033},{},[2034,2043],{"type":40,"tag":179,"props":2035,"children":2036},{},[2037],{"type":40,"tag":121,"props":2038,"children":2040},{"className":2039},[],[2041],{"type":45,"value":2042},"scripts\u002Flayout-pack \u003Cid>:\u003CType|WxH> ...",{"type":40,"tag":179,"props":2044,"children":2045},{},[2046,2051],{"type":40,"tag":63,"props":2047,"children":2048},{},[2049],{"type":45,"value":2050},"Emit a layout JSON array",{"type":45,"value":2052}," to stdout. Row-major into a 12-column grid; type names map to default sizes.",{"type":40,"tag":157,"props":2054,"children":2055},{},[2056,2065],{"type":40,"tag":179,"props":2057,"children":2058},{},[2059],{"type":40,"tag":121,"props":2060,"children":2062},{"className":2061},[],[2063],{"type":45,"value":2064},"scripts\u002Fdashboard-assemble --name … --datasets … --layout F.json [opts] CHART_FILES…",{"type":40,"tag":179,"props":2066,"children":2067},{},[2068,2073,2075,2081,2082,2088,2089,2095,2097,2103],{"type":40,"tag":63,"props":2069,"children":2070},{},[2071],{"type":45,"value":2072},"Compose a complete dashboard JSON",{"type":45,"value":2074}," from chart files + layout. Owns the envelope (",{"type":40,"tag":121,"props":2076,"children":2078},{"className":2077},[],[2079],{"type":45,"value":2080},"owner",{"type":45,"value":247},{"type":40,"tag":121,"props":2083,"children":2085},{"className":2084},[],[2086],{"type":45,"value":2087},"schemaVersion",{"type":45,"value":247},{"type":40,"tag":121,"props":2090,"children":2092},{"className":2091},[],[2093],{"type":45,"value":2094},"qr-",{"type":45,"value":2096}," prefix, ",{"type":40,"tag":121,"props":2098,"children":2100},{"className":2099},[],[2101],{"type":45,"value":2102},"refreshTime",{"type":45,"value":2104}," validation, id cross-checks).",{"type":40,"tag":157,"props":2106,"children":2107},{},[2108,2117],{"type":40,"tag":179,"props":2109,"children":2110},{},[2111],{"type":40,"tag":121,"props":2112,"children":2114},{"className":2113},[],[2115],{"type":45,"value":2116},"scripts\u002Fdashboard-list \u003Cdeploy>",{"type":40,"tag":179,"props":2118,"children":2119},{},[2120],{"type":45,"value":2121},"List all dashboards",{"type":40,"tag":157,"props":2123,"children":2124},{},[2125,2134],{"type":40,"tag":179,"props":2126,"children":2127},{},[2128],{"type":40,"tag":121,"props":2129,"children":2131},{"className":2130},[],[2132],{"type":45,"value":2133},"scripts\u002Fdashboard-get \u003Cdeploy> \u003Cid>",{"type":40,"tag":179,"props":2135,"children":2136},{},[2137],{"type":45,"value":2138},"Fetch dashboard JSON",{"type":40,"tag":157,"props":2140,"children":2141},{},[2142,2151],{"type":40,"tag":179,"props":2143,"children":2144},{},[2145],{"type":40,"tag":121,"props":2146,"children":2148},{"className":2147},[],[2149],{"type":45,"value":2150},"scripts\u002Fdashboard-validate \u003Cfile>",{"type":40,"tag":179,"props":2152,"children":2153},{},[2154],{"type":45,"value":2155},"Validate JSON structure",{"type":40,"tag":157,"props":2157,"children":2158},{},[2159,2168],{"type":40,"tag":179,"props":2160,"children":2161},{},[2162],{"type":40,"tag":121,"props":2163,"children":2165},{"className":2164},[],[2166],{"type":45,"value":2167},"scripts\u002Fdashboard-create \u003Cdeploy> \u003Cfile>",{"type":40,"tag":179,"props":2169,"children":2170},{},[2171],{"type":45,"value":2172},"Create dashboard",{"type":40,"tag":157,"props":2174,"children":2175},{},[2176,2185],{"type":40,"tag":179,"props":2177,"children":2178},{},[2179],{"type":40,"tag":121,"props":2180,"children":2182},{"className":2181},[],[2183],{"type":45,"value":2184},"scripts\u002Fdashboard-update \u003Cdeploy> \u003Cid> \u003Cfile>",{"type":40,"tag":179,"props":2186,"children":2187},{},[2188],{"type":45,"value":2189},"Update (needs version)",{"type":40,"tag":157,"props":2191,"children":2192},{},[2193,2202],{"type":40,"tag":179,"props":2194,"children":2195},{},[2196],{"type":40,"tag":121,"props":2197,"children":2199},{"className":2198},[],[2200],{"type":45,"value":2201},"scripts\u002Fdashboard-chart-patch \u003Cdeploy> \u003Cid> \u003Cchart-id> \u003Cpatch-file> (--version \u003Cversion> | --overwrite)",{"type":40,"tag":179,"props":2203,"children":2204},{},[2205],{"type":45,"value":2206},"Patch one chart",{"type":40,"tag":157,"props":2208,"children":2209},{},[2210,2219],{"type":40,"tag":179,"props":2211,"children":2212},{},[2213],{"type":40,"tag":121,"props":2214,"children":2216},{"className":2215},[],[2217],{"type":45,"value":2218},"scripts\u002Fdashboard-copy \u003Cdeploy> \u003Cid>",{"type":40,"tag":179,"props":2220,"children":2221},{},[2222],{"type":45,"value":2223},"Clone dashboard",{"type":40,"tag":157,"props":2225,"children":2226},{},[2227,2236],{"type":40,"tag":179,"props":2228,"children":2229},{},[2230],{"type":40,"tag":121,"props":2231,"children":2233},{"className":2232},[],[2234],{"type":45,"value":2235},"scripts\u002Fdashboard-link \u003Cdeploy> \u003Cid>",{"type":40,"tag":179,"props":2237,"children":2238},{},[2239],{"type":45,"value":2240},"Get shareable URL",{"type":40,"tag":157,"props":2242,"children":2243},{},[2244,2253],{"type":40,"tag":179,"props":2245,"children":2246},{},[2247],{"type":40,"tag":121,"props":2248,"children":2250},{"className":2249},[],[2251],{"type":45,"value":2252},"scripts\u002Fdashboard-delete \u003Cdeploy> \u003Cid>",{"type":40,"tag":179,"props":2254,"children":2255},{},[2256],{"type":45,"value":2257},"Delete (with confirm)",{"type":40,"tag":157,"props":2259,"children":2260},{},[2261,2270],{"type":40,"tag":179,"props":2262,"children":2263},{},[2264],{"type":40,"tag":121,"props":2265,"children":2267},{"className":2266},[],[2268],{"type":45,"value":2269},"scripts\u002Faxiom-api \u003Cdeploy> \u003Cmethod> \u003Cpath>",{"type":40,"tag":179,"props":2271,"children":2272},{},[2273,2278,2280,2286,2288],{"type":40,"tag":63,"props":2274,"children":2275},{},[2276],{"type":45,"value":2277},"Dashboard\u002Fapp API only",{"type":45,"value":2279}," (rewrites to ",{"type":40,"tag":121,"props":2281,"children":2283},{"className":2282},[],[2284],{"type":45,"value":2285},"app.*",{"type":45,"value":2287},"). For data\u002Fmetrics endpoints use ",{"type":40,"tag":121,"props":2289,"children":2291},{"className":2290},[],[2292],{"type":45,"value":2293},"scripts\u002Fmetrics\u002Faxiom-api",{"type":40,"tag":157,"props":2295,"children":2296},{},[2297,2306],{"type":40,"tag":179,"props":2298,"children":2299},{},[2300],{"type":40,"tag":121,"props":2301,"children":2303},{"className":2302},[],[2304],{"type":45,"value":2305},"scripts\u002Fmetrics\u002Faxiom-api \u003Cdeploy> \u003Cmethod> \u003Cpath>",{"type":40,"tag":179,"props":2307,"children":2308},{},[2309,2314,2316,2322],{"type":40,"tag":63,"props":2310,"children":2311},{},[2312],{"type":45,"value":2313},"Data\u002Fmetrics API",{"type":45,"value":2315}," (supports ",{"type":40,"tag":121,"props":2317,"children":2319},{"className":2318},[],[2320],{"type":45,"value":2321},"AXIOM_URL_OVERRIDE",{"type":45,"value":2323}," for edge routing)",{"type":40,"tag":157,"props":2325,"children":2326},{},[2327,2335],{"type":40,"tag":179,"props":2328,"children":2329},{},[2330],{"type":40,"tag":121,"props":2331,"children":2333},{"className":2332},[],[2334],{"type":45,"value":375},{"type":40,"tag":179,"props":2336,"children":2337},{},[2338,2340,2345],{"type":45,"value":2339},"List datasets with ",{"type":40,"tag":121,"props":2341,"children":2343},{"className":2342},[],[2344],{"type":45,"value":383},{"type":45,"value":2346}," and edge deployment",{"type":40,"tag":157,"props":2348,"children":2349},{},[2350,2358],{"type":40,"tag":179,"props":2351,"children":2352},{},[2353],{"type":40,"tag":121,"props":2354,"children":2356},{"className":2355},[],[2357],{"type":45,"value":477},{"type":40,"tag":179,"props":2359,"children":2360},{},[2361],{"type":45,"value":2362},"Fetch MPL query specification",{"type":40,"tag":157,"props":2364,"children":2365},{},[2366,2375],{"type":40,"tag":179,"props":2367,"children":2368},{},[2369],{"type":40,"tag":121,"props":2370,"children":2372},{"className":2371},[],[2373],{"type":45,"value":2374},"scripts\u002Fmetrics\u002Fmetrics-info \u003Cdeploy> \u003Cdataset> ...",{"type":40,"tag":179,"props":2376,"children":2377},{},[2378],{"type":45,"value":2379},"Discover metrics, tags, and values",{"type":40,"tag":157,"props":2381,"children":2382},{},[2383,2392],{"type":40,"tag":179,"props":2384,"children":2385},{},[2386],{"type":40,"tag":121,"props":2387,"children":2389},{"className":2388},[],[2390],{"type":45,"value":2391},"scripts\u002Fmetrics\u002Fmetrics-query \u003Cdeploy> \u003Cmpl> \u003Cstart> \u003Cend>",{"type":40,"tag":179,"props":2393,"children":2394},{},[2395,2397,2402],{"type":45,"value":2396},"Execute a metrics query (raw — no ",{"type":40,"tag":121,"props":2398,"children":2400},{"className":2399},[],[2401],{"type":45,"value":761},{"type":45,"value":2403}," injection)",{"type":40,"tag":157,"props":2405,"children":2406},{},[2407,2416],{"type":40,"tag":179,"props":2408,"children":2409},{},[2410],{"type":40,"tag":121,"props":2411,"children":2413},{"className":2412},[],[2414],{"type":45,"value":2415},"scripts\u002Fmetrics\u002Fmpl-validate-chart \u003Cdeploy> '\u003CMPL>' [start] [end] [--interval D]",{"type":40,"tag":179,"props":2417,"children":2418},{},[2419,2424,2426,2432,2433,2439,2441,2447],{"type":40,"tag":63,"props":2420,"children":2421},{},[2422],{"type":45,"value":2423},"Validate a chart MPL pipeline.",{"type":45,"value":2425}," Auto-injects ",{"type":40,"tag":121,"props":2427,"children":2429},{"className":2428},[],[2430],{"type":45,"value":2431},"param $__interval: Duration;",{"type":45,"value":1058},{"type":40,"tag":121,"props":2434,"children":2436},{"className":2435},[],[2437],{"type":45,"value":2438},"-p __interval=…",{"type":45,"value":2440},"; rejects inline time ranges. Use this in place of raw ",{"type":40,"tag":121,"props":2442,"children":2444},{"className":2443},[],[2445],{"type":45,"value":2446},"metrics-query",{"type":45,"value":2448}," when authoring chart queries.",{"type":40,"tag":417,"props":2450,"children":2451},{},[2452],{"type":40,"tag":421,"props":2453,"children":2454},{},[2455,2457,2463,2465,2471,2473,2478],{"type":45,"value":2456},"The two ",{"type":40,"tag":121,"props":2458,"children":2460},{"className":2459},[],[2461],{"type":45,"value":2462},"axiom-api",{"type":45,"value":2464}," scripts are not interchangeable. ",{"type":40,"tag":121,"props":2466,"children":2468},{"className":2467},[],[2469],{"type":45,"value":2470},"scripts\u002Faxiom-api",{"type":45,"value":2472}," is for the dashboard app API; ",{"type":40,"tag":121,"props":2474,"children":2476},{"className":2475},[],[2477],{"type":45,"value":2293},{"type":45,"value":2479}," is for data\u002Fmetrics endpoints and edge routing. Wrong one → 404.",{"type":40,"tag":599,"props":2481,"children":2483},{"id":2482},"targeted-chart-updates",[2484],{"type":45,"value":2485},"Targeted Chart Updates",{"type":40,"tag":421,"props":2487,"children":2488},{},[2489,2490,2496,2498,2504,2506,2512],{"type":45,"value":747},{"type":40,"tag":121,"props":2491,"children":2493},{"className":2492},[],[2494],{"type":45,"value":2495},"scripts\u002Fdashboard-chart-patch",{"type":45,"value":2497}," when changing one existing chart and the dashboard layout, metadata, and other charts should remain untouched. It calls ",{"type":40,"tag":121,"props":2499,"children":2501},{"className":2500},[],[2502],{"type":45,"value":2503},"PATCH \u002Fv2\u002Fdashboards\u002Fuid\u002F{uid}\u002Fcharts\u002F{chartId}",{"type":45,"value":2505}," with a JSON Merge Patch under the ",{"type":40,"tag":121,"props":2507,"children":2509},{"className":2508},[],[2510],{"type":45,"value":2511},"chart",{"type":45,"value":2513}," request field.",{"type":40,"tag":421,"props":2515,"children":2516},{},[2517],{"type":45,"value":2518},"Patch files contain only the chart fields to change:",{"type":40,"tag":1231,"props":2520,"children":2524},{"className":2521,"code":2522,"language":2523,"meta":1239,"style":1239},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"Error Rate (5m)\",\n  \"query\": { \"apl\": \"['logs'] | summarize errors=countif(status >= 500)\" },\n  \"config\": { \"stale\": null }\n}\n","json",[2525],{"type":40,"tag":121,"props":2526,"children":2527},{"__ignoreMap":1239},[2528,2537,2581,2642,2694],{"type":40,"tag":1735,"props":2529,"children":2530},{"class":1737,"line":28},[2531],{"type":40,"tag":1735,"props":2532,"children":2534},{"style":2533},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2535],{"type":45,"value":2536},"{\n",{"type":40,"tag":1735,"props":2538,"children":2539},{"class":1737,"line":1746},[2540,2545,2551,2556,2561,2566,2572,2576],{"type":40,"tag":1735,"props":2541,"children":2542},{"style":2533},[2543],{"type":45,"value":2544},"  \"",{"type":40,"tag":1735,"props":2546,"children":2548},{"style":2547},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[2549],{"type":45,"value":2550},"name",{"type":40,"tag":1735,"props":2552,"children":2553},{"style":2533},[2554],{"type":45,"value":2555},"\"",{"type":40,"tag":1735,"props":2557,"children":2558},{"style":2533},[2559],{"type":45,"value":2560},":",{"type":40,"tag":1735,"props":2562,"children":2563},{"style":2533},[2564],{"type":45,"value":2565}," \"",{"type":40,"tag":1735,"props":2567,"children":2569},{"style":2568},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[2570],{"type":45,"value":2571},"Error Rate (5m)",{"type":40,"tag":1735,"props":2573,"children":2574},{"style":2533},[2575],{"type":45,"value":2555},{"type":40,"tag":1735,"props":2577,"children":2578},{"style":2533},[2579],{"type":45,"value":2580},",\n",{"type":40,"tag":1735,"props":2582,"children":2584},{"class":1737,"line":2583},3,[2585,2589,2594,2598,2602,2607,2611,2616,2620,2624,2628,2633,2637],{"type":40,"tag":1735,"props":2586,"children":2587},{"style":2533},[2588],{"type":45,"value":2544},{"type":40,"tag":1735,"props":2590,"children":2591},{"style":2547},[2592],{"type":45,"value":2593},"query",{"type":40,"tag":1735,"props":2595,"children":2596},{"style":2533},[2597],{"type":45,"value":2555},{"type":40,"tag":1735,"props":2599,"children":2600},{"style":2533},[2601],{"type":45,"value":2560},{"type":40,"tag":1735,"props":2603,"children":2604},{"style":2533},[2605],{"type":45,"value":2606}," {",{"type":40,"tag":1735,"props":2608,"children":2609},{"style":2533},[2610],{"type":45,"value":2565},{"type":40,"tag":1735,"props":2612,"children":2614},{"style":2613},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2615],{"type":45,"value":23},{"type":40,"tag":1735,"props":2617,"children":2618},{"style":2533},[2619],{"type":45,"value":2555},{"type":40,"tag":1735,"props":2621,"children":2622},{"style":2533},[2623],{"type":45,"value":2560},{"type":40,"tag":1735,"props":2625,"children":2626},{"style":2533},[2627],{"type":45,"value":2565},{"type":40,"tag":1735,"props":2629,"children":2630},{"style":2568},[2631],{"type":45,"value":2632},"['logs'] | summarize errors=countif(status >= 500)",{"type":40,"tag":1735,"props":2634,"children":2635},{"style":2533},[2636],{"type":45,"value":2555},{"type":40,"tag":1735,"props":2638,"children":2639},{"style":2533},[2640],{"type":45,"value":2641}," },\n",{"type":40,"tag":1735,"props":2643,"children":2645},{"class":1737,"line":2644},4,[2646,2650,2655,2659,2663,2667,2671,2676,2680,2684,2689],{"type":40,"tag":1735,"props":2647,"children":2648},{"style":2533},[2649],{"type":45,"value":2544},{"type":40,"tag":1735,"props":2651,"children":2652},{"style":2547},[2653],{"type":45,"value":2654},"config",{"type":40,"tag":1735,"props":2656,"children":2657},{"style":2533},[2658],{"type":45,"value":2555},{"type":40,"tag":1735,"props":2660,"children":2661},{"style":2533},[2662],{"type":45,"value":2560},{"type":40,"tag":1735,"props":2664,"children":2665},{"style":2533},[2666],{"type":45,"value":2606},{"type":40,"tag":1735,"props":2668,"children":2669},{"style":2533},[2670],{"type":45,"value":2565},{"type":40,"tag":1735,"props":2672,"children":2673},{"style":2613},[2674],{"type":45,"value":2675},"stale",{"type":40,"tag":1735,"props":2677,"children":2678},{"style":2533},[2679],{"type":45,"value":2555},{"type":40,"tag":1735,"props":2681,"children":2682},{"style":2533},[2683],{"type":45,"value":2560},{"type":40,"tag":1735,"props":2685,"children":2686},{"style":2533},[2687],{"type":45,"value":2688}," null",{"type":40,"tag":1735,"props":2690,"children":2691},{"style":2533},[2692],{"type":45,"value":2693}," }\n",{"type":40,"tag":1735,"props":2695,"children":2697},{"class":1737,"line":2696},5,[2698],{"type":40,"tag":1735,"props":2699,"children":2700},{"style":2533},[2701],{"type":45,"value":2702},"}\n",{"type":40,"tag":421,"props":2704,"children":2705},{},[2706,2712,2714,2719,2721,2727],{"type":40,"tag":121,"props":2707,"children":2709},{"className":2708},[],[2710],{"type":45,"value":2711},"null",{"type":45,"value":2713}," removes an existing field. Nested objects merge recursively. If ",{"type":40,"tag":121,"props":2715,"children":2717},{"className":2716},[],[2718],{"type":45,"value":1026},{"type":45,"value":2720}," is present in the patch, it must match the ",{"type":40,"tag":121,"props":2722,"children":2724},{"className":2723},[],[2725],{"type":45,"value":2726},"\u003Cchart-id>",{"type":45,"value":2728}," path argument. The server validates the resulting full dashboard before saving.",{"type":40,"tag":421,"props":2730,"children":2731},{},[2732,2733,2739,2741,2747,2749,2755,2757,2763],{"type":45,"value":747},{"type":40,"tag":121,"props":2734,"children":2736},{"className":2735},[],[2737],{"type":45,"value":2738},"--version \u003Cversion>",{"type":45,"value":2740}," for optimistic concurrency after fetching the dashboard with ",{"type":40,"tag":121,"props":2742,"children":2744},{"className":2743},[],[2745],{"type":45,"value":2746},"dashboard-get",{"type":45,"value":2748},". Use ",{"type":40,"tag":121,"props":2750,"children":2752},{"className":2751},[],[2753],{"type":45,"value":2754},"--overwrite",{"type":45,"value":2756}," only when last-write-wins behavior is intended. Continue using ",{"type":40,"tag":121,"props":2758,"children":2760},{"className":2759},[],[2761],{"type":45,"value":2762},"dashboard-update",{"type":45,"value":2764}," for layout changes, multi-chart edits, dashboard metadata, owner, refresh interval, or time window updates.",{"type":40,"tag":599,"props":2766,"children":2768},{"id":2767},"workflow",[2769],{"type":45,"value":170},{"type":40,"tag":421,"props":2771,"children":2772},{},[2773,2778,2779,2784,2786,2791],{"type":40,"tag":121,"props":2774,"children":2776},{"className":2775},[],[2777],{"type":45,"value":1570},{"type":45,"value":247},{"type":40,"tag":121,"props":2780,"children":2782},{"className":2781},[],[2783],{"type":45,"value":1831},{"type":45,"value":2785},", and ",{"type":40,"tag":121,"props":2787,"children":2789},{"className":2788},[],[2790],{"type":45,"value":1072},{"type":45,"value":2792}," own the JSON shape. Each chart lives in its own temp file; nothing chart-shaped re-enters the agent's context.",{"type":40,"tag":55,"props":2794,"children":2795},{},[2796,2831,2849,2874,2885,2896,2921],{"type":40,"tag":59,"props":2797,"children":2798},{},[2799,2801,2806,2808,2813,2815,2821,2823,2829],{"type":45,"value":2800},"Discover schema (",{"type":40,"tag":121,"props":2802,"children":2804},{"className":2803},[],[2805],{"type":45,"value":1650},{"type":45,"value":2807}," \u002F ",{"type":40,"tag":121,"props":2809,"children":2811},{"className":2810},[],[2812],{"type":45,"value":434},{"type":45,"value":2814}," for events; ",{"type":40,"tag":121,"props":2816,"children":2818},{"className":2817},[],[2819],{"type":45,"value":2820},"metrics-spec",{"type":45,"value":2822}," + ",{"type":40,"tag":121,"props":2824,"children":2826},{"className":2825},[],[2827],{"type":45,"value":2828},"metrics-info",{"type":45,"value":2830}," for metrics).",{"type":40,"tag":59,"props":2832,"children":2833},{},[2834,2836,2841,2843,2848],{"type":45,"value":2835},"Write each panel query. Validate APL via ",{"type":40,"tag":121,"props":2837,"children":2839},{"className":2838},[],[2840],{"type":45,"value":1650},{"type":45,"value":2842}," with an explicit time filter; validate MPL via ",{"type":40,"tag":121,"props":2844,"children":2846},{"className":2845},[],[2847],{"type":45,"value":769},{"type":45,"value":137},{"type":40,"tag":59,"props":2850,"children":2851},{},[2852,2858,2860,2865,2866,2872],{"type":40,"tag":121,"props":2853,"children":2855},{"className":2854},[],[2856],{"type":45,"value":2857},"chart-add --type … --apl '\u003CAPL>'",{"type":45,"value":2859}," ",{"type":40,"tag":516,"props":2861,"children":2862},{},[2863],{"type":45,"value":2864},"or",{"type":45,"value":2859},{"type":40,"tag":121,"props":2867,"children":2869},{"className":2868},[],[2870],{"type":45,"value":2871},"chart-add --type … --mpl '\u003CMPL>' --dataset \u003Cname>",{"type":45,"value":2873}," per chart, redirected to its own file.",{"type":40,"tag":59,"props":2875,"children":2876},{},[2877,2883],{"type":40,"tag":121,"props":2878,"children":2880},{"className":2879},[],[2881],{"type":45,"value":2882},"layout-pack \u003Cid>:\u003CType|WxH> …",{"type":45,"value":2884}," for the layout (ids in display order).",{"type":40,"tag":59,"props":2886,"children":2887},{},[2888,2894],{"type":40,"tag":121,"props":2889,"children":2891},{"className":2890},[],[2892],{"type":45,"value":2893},"dashboard-assemble --name … --datasets … --layout LAYOUT CHART_FILES…",{"type":45,"value":2895}," to compose.",{"type":40,"tag":59,"props":2897,"children":2898},{},[2899,2905,2907,2913,2915,2920],{"type":40,"tag":121,"props":2900,"children":2902},{"className":2901},[],[2903],{"type":45,"value":2904},"dashboard-validate",{"type":45,"value":2906}," then ",{"type":40,"tag":121,"props":2908,"children":2910},{"className":2909},[],[2911],{"type":45,"value":2912},"dashboard-create",{"type":45,"value":2914}," (or ",{"type":40,"tag":121,"props":2916,"children":2918},{"className":2917},[],[2919],{"type":45,"value":2762},{"type":45,"value":787},{"type":40,"tag":59,"props":2922,"children":2923},{},[2924,2930],{"type":40,"tag":121,"props":2925,"children":2927},{"className":2926},[],[2928],{"type":45,"value":2929},"dashboard-link",{"type":45,"value":2931}," for the URL — never hand-construct.",{"type":40,"tag":139,"props":2933,"children":2934},{},[],{"type":40,"tag":48,"props":2936,"children":2938},{"id":2937},"sibling-skill-integration",[2939],{"type":45,"value":2940},"Sibling Skill Integration",{"type":40,"tag":321,"props":2942,"children":2943},{},[2944,2977,2993],{"type":40,"tag":59,"props":2945,"children":2946},{},[2947,2952,2954,2960,2962,2968,2970,2976],{"type":40,"tag":63,"props":2948,"children":2949},{},[2950],{"type":45,"value":2951},"spl-to-apl",{"type":45,"value":2953}," — Splunk SPL → APL (",{"type":40,"tag":121,"props":2955,"children":2957},{"className":2956},[],[2958],{"type":45,"value":2959},"timechart",{"type":45,"value":2961}," → TimeSeries, ",{"type":40,"tag":121,"props":2963,"children":2965},{"className":2964},[],[2966],{"type":45,"value":2967},"stats",{"type":45,"value":2969}," → Statistic\u002FTable). See ",{"type":40,"tag":121,"props":2971,"children":2973},{"className":2972},[],[2974],{"type":45,"value":2975},"reference\u002Fsplunk-migration.md",{"type":45,"value":137},{"type":40,"tag":59,"props":2978,"children":2979},{},[2980,2984,2986,2991],{"type":40,"tag":63,"props":2981,"children":2982},{},[2983],{"type":45,"value":1650},{"type":45,"value":2985}," — schema discovery via ",{"type":40,"tag":121,"props":2987,"children":2989},{"className":2988},[],[2990],{"type":45,"value":434},{"type":45,"value":2992},", baseline exploration.",{"type":40,"tag":59,"props":2994,"children":2995},{},[2996,3001,3003,3009],{"type":40,"tag":63,"props":2997,"children":2998},{},[2999],{"type":45,"value":3000},"query-metrics",{"type":45,"value":3002}," — metrics dataset\u002Ftag\u002Fvalue discovery; same scripts vendored under ",{"type":40,"tag":121,"props":3004,"children":3006},{"className":3005},[],[3007],{"type":45,"value":3008},"scripts\u002Fmetrics\u002F",{"type":45,"value":137},{"type":40,"tag":139,"props":3011,"children":3012},{},[],{"type":40,"tag":48,"props":3014,"children":3016},{"id":3015},"templates",[3017],{"type":45,"value":3018},"Templates",{"type":40,"tag":421,"props":3020,"children":3021},{},[3022,3024,3029,3030,3035,3036,3041,3043,3049,3050,3056,3057,3063,3064,3070,3071,3077,3079,3085,3087,3093,3094,3100,3101,3107,3108,3114],{"type":45,"value":3023},"Compose with ",{"type":40,"tag":121,"props":3025,"children":3027},{"className":3026},[],[3028],{"type":45,"value":1570},{"type":45,"value":2822},{"type":40,"tag":121,"props":3031,"children":3033},{"className":3032},[],[3034],{"type":45,"value":1831},{"type":45,"value":2822},{"type":40,"tag":121,"props":3037,"children":3039},{"className":3038},[],[3040],{"type":45,"value":1072},{"type":45,"value":3042},". Pre-built templates remain under ",{"type":40,"tag":121,"props":3044,"children":3046},{"className":3045},[],[3047],{"type":45,"value":3048},"reference\u002Ftemplates\u002F",{"type":45,"value":924},{"type":40,"tag":121,"props":3051,"children":3053},{"className":3052},[],[3054],{"type":45,"value":3055},"blank.json",{"type":45,"value":247},{"type":40,"tag":121,"props":3058,"children":3060},{"className":3059},[],[3061],{"type":45,"value":3062},"service-overview.json",{"type":45,"value":247},{"type":40,"tag":121,"props":3065,"children":3067},{"className":3066},[],[3068],{"type":45,"value":3069},"service-overview-with-filters.json",{"type":45,"value":247},{"type":40,"tag":121,"props":3072,"children":3074},{"className":3073},[],[3075],{"type":45,"value":3076},"api-health.json",{"type":45,"value":3078},") for legacy use; ",{"type":40,"tag":121,"props":3080,"children":3082},{"className":3081},[],[3083],{"type":45,"value":3084},"dashboard-from-template",{"type":45,"value":3086}," instantiates them but assumes specific field names (",{"type":40,"tag":121,"props":3088,"children":3090},{"className":3089},[],[3091],{"type":45,"value":3092},"service",{"type":45,"value":247},{"type":40,"tag":121,"props":3095,"children":3097},{"className":3096},[],[3098],{"type":45,"value":3099},"status",{"type":45,"value":247},{"type":40,"tag":121,"props":3102,"children":3104},{"className":3103},[],[3105],{"type":45,"value":3106},"route",{"type":45,"value":247},{"type":40,"tag":121,"props":3109,"children":3111},{"className":3110},[],[3112],{"type":45,"value":3113},"duration_ms",{"type":45,"value":3115},") and needs sed-fixing. Prefer composition for new work.",{"type":40,"tag":139,"props":3117,"children":3118},{},[],{"type":40,"tag":48,"props":3120,"children":3122},{"id":3121},"common-pitfalls",[3123],{"type":45,"value":3124},"Common Pitfalls",{"type":40,"tag":149,"props":3126,"children":3127},{},[3128,3149],{"type":40,"tag":153,"props":3129,"children":3130},{},[3131],{"type":40,"tag":157,"props":3132,"children":3133},{},[3134,3139,3144],{"type":40,"tag":161,"props":3135,"children":3136},{},[3137],{"type":45,"value":3138},"Problem",{"type":40,"tag":161,"props":3140,"children":3141},{},[3142],{"type":45,"value":3143},"Cause",{"type":40,"tag":161,"props":3145,"children":3146},{},[3147],{"type":45,"value":3148},"Solution",{"type":40,"tag":172,"props":3150,"children":3151},{},[3152,3187,3212,3262,3314,3361,3398,3438,3501,3531],{"type":40,"tag":157,"props":3153,"children":3154},{},[3155,3165,3175],{"type":40,"tag":179,"props":3156,"children":3157},{},[3158,3163],{"type":40,"tag":121,"props":3159,"children":3161},{"className":3160},[],[3162],{"type":45,"value":434},{"type":45,"value":3164}," returns 0 rows",{"type":40,"tag":179,"props":3166,"children":3167},{},[3168,3170],{"type":45,"value":3169},"Dataset is ",{"type":40,"tag":121,"props":3171,"children":3173},{"className":3172},[],[3174],{"type":45,"value":396},{"type":40,"tag":179,"props":3176,"children":3177},{},[3178,3179,3185],{"type":45,"value":747},{"type":40,"tag":121,"props":3180,"children":3182},{"className":3181},[],[3183],{"type":45,"value":3184},"scripts\u002Fmetrics\u002Fmetrics-info",{"type":45,"value":3186}," for metrics discovery.",{"type":40,"tag":157,"props":3188,"children":3189},{},[3190,3195,3200],{"type":40,"tag":179,"props":3191,"children":3192},{},[3193],{"type":45,"value":3194},"Metrics discovery returns empty",{"type":40,"tag":179,"props":3196,"children":3197},{},[3198],{"type":45,"value":3199},"Sparse metrics outside the 24h default window",{"type":40,"tag":179,"props":3201,"children":3202},{},[3203,3205,3210],{"type":45,"value":3204},"Retry with ",{"type":40,"tag":121,"props":3206,"children":3208},{"className":3207},[],[3209],{"type":45,"value":501},{"type":45,"value":3211}," 7 days ago.",{"type":40,"tag":157,"props":3213,"children":3214},{},[3215,3220,3237],{"type":40,"tag":179,"props":3216,"children":3217},{},[3218],{"type":45,"value":3219},"404 from metrics API calls",{"type":40,"tag":179,"props":3221,"children":3222},{},[3223,3225,3230,3232],{"type":45,"value":3224},"Used ",{"type":40,"tag":121,"props":3226,"children":3228},{"className":3227},[],[3229],{"type":45,"value":2470},{"type":45,"value":3231}," (dashboard) instead of ",{"type":40,"tag":121,"props":3233,"children":3235},{"className":3234},[],[3236],{"type":45,"value":2293},{"type":40,"tag":179,"props":3238,"children":3239},{},[3240,3241,3246,3248,3254,3255,3261],{"type":45,"value":747},{"type":40,"tag":121,"props":3242,"children":3244},{"className":3243},[],[3245],{"type":45,"value":2293},{"type":45,"value":3247}," for ",{"type":40,"tag":121,"props":3249,"children":3251},{"className":3250},[],[3252],{"type":45,"value":3253},"\u002Fv1\u002Fquery\u002F*",{"type":45,"value":247},{"type":40,"tag":121,"props":3256,"children":3258},{"className":3257},[],[3259],{"type":45,"value":3260},"\u002Fv1\u002Fdatasets",{"type":45,"value":137},{"type":40,"tag":157,"props":3263,"children":3264},{},[3265,3286,3297],{"type":40,"tag":179,"props":3266,"children":3267},{},[3268,3270,3276,3278,3284],{"type":45,"value":3269},"Statistic shows ",{"type":40,"tag":121,"props":3271,"children":3273},{"className":3272},[],[3274],{"type":45,"value":3275},"1",{"type":45,"value":3277}," instead of ",{"type":40,"tag":121,"props":3279,"children":3281},{"className":3280},[],[3282],{"type":45,"value":3283},"100%",{"type":45,"value":3285}," for a 0–1 ratio",{"type":40,"tag":179,"props":3287,"children":3288},{},[3289,3295],{"type":40,"tag":121,"props":3290,"children":3292},{"className":3291},[],[3293],{"type":45,"value":3294},"Percent",{"type":45,"value":3296}," enum doesn't auto-multiply",{"type":40,"tag":179,"props":3298,"children":3299},{},[3300,3305,3307,3313],{"type":40,"tag":121,"props":3301,"children":3303},{"className":3302},[],[3304],{"type":45,"value":874},{"type":45,"value":3306}," in MPL, then ",{"type":40,"tag":121,"props":3308,"children":3310},{"className":3309},[],[3311],{"type":45,"value":3312},"chart-add --unit \"%\"",{"type":45,"value":137},{"type":40,"tag":157,"props":3315,"children":3316},{},[3317,3322,3327],{"type":40,"tag":179,"props":3318,"children":3319},{},[3320],{"type":45,"value":3321},"OTel histogram chart shows nonsense",{"type":40,"tag":179,"props":3323,"children":3324},{},[3325],{"type":45,"value":3326},"Histogram aligned as a scalar",{"type":40,"tag":179,"props":3328,"children":3329},{},[3330,3331,3337,3338,3344,3346,3352,3354,3360],{"type":45,"value":747},{"type":40,"tag":121,"props":3332,"children":3334},{"className":3333},[],[3335],{"type":45,"value":3336},"bucket … using interpolate_cumulative_histogram",{"type":45,"value":2914},{"type":40,"tag":121,"props":3339,"children":3341},{"className":3340},[],[3342],{"type":45,"value":3343},"_delta",{"type":45,"value":3345}," per ",{"type":40,"tag":121,"props":3347,"children":3349},{"className":3348},[],[3350],{"type":45,"value":3351},"temporality",{"type":45,"value":3353},"). See ",{"type":40,"tag":130,"props":3355,"children":3357},{"href":3356},".\u002Freference\u002Fpromql-to-mpl.md#histogram-translation-histogram_quantile--bucket--using-interpolate__histogram",[3358],{"type":45,"value":3359},"promql-to-mpl.md § Histogram translation",{"type":45,"value":137},{"type":40,"tag":157,"props":3362,"children":3363},{},[3364,3369,3388],{"type":40,"tag":179,"props":3365,"children":3366},{},[3367],{"type":45,"value":3368},"Grafana migration filters\u002Fgroups on the wrong subset",{"type":40,"tag":179,"props":3370,"children":3371},{},[3372,3374,3379,3381,3386],{"type":45,"value":3373},"Read ",{"type":40,"tag":121,"props":3375,"children":3377},{"className":3376},[],[3378],{"type":45,"value":245},{"type":45,"value":3380}," without ",{"type":40,"tag":121,"props":3382,"children":3384},{"className":3383},[],[3385],{"type":45,"value":274},{"type":45,"value":3387},", or vice versa",{"type":40,"tag":179,"props":3389,"children":3390},{},[3391,3393,3397],{"type":45,"value":3392},"Project all five panel fields before authoring; see ",{"type":40,"tag":130,"props":3394,"children":3395},{"href":279},[3396],{"type":45,"value":282},{"type":45,"value":137},{"type":40,"tag":157,"props":3399,"children":3400},{},[3401,3406,3411],{"type":40,"tag":179,"props":3402,"children":3403},{},[3404],{"type":45,"value":3405},"PromQL metric name not found",{"type":40,"tag":179,"props":3407,"children":3408},{},[3409],{"type":45,"value":3410},"Skipped OTel rename rules",{"type":40,"tag":179,"props":3412,"children":3413},{},[3414,3416,3422,3424,3429,3431,3437],{"type":45,"value":3415},"Drop ",{"type":40,"tag":121,"props":3417,"children":3419},{"className":3418},[],[3420],{"type":45,"value":3421},"_total",{"type":45,"value":3423},", decompose histograms, normalise units; validate with ",{"type":40,"tag":121,"props":3425,"children":3427},{"className":3426},[],[3428],{"type":45,"value":2828},{"type":45,"value":3430},". Labels need reverse-tag discovery. See ",{"type":40,"tag":130,"props":3432,"children":3434},{"href":3433},".\u002Freference\u002Fgrafana-migration.md#name-mapping-promql--otel-ingest",[3435],{"type":45,"value":3436},"grafana-migration.md § Name Mapping",{"type":45,"value":137},{"type":40,"tag":157,"props":3439,"children":3440},{},[3441,3446,3459],{"type":40,"tag":179,"props":3442,"children":3443},{},[3444],{"type":45,"value":3445},"MPL chart aggregates across a dimension PromQL filtered\u002Fgrouped on",{"type":40,"tag":179,"props":3447,"children":3448},{},[3449,3451,3457],{"type":45,"value":3450},"Dropped a selector or ",{"type":40,"tag":121,"props":3452,"children":3454},{"className":3453},[],[3455],{"type":45,"value":3456},"by(...)",{"type":45,"value":3458}," during translation",{"type":40,"tag":179,"props":3460,"children":3461},{},[3462,3464,3470,3472,3478,3480,3486,3487,3493,3494,3500],{"type":45,"value":3463},"Every ",{"type":40,"tag":121,"props":3465,"children":3467},{"className":3466},[],[3468],{"type":45,"value":3469},"{label=…}",{"type":45,"value":3471}," → ",{"type":40,"tag":121,"props":3473,"children":3475},{"className":3474},[],[3476],{"type":45,"value":3477},"where",{"type":45,"value":3479},"; every ",{"type":40,"tag":121,"props":3481,"children":3483},{"className":3482},[],[3484],{"type":45,"value":3485},"by(…)",{"type":45,"value":3471},{"type":40,"tag":121,"props":3488,"children":3490},{"className":3489},[],[3491],{"type":45,"value":3492},"group by",{"type":45,"value":1493},{"type":40,"tag":130,"props":3495,"children":3497},{"href":3496},".\u002Freference\u002Fpromql-to-mpl.md",[3498],{"type":45,"value":3499},"reference\u002Fpromql-to-mpl.md",{"type":45,"value":137},{"type":40,"tag":157,"props":3502,"children":3503},{},[3504,3509,3514],{"type":40,"tag":179,"props":3505,"children":3506},{},[3507],{"type":45,"value":3508},"Panel shipped a different quantity than asked",{"type":40,"tag":179,"props":3510,"children":3511},{},[3512],{"type":45,"value":3513},"Substituted instead of deferring",{"type":40,"tag":179,"props":3515,"children":3516},{},[3517,3519,3524,3526,3530],{"type":45,"value":3518},"Replace with a ",{"type":40,"tag":121,"props":3520,"children":3522},{"className":3521},[],[3523],{"type":45,"value":126},{"type":45,"value":3525}," documenting the blocker. See ",{"type":40,"tag":130,"props":3527,"children":3528},{"href":132},[3529],{"type":45,"value":135},{"type":45,"value":137},{"type":40,"tag":157,"props":3532,"children":3533},{},[3534,3539,3544],{"type":40,"tag":179,"props":3535,"children":3536},{},[3537],{"type":45,"value":3538},"403 \"creating private dashboards\"",{"type":40,"tag":179,"props":3540,"children":3541},{},[3542],{"type":45,"value":3543},"API tokens only create shared dashboards",{"type":40,"tag":179,"props":3545,"children":3546},{},[3547,3549,3554,3556,3561,3563,3569],{"type":45,"value":3548},"Leave ",{"type":40,"tag":121,"props":3550,"children":3552},{"className":3551},[],[3553],{"type":45,"value":2080},{"type":45,"value":3555}," as ",{"type":40,"tag":121,"props":3557,"children":3559},{"className":3558},[],[3560],{"type":45,"value":1072},{"type":45,"value":3562},"'s default (",{"type":40,"tag":121,"props":3564,"children":3566},{"className":3565},[],[3567],{"type":45,"value":3568},"X-AXIOM-EVERYONE",{"type":45,"value":787},{"type":40,"tag":139,"props":3571,"children":3572},{},[],{"type":40,"tag":48,"props":3574,"children":3576},{"id":3575},"reference",[3577],{"type":45,"value":3578},"Reference",{"type":40,"tag":321,"props":3580,"children":3581},{},[3582,3592,3603,3613,3623,3633,3643,3653,3663,3673],{"type":40,"tag":59,"props":3583,"children":3584},{},[3585,3590],{"type":40,"tag":121,"props":3586,"children":3588},{"className":3587},[],[3589],{"type":45,"value":1195},{"type":45,"value":3591}," — All chart configuration options (JSON)",{"type":40,"tag":59,"props":3593,"children":3594},{},[3595,3601],{"type":40,"tag":121,"props":3596,"children":3598},{"className":3597},[],[3599],{"type":45,"value":3600},"reference\u002Fmetrics-mpl.md",{"type":45,"value":3602}," — Metrics\u002FMPL chart contract and discovery scripts",{"type":40,"tag":59,"props":3604,"children":3605},{},[3606,3611],{"type":40,"tag":121,"props":3607,"children":3609},{"className":3608},[],[3610],{"type":45,"value":1499},{"type":45,"value":3612}," — SmartFilter\u002FFilterBar full configuration",{"type":40,"tag":59,"props":3614,"children":3615},{},[3616,3621],{"type":40,"tag":121,"props":3617,"children":3619},{"className":3618},[],[3620],{"type":45,"value":1551},{"type":45,"value":3622}," — APL patterns per chart type",{"type":40,"tag":59,"props":3624,"children":3625},{},[3626,3631],{"type":40,"tag":121,"props":3627,"children":3629},{"className":3628},[],[3630],{"type":45,"value":1847},{"type":45,"value":3632}," — Grid layouts and section blueprints",{"type":40,"tag":59,"props":3634,"children":3635},{},[3636,3641],{"type":40,"tag":121,"props":3637,"children":3639},{"className":3638},[],[3640],{"type":45,"value":2975},{"type":45,"value":3642}," — Splunk panel → Axiom mapping",{"type":40,"tag":59,"props":3644,"children":3645},{},[3646,3651],{"type":40,"tag":121,"props":3647,"children":3649},{"className":3648},[],[3650],{"type":45,"value":282},{"type":45,"value":3652}," — Grafana panel → Axiom mapping (canonical-spec projection, PromQL→MPL pointers, OTel rename rules)",{"type":40,"tag":59,"props":3654,"children":3655},{},[3656,3661],{"type":40,"tag":121,"props":3657,"children":3659},{"className":3658},[],[3660],{"type":45,"value":3499},{"type":45,"value":3662}," — PromQL → MPL translation rules (selectors, groupings, rate, histograms, ratios, reverse-tag discovery)",{"type":40,"tag":59,"props":3664,"children":3665},{},[3666,3671],{"type":40,"tag":121,"props":3667,"children":3669},{"className":3668},[],[3670],{"type":45,"value":1855},{"type":45,"value":3672}," — Decision-first design principles",{"type":40,"tag":59,"props":3674,"children":3675},{},[3676,3681],{"type":40,"tag":121,"props":3677,"children":3679},{"className":3678},[],[3680],{"type":45,"value":3048},{"type":45,"value":3682}," — Ready-to-use dashboard JSON files",{"type":40,"tag":421,"props":3684,"children":3685},{},[3686,3688],{"type":45,"value":3687},"For APL syntax: ",{"type":40,"tag":130,"props":3689,"children":3693},{"href":3690,"rel":3691},"https:\u002F\u002Faxiom.co\u002Fdocs\u002Fapl\u002Fintroduction",[3692],"nofollow",[3694],{"type":45,"value":3690},{"type":40,"tag":3696,"props":3697,"children":3698},"style",{},[3699],{"type":45,"value":3700},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3702,"total":3800},[3703,3724,3741,3748,3761,3779,3788],{"slug":3704,"name":3704,"fn":3705,"description":3706,"org":3707,"tags":3708,"stars":24,"repoUrl":25,"updatedAt":3723},"axiom-alerting","manage Axiom monitors and notifiers","Create and manage Axiom monitors and notifiers via the v2 public API. Use when building alerting, routing notifications, validating monitor behavior, and maintaining alert configurations end-to-end.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3709,3712,3713,3716,3719,3720],{"name":3710,"slug":3711,"type":16},"API Development","api-development",{"name":9,"slug":8,"type":16},{"name":3714,"slug":3715,"type":16},"Messaging","messaging",{"name":3717,"slug":3718,"type":16},"Monitoring","monitoring",{"name":14,"slug":15,"type":16},{"name":3721,"slug":3722,"type":16},"Operations","operations","2026-05-11T06:13:11.543806",{"slug":1650,"name":1650,"fn":3725,"description":3726,"org":3727,"tags":3728,"stars":24,"repoUrl":25,"updatedAt":3740},"investigate incidents with Axiom","Expert SRE investigator for incidents and debugging. Uses hypothesis-driven methodology and systematic triage. Can query Axiom observability when available. Use for incident response, root cause analysis, production debugging, or log investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3729,3730,3733,3736,3737],{"name":9,"slug":8,"type":16},{"name":3731,"slug":3732,"type":16},"Debugging","debugging",{"name":3734,"slug":3735,"type":16},"Incident Response","incident-response",{"name":14,"slug":15,"type":16},{"name":3738,"slug":3739,"type":16},"SRE","sre","2026-04-06T18:04:27.289824",{"slug":4,"name":4,"fn":5,"description":6,"org":3742,"tags":3743,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3744,3745,3746,3747],{"name":22,"slug":23,"type":16},{"name":9,"slug":8,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"slug":3749,"name":3749,"fn":3750,"description":3751,"org":3752,"tags":3753,"stars":24,"repoUrl":25,"updatedAt":3760},"controlling-costs","reduce Axiom query costs","Analyzes Axiom query patterns to find unused data, then builds dashboards and monitors for cost optimization. Use when asked to reduce Axiom costs, find unused columns or field values, identify data waste, or track ingest spend.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3754,3755,3758,3759],{"name":9,"slug":8,"type":16},{"name":3756,"slug":3757,"type":16},"Cost Optimization","cost-optimization",{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},"2026-04-06T18:04:22.202025",{"slug":3762,"name":3762,"fn":3763,"description":3764,"org":3765,"tags":3766,"stars":24,"repoUrl":25,"updatedAt":3778},"metrics-chart","render Axiom metrics as charts","Render Axiom metrics query results (application\u002Fvnd.metrics.v3+json) as line charts. Zero-dependency Unicode\u002FASCII by default; upgrades to inline PNG\u002FSVG\u002Fsixel via gnuplot when present. Use when you have a metrics v3 query response and want to see the series as a chart in the terminal or transcript.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3767,3768,3771,3774,3777],{"name":9,"slug":8,"type":16},{"name":3769,"slug":3770,"type":16},"Charts","charts",{"name":3772,"slug":3773,"type":16},"Data Visualization","data-visualization",{"name":3775,"slug":3776,"type":16},"Metrics","metrics",{"name":14,"slug":15,"type":16},"2026-07-18T05:47:14.576127",{"slug":3000,"name":3000,"fn":3780,"description":3781,"org":3782,"tags":3783,"stars":24,"repoUrl":25,"updatedAt":3787},"query Axiom MetricsDB","Runs metrics queries against Axiom MetricsDB via scripts. Discovers available metrics, tags, and tag values. Use when asked to query metrics, explore metric datasets, check metric values, or investigate OTel metrics data.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3784,3785,3786],{"name":9,"slug":8,"type":16},{"name":3775,"slug":3776,"type":16},{"name":14,"slug":15,"type":16},"2026-07-18T05:12:32.381376",{"slug":2951,"name":2951,"fn":3789,"description":3790,"org":3791,"tags":3792,"stars":24,"repoUrl":25,"updatedAt":3799},"translate Splunk SPL to Axiom APL","Translates Splunk SPL queries to Axiom APL. Provides command mappings, function equivalents, and syntax transformations. Use when migrating from Splunk, converting SPL queries, or learning APL equivalents of SPL patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3793,3794,3795,3798],{"name":22,"slug":23,"type":16},{"name":9,"slug":8,"type":16},{"name":3796,"slug":3797,"type":16},"Migration","migration",{"name":14,"slug":15,"type":16},"2026-04-06T18:04:20.939952",8,{"items":3802,"total":3920},[3803,3815,3828,3838,3854,3863,3871,3878,3885,3893,3899,3906],{"slug":3804,"name":3804,"fn":3805,"description":3806,"org":3807,"tags":3808,"stars":3812,"repoUrl":3813,"updatedAt":3814},"axiom-apl","write and debug APL queries for Axiom","APL query language reference for Axiom. Provides operators, functions, patterns, and CLI usage. Auto-invoked by specialized Axiom skills when writing or debugging APL queries.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3809,3810,3811],{"name":22,"slug":23,"type":16},{"name":9,"slug":8,"type":16},{"name":14,"slug":15,"type":16},58,"https:\u002F\u002Fgithub.com\u002Faxiomhq\u002Fcli","2026-04-06T18:04:15.826882",{"slug":3816,"name":3816,"fn":3817,"description":3818,"org":3819,"tags":3820,"stars":3812,"repoUrl":3813,"updatedAt":3827},"detect-anomalies","detect anomalies in observability data","Detect anomalies in Axiom datasets using statistical analysis. Use when looking for unusual patterns, volume spikes, outliers, or new error types in observability data.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3821,3822,3825,3826],{"name":9,"slug":8,"type":16},{"name":3823,"slug":3824,"type":16},"Data Analysis","data-analysis",{"name":3717,"slug":3718,"type":16},{"name":14,"slug":15,"type":16},"2026-04-06T18:04:19.681304",{"slug":3829,"name":3829,"fn":3830,"description":3831,"org":3832,"tags":3833,"stars":3812,"repoUrl":3813,"updatedAt":3837},"explore-dataset","explore Axiom dataset schema and patterns","Explore an Axiom dataset to understand its schema, fields, volume, and patterns. Use when discovering a new dataset, investigating data structure, or understanding what data is available.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3834,3835,3836],{"name":9,"slug":8,"type":16},{"name":3823,"slug":3824,"type":16},{"name":14,"slug":15,"type":16},"2026-04-06T18:04:18.425533",{"slug":3839,"name":3839,"fn":3840,"description":3841,"org":3842,"tags":3843,"stars":3812,"repoUrl":3813,"updatedAt":3853},"find-traces","analyze OpenTelemetry distributed traces in Axiom","Analyze OpenTelemetry distributed traces from Axiom. Use when investigating a trace ID, finding traces by criteria (errors, latency, service), or debugging distributed system issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3844,3845,3846,3849,3850],{"name":9,"slug":8,"type":16},{"name":3731,"slug":3732,"type":16},{"name":3847,"slug":3848,"type":16},"Distributed Tracing","distributed-tracing",{"name":14,"slug":15,"type":16},{"name":3851,"slug":3852,"type":16},"OpenTelemetry","opentelemetry","2026-04-06T18:04:17.130694",{"slug":3704,"name":3704,"fn":3705,"description":3706,"org":3855,"tags":3856,"stars":24,"repoUrl":25,"updatedAt":3723},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3857,3858,3859,3860,3861,3862],{"name":3710,"slug":3711,"type":16},{"name":9,"slug":8,"type":16},{"name":3714,"slug":3715,"type":16},{"name":3717,"slug":3718,"type":16},{"name":14,"slug":15,"type":16},{"name":3721,"slug":3722,"type":16},{"slug":1650,"name":1650,"fn":3725,"description":3726,"org":3864,"tags":3865,"stars":24,"repoUrl":25,"updatedAt":3740},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3866,3867,3868,3869,3870],{"name":9,"slug":8,"type":16},{"name":3731,"slug":3732,"type":16},{"name":3734,"slug":3735,"type":16},{"name":14,"slug":15,"type":16},{"name":3738,"slug":3739,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":3872,"tags":3873,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3874,3875,3876,3877],{"name":22,"slug":23,"type":16},{"name":9,"slug":8,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"slug":3749,"name":3749,"fn":3750,"description":3751,"org":3879,"tags":3880,"stars":24,"repoUrl":25,"updatedAt":3760},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3881,3882,3883,3884],{"name":9,"slug":8,"type":16},{"name":3756,"slug":3757,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"slug":3762,"name":3762,"fn":3763,"description":3764,"org":3886,"tags":3887,"stars":24,"repoUrl":25,"updatedAt":3778},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3888,3889,3890,3891,3892],{"name":9,"slug":8,"type":16},{"name":3769,"slug":3770,"type":16},{"name":3772,"slug":3773,"type":16},{"name":3775,"slug":3776,"type":16},{"name":14,"slug":15,"type":16},{"slug":3000,"name":3000,"fn":3780,"description":3781,"org":3894,"tags":3895,"stars":24,"repoUrl":25,"updatedAt":3787},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3896,3897,3898],{"name":9,"slug":8,"type":16},{"name":3775,"slug":3776,"type":16},{"name":14,"slug":15,"type":16},{"slug":2951,"name":2951,"fn":3789,"description":3790,"org":3900,"tags":3901,"stars":24,"repoUrl":25,"updatedAt":3799},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3902,3903,3904,3905],{"name":22,"slug":23,"type":16},{"name":9,"slug":8,"type":16},{"name":3796,"slug":3797,"type":16},{"name":14,"slug":15,"type":16},{"slug":3907,"name":3907,"fn":3908,"description":3909,"org":3910,"tags":3911,"stars":24,"repoUrl":25,"updatedAt":3919},"writing-evals","scaffold evals for the Axiom AI SDK","Scaffolds evaluation suites for the Axiom AI SDK. Generates eval files, scorers, flag schemas, and config from natural-language descriptions. Use when creating evals, writing scorers, setting up flag schemas, or configuring axiom.config.ts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3912,3915,3916],{"name":3913,"slug":3914,"type":16},"AI Infrastructure","ai-infrastructure",{"name":9,"slug":8,"type":16},{"name":3917,"slug":3918,"type":16},"Evals","evals","2026-04-06T18:04:26.007097",12]