grafana dashboards: shorten panel descriptions

Cut every panel/board description down to a short statement of what the
number is. Drops the design-reasoning prose, edge-case notes, and
operator-attributed quotes that had accumulated in an earlier pass —
useful context while building the boards, wrong shape for a tooltip an
operator glances at mid-incident.
This commit is contained in:
iris 2026-09-20 14:07:53 +02:00 • committed by mara
commit 8b8a322369
8 changed files with 94 additions and 94 deletions

View file

@ -1,7 +1,7 @@
{
"uid": "hyperhive-claude-usage",
"title": "hyperhive · claude usage",
"description": "How Claude is being used, rather than which agent is using it: the axes here are model, effort, token type and query source. Per-agent resource usage lives on the 'agents' dashboard; the only overlap is the cost/token headline. Metric names are the OTLP DOTTED form, so every query uses the {__name__=\"...\"} selector — the underscore spelling matches nothing in this store. Every total uses increase(): the claude_code.* counters are cumulative (forced in nix/agent-modules/otel.nix) but reset once per turn, because each turn is a new claude process, so sum_over_time would be wrong. Rate panels pin a 10m minimum interval — agents export every 60s, and a shorter window silently drops most series while still drawing a plausible line.",
"description": "How Claude is used, by model, effort, token type, and source.",
"tags": ["hyperhive", "claude"],
"timezone": "utc",
"schemaVersion": 39,
@ -59,7 +59,7 @@
"id": 1,
"type": "stat",
"title": "Cost",
"description": "claude_code.cost.usage, summed over the selected range.",
"description": "Total USD spent on Claude Code usage.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -107,7 +107,7 @@
"id": 2,
"type": "stat",
"title": "Tokens",
"description": "claude_code.token.usage across every type (input, output, cacheRead, cacheCreation).",
"description": "Total tokens used, across all types.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -155,7 +155,7 @@
"id": 3,
"type": "stat",
"title": "Cache read share",
"description": "cacheRead as a fraction of all tokens. High is good and cheap: cached input is billed at a fraction of fresh input. A sudden drop usually means prompts stopped being stable, not that more work happened.",
"description": "Cache-read tokens as a fraction of all tokens.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -203,7 +203,7 @@
"id": 4,
"type": "stat",
"title": "Active time",
"description": "claude_code.active_time.total — seconds actually spent working, not wall-clock uptime.",
"description": "Seconds actually spent working.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -251,7 +251,7 @@
"id": 10,
"type": "timeseries",
"title": "Token rate by type",
"description": "Tokens per minute, split by type. cacheRead usually dominates by an order of magnitude — that is the cache working, not a bug. 10m minimum step: agents export every 60s, so a shorter window drops series silently.",
"description": "Tokens per minute, split by type.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -313,7 +313,7 @@
"id": 11,
"type": "bargauge",
"title": "Tokens by model",
"description": "Which model the tokens went to, over the selected range.",
"description": "Tokens used, split by model.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -372,7 +372,7 @@
"id": 20,
"type": "timeseries",
"title": "Cost rate by model",
"description": "USD per minute, split by model. Same 10m minimum step as the token panel.",
"description": "USD per minute, split by model.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -430,7 +430,7 @@
"id": 21,
"type": "bargauge",
"title": "Cost by effort",
"description": "claude_code.cost.usage split by the effort label (high / medium / xhigh).",
"description": "USD spent, split by effort level.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -489,7 +489,7 @@
"id": 22,
"type": "bargauge",
"title": "Cost by query source",
"description": "'main' is the turn you asked for; 'auxiliary' is everything Claude runs on the side (titles, summaries, small helper calls). Worth watching as a ratio — auxiliary creeping up means spend that no turn asked for.",
"description": "USD spent, split by main vs. auxiliary queries.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -548,7 +548,7 @@
"id": 30,
"type": "bargauge",
"title": "Edit tool decisions by language",
"description": "claude_code.code_edit_tool.decision. The decision is in the legend rather than assumed: today every recorded decision is 'accept', so a title saying 'accepted' would be silently wrong the first time one is rejected.",
"description": "Edit-tool accept/reject decisions, split by language.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -607,7 +607,7 @@
"id": 31,
"type": "bargauge",
"title": "Edit tool decisions by tool",
"description": "Same series split by tool_name (Edit / Write) instead of language.",
"description": "Edit-tool accept/reject decisions, split by tool.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -666,7 +666,7 @@
"id": 5,
"type": "stat",
"title": "Turns",
"description": "claude_code.session.count. Each turn runs a new claude process, so a session record is emitted per turn — this is a PROXY for turn count, not a turn metric. Nothing exports turn stats to OTEL today; they live in each agent turn-stats.sqlite and are aggregated only for the hive dashboard.",
"description": "Number of Claude turns run.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -714,7 +714,7 @@
"id": 6,
"type": "stat",
"title": "Active time per turn",
"description": "Mean of claude_code.active_time.total divided by the session count above. This is ACTIVE seconds per turn, not wall-clock turn duration — time spent waiting on a tool or on the operator is not in it. A counter gives a mean only; there is no p50/p95 without the harness exporting a histogram.",
"description": "Average active seconds per turn.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -762,7 +762,7 @@
"id": 40,
"type": "timeseries",
"title": "Turns per hour by agent",
"description": "Turns per hour, as a rolling 1h count. PROXY: each turn runs a new claude process, so a session record stands in for a turn.\n\n⚠️ The window is a fixed [1h] and deliberately does NOT follow the zoom: \"per hour\" is the definition of the number, not a resolution choice. rate() cannot be used here at all — a session series is only 1-3 samples long, so rate() returns a series whose value is zero, which draws a flat line rather than an error.",
"description": "Turns per hour, per agent.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -820,7 +820,7 @@
"id": 41,
"type": "bargauge",
"title": "Active time per turn by agent",
"description": "Mean active seconds per turn, per agent, over the selected range. A high value is a long working turn, not a slow one — waiting is not counted.",
"description": "Average active seconds per turn, per agent.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -879,7 +879,7 @@
"id": 42,
"type": "bargauge",
"title": "Cost by agent",
"description": "claude_code.cost.usage summed over the selected range, broken out by agent — which agent the spend belongs to, as opposed to the model/effort/source breakdowns above.",
"description": "USD spent, split by agent.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
@ -938,7 +938,7 @@
"id": 43,
"type": "bargauge",
"title": "Tokens by agent",
"description": "claude_code.token.usage summed over the selected range, broken out by agent (all token types combined).",
"description": "Tokens used, split by agent.",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"