One well-laid-out, repeating dashboard replaces dozens of copies that drift apart.
A dashboard is a grid 24 columns wide; each panel has a position and size (gridPos with x, y, w, h in the JSON model) and you drag and resize in edit mode. Put the most important summary panels at the top, details below, and keep panel heights consistent in a row so the eye can scan.
Rows are horizontal dividers that group panels and can be collapsed; collapsed rows don't run their queries until expanded, which makes big dashboards load fast. Row titles can use variables ($job overview).
Repeat creates copies per value of a multi-value variable:
- Repeat panel by
$instance, horizontally with a maximum per row, or vertically. Each copy gets the variable bound to one value, so its queryup{instance="$instance"}is per copy. - Repeat row by
$clusterrepeats a whole row of panels, which is how per-environment or per-region sections are built.
Repeats are rendered only for the currently selected values; choosing All with fifty instances creates fifty panels and fifty queries, so give such variables a sensible default.
Library panels (Dashboards, Library panels) are panels stored once and linked into many dashboards. Edit the library panel and every dashboard using it updates; Unlink turns a linked copy back into a normal panel. They are ideal for a standard "service header" row or a legal-text panel that must be identical everywhere, and they carry their own permissions through folders.
Grafana 12 introduces new dynamic layouts (auto grid, tabs, conditional rendering) behind the dashboard v2 schema; the grid above remains the default.
Example
{
"panels": [
{"type": "row", "title": "$cluster", "collapsed": false,
"gridPos": {"x": 0, "y": 0, "w": 24, "h": 1},
"repeat": "cluster"},
{"type": "stat", "title": "Up: $instance",
"gridPos": {"x": 0, "y": 1, "w": 4, "h": 3},
"repeat": "instance", "repeatDirection": "h", "maxPerRow": 6,
"targets": [{"refId": "A", "instant": true,
"expr": "up{cluster=\"$cluster\", instance=\"$instance\"}"}]},
{"type": "timeseries", "title": "Latency",
"gridPos": {"x": 0, "y": 4, "w": 24, "h": 8},
"libraryPanel": {"uid": "svc-latency", "name": "Service latency"}}
]
}Remember
- 24-column grid; rows group and collapse panels and skip their queries while collapsed
- Repeat panels or rows per selected value of a multi-value variable
- Library panels are edited once and update everywhere they are linked
Watch out for
- Repeating a panel by a variable whose All value expands to hundreds of items.