grafana-dashboards
Skill1 starsChanged 8 months agoMITView on GitHub
Designs and reviews production Grafana dashboards for Prometheus-style metrics -- layout and information hierarchy, RED/USE/SLO methods, modern panel JSON (timeseries, stat, table, heatmap), template variables, thresholds and units, unified alerting boundaries, and dashboards-as-code (file provisioning, Kubernetes sidecar, Terraform, Grafana Foundation SDK/Jsonnet). Use when building or refactoring Grafana dashboards, writing dashboard JSON, choosing panel types, wiring variables, provisioning dashboards via Git, or when the user mentions Grafana, dashboard JSON, panels, PromQL visualization, SLO dashboard, or dashboards.yml.
14 other projects use a version of this.
Adopted by
Most recently taken up by
- ControllableModel/SWE-Skills-Benchtheir own version, first seen Nov 8, 2026
- MiguelSavignano/claude-code-systemtheir own version, first seen Nov 1, 2026
- PixiBixi/claude-skillstheir own version, first seen Oct 25, 2026
- abevz/devops-skillstheir own version, first seen Oct 15, 2026
- xfstudio/skillstheir own version, first seen Oct 13, 2026
- Samueladewole/claude-skillstheir own version, first seen Oct 13, 2026
Other versions14 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 14
- hardisgroupcom/sfdx-hardis★ 432same name
- xfstudio/skills★ 9same name
- ControllableModel/SWE-Skills-Bench★ 8same name
- MiguelSavignano/claude-code-system★ 6same name
- ai4brands-design/claude-skills★ 2same name
- CodeWithBehnam/cc-docs★ 2same name
- Ghosteken/agent-harness★ 2same name
- cvsz/zomega★ 1same name
- ElyzeSolutions/skills★ 1same name
- smk-labs/claude-config★ 1same name
4 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository33 other files it gives its agents.
- argocdSkill
- c-cpp-compilersSkill
- coding-guidelinesSkill
- devops-iac-engineerSkill
- dag-flowdSkill
- flowd-rules-authorSkill
- frontend-designSkill
- ghSkill
- helmSkill
- kustomizeSkill
- legalizerSkill
- lua-projectsSkill
- markdown-documentationSkill
- mermaid-diagramsSkill
- meta-cognition-parallelSkill
- podmasterSkill
- practical-haskellSkill
- rcaSkill
- researcherSkill
- security-auditSkill
- solidity-securitySkill
- svg-genSkill
- tdd-red-green-refactorSkill
- tmux-masterySkill
- tokenomics-designSkill
- ultimate-dbSkill
- ultimate-nixosSkill
- ultimate-rustSkill
- ultimate-web3Skill
- web3-frontendSkill
- web3-testingSkill
- web3-whitepaperSkill
- ziglangSkill
The file
We split this skill into the rules it gives an agent
12 rules. 0 are common, 4 are distinctive, and 8 are very specific to this project.
0
Common
Most of the 14 edited versions we read keep these.
4
Distinctive
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 34
Put the answer to "is it healthy?" in the top row, readable in under five seconds.
- Distinctive: line 35
Keep panel count low (roughly 12 to 20).
- Very specific: line 94
Do not use the legacy graph, singlestat, or table-old panels in new dashboards.
- Very specific: line 101
Use $__rate_interval inside rate() and increase().
- Very specific: line 130
Put a description on every non-obvious panel: what the query measures, the threshold's rationale, and the runbook link.
- Very specific: line 132
Keep queries cheap: aggregate with sum by (...), avoid {__name__=~".+"}, and use recording rules for expensive or long-range expressions.
- Very specific: line 133
Use or vector(0) on error numerators so "no errors" renders as 0 rather than "No data".
- Distinctive: line 134
Check at several ranges (1h, 6h, 7d).
- Very specific: line 135
Default time range now-6h for operational dashboards.
- Distinctive: line 153
When a Grafana MCP server is available:
- Very specific: line 156
Prefer patch_dashboard for targeted edits over update_dashboard with a full payload.
- Very specific: line 157
Do not call write operations (update_dashboard, alert rule or incident creation) unless the user asks for them.
“Common” is measured: kept by at least 6 in 10 of the 14 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Grafana Dashboards
Build dashboards that answer a specific operational question quickly, and ship them as reviewed code. The JSON in this skill targets the classic dashboard model (Grafana 10 to 12). Grafana 12 can also export a newer v2 schema behind feature toggles; do not mix v2 exports with the snippets here.
Workflow
Task Progress:
- [ ] 1. Define audience and the question the dashboard answers
- [ ] 2. Pick the method: RED (services), USE (resources), SLO (reliability)
- [ ] 3. Sketch the layout top-down (see hierarchy below)
- [ ] 4. Define variables first, then write panels against them
- [ ] 5. Set units, thresholds, descriptions, and links
- [ ] 6. Store as code with a stable uid and provision it
- [ ] 7. Verify: JSON valid, queries return data, works at 1h / 6h / 7dDesign principles
Information hierarchy
Row 1 Status at a glance stat / gauge panels: current error ratio, p95, saturation, SLO budget
Row 2 Trends timeseries panels: rate, errors, latency over the selected range
Row 3 Breakdown tables, heatmaps, per-instance or per-route detail- One dashboard answers one question for one audience. Split overview from deep-dive and link them with dashboard links and data links carrying
var-*and time range. - Put the answer to "is it healthy?" in the top row, readable in under five seconds.
- Keep panel count low (roughly 12 to 20). Collapse rarely-needed detail into collapsed rows; panels in collapsed rows do not query until expanded.
- Alert on symptoms elsewhere (alert rules); dashboards are for triage and diagnosis.
RED (request-driven services)
| Signal | Panel | Unit |
| Rate | sum by (service) (rate(http_requests_total[$__rate_interval])) | reqps |
| Errors | 5xx ratio of total | percentunit |
| Duration | p50/p95/p99 via histogram_quantile | s |
USE (resources: CPU, memory, disk, network, pools)
| Signal | Meaning | Example |
| Utilization | Fraction of time or capacity busy | CPU busy %, pool in-use / max |
| Saturation | Queued or waiting work | run queue, pending requests, pool wait time |
| Errors | Error events on the resource | NIC drops, disk errors, OOM kills |
SLO
Show SLI over a window, error budget remaining, and multi-window burn rate. Use recording rules for anything over long ranges; see references/panel-recipes.md.
Dashboard skeleton
{
"uid": "api-monitoring",
"title": "API Monitoring",
"tags": ["api", "production"],
"timezone": "browser",
"refresh": "30s",
"time": { "from": "now-6h", "to": "now" },
"graphTooltip": 1,
"schemaVersion": 39,
"templating": { "list": [] },
"annotations": { "list": [] },
"links": [],
"panels": []
}- Set a stable, human-readable
uid(max 40 chars). Provisioning and links key offuid, notid; keepidnullor omit it. graphTooltip: 1shares the crosshair across panels, which makes correlating panels much faster.- File provisioning and Terraform take the dashboard object directly. Only the HTTP API (
POST /api/dashboards/db) needs the{"dashboard": {...}, "folderUid": "...", "overwrite": true}wrapper. - Panels use a 24-column grid:
gridPos: {x, y, w, h}. Stat panels are typicallyw: 4to6,h: 4; timeseriesw: 12,h: 8.
Panel selection
| Need | Panel | Notes |
| Current value vs threshold | stat | Use lastNotNull, colorMode: "background" or "value" |
| Value against a max | gauge or bargauge | Only when a bounded range makes sense |
| Trend over time | timeseries | Replaces the legacy graph panel |
| Distribution of latency | heatmap | Requires _bucket series with format: heatmap |
| Per-instance or per-route comparison | table with instant: true | Hide Time, rename columns, color cells |
| Discrete states | state-timeline or status-history | Up/down, deploy phases |
| Narrative or runbook links | text | Keep short |
Do not use the legacy graph, singlestat, or table-old panels in new dashboards; Grafana auto-migrates them on load, which makes diffs noisy. Full JSON for each panel is in references/panel-recipes.md.
Variables
- Define a
datasourcevariable first and reference it as{"type": "prometheus", "uid": "${datasource}"}in every panel and variable. Never hardcode datasource names or UIDs per panel. - Source label values from the metric the panels actually query (for example
label_values(http_requests_total{namespace="$namespace"}, service)), not from an unrelated info metric, so the dropdown only lists series that have data. - Multi-value variables need regex matchers:
service=~"$service". Single-value variables can use=. Using=with a multi-value variable breaks on selecting two values. - Use
$__rate_intervalinsiderate()andincrease(); do not hardcode[5m]. It adapts to scrape interval and zoom level. - Order variables so parents come before children; chained variables refresh when the parent changes.
Alerts
Legacy per-panel alerts (the alert key on a panel) were removed in Grafana 11. Do not add them. Instead:
- Define Grafana-managed alert rules (provisioned as YAML or Terraform
grafana_rule_group) or Prometheus/Mimir rule files. - Alert on user-visible symptoms and SLO burn rate, not on every resource metric.
- Show state on dashboards with an
alertlistpanel, annotations from alert rules, and a link from alert rules back to the dashboard (__dashboardUid__and__panelId__annotations).
Dashboards as code
Dashboards edited in the UI drift. Treat the JSON (or the generator that emits it) in Git as the source of truth, and disable UI edits for provisioned production dashboards.
| Method | Use when |
File provisioning (dashboards.yml) | Single Grafana, config-managed host or container |
| Kubernetes sidecar + labeled ConfigMaps | Grafana Helm chart / kube-prometheus-stack, GitOps with Argo CD or Flux |
Terraform grafana_dashboard | Grafana Cloud or multiple instances, folders and permissions in IaC |
| Grafana Foundation SDK or grafonnet (Jsonnet) | Many similar dashboards; avoid hand-maintaining large JSON |
Provisioning snippets, Kubernetes ConfigMap layout, and Terraform are in references/dashboards-as-code.md. For packaging dashboards in charts, see the helm, kustomize, and argocd skills.
Best practices
- Pick units explicitly (
reqps,s,bytes,percentunit,percent); never rely on "short". - Set
min/maxon percentage and ratio axes so scale changes do not hide regressions. - Thresholds:
basestep first withvalue: null, then ascending steps. Use the same green/yellow/red meaning everywhere; do not use red for non-error series. - Put a
descriptionon every non-obvious panel: what the query measures, the threshold's rationale, and the runbook link. - Name series with
legendFormat({{service}}), not raw label sets. - Keep queries cheap: aggregate with
sum by (...), avoid{__name__=~".+"}, and use recording rules for expensive or long-range expressions. - Use
or vector(0)on error numerators so "no errors" renders as 0 rather than "No data". - Check at several ranges (1h, 6h, 7d). Rate windows, step, and heatmap bucket density change with range.
- Default time range
now-6hfor operational dashboards;now-30donly for SLO/capacity views. - Consistent naming for panels, variables, and tags across dashboards; use tags and folders for discovery.
Verification
# Valid JSON, and uid present
jq -e '.uid and (.panels | length > 0)' dashboards/api-monitoring.json
# Find legacy panel types and per-panel alerts that should not be committed
jq -r '.. | objects | select(.type? == "graph" or .type? == "singlestat" or has("alert")) | .title // .type' dashboards/*.json
# Panels with no unit set (review manually)
jq -r '.panels[] | select(.type == "timeseries" or .type == "stat") | select(.fieldConfig.defaults.unit == null) | .title' dashboards/api-monitoring.jsonWorking through Grafana MCP tools
When a Grafana MCP server is available:
- Discover with
search_dashboards, then inspect withget_dashboard_summary; useget_dashboard_propertywith a JSONPath for a single panel or variable. Avoidget_dashboard_by_uidon large dashboards. - Prefer
patch_dashboardfor targeted edits overupdate_dashboardwith a full payload. - Do not call write operations (
update_dashboard, alert rule or incident creation) unless the user asks for them. Writing to a provisioned dashboard from the API is overwritten on next sync; change the source in Git instead. - Return
generate_deeplinkURLs rather than describing click paths. - Query Prometheus with a bounded time range, and Loki with label matchers, when validating panel queries.
Anti-patterns
- Dozens of panels on one screen with no hierarchy.
- Hardcoded
[5m]ranges, datasource names, or namespaces. - Legacy
graphpanels and panel-levelalertblocks copied from old dashboards. - Averages of percentiles; compute quantiles from summed
_bucketseries withby (le). rate()on a gauge oravg()over a counter withoutrate().- Editing provisioned dashboards in the UI and never exporting back.
- Exporting "for sharing externally" and committing
${DS_PROMETHEUS}inputs into provisioned JSON.
Additional resources
- Panel JSON, variable definitions, PromQL patterns, SLO panels: references/panel-recipes.md
- Provisioning, Kubernetes sidecar, Terraform, generators: references/dashboards-as-code.md
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

