{
  "uid": "getratchet-operations",
  "title": "GetRatchet operations",
  "schemaVersion": 39,
  "version": 1,
  "refresh": "1m",
  "time": { "from": "now-6h", "to": "now" },
  "panels": [
    { "id": 1, "type": "timeseries", "title": "Accepted runs and steps per minute", "gridPos": { "x": 0, "y": 0, "w": 12, "h": 8 }, "targets": [{ "expr": "sum(rate(getratchet_runs_accepted_total[5m])) * 60", "legendFormat": "Runs", "refId": "A" }, { "expr": "sum(rate(getratchet_steps_accepted_total[5m])) * 60", "legendFormat": "Steps", "refId": "B" }] },
    { "id": 2, "type": "timeseries", "title": "Attempt outcomes per minute", "gridPos": { "x": 12, "y": 0, "w": 12, "h": 8 }, "targets": [{ "expr": "sum by (outcome) (rate(getratchet_attempts_total[5m])) * 60", "legendFormat": "{{outcome}}", "refId": "A" }] },
    { "id": 3, "type": "timeseries", "title": "Attempt duration p95 (ms)", "gridPos": { "x": 0, "y": 8, "w": 12, "h": 8 }, "targets": [{ "expr": "histogram_quantile(0.95, sum by (le) (rate(getratchet_attempt_duration_milliseconds_bucket[5m])))", "legendFormat": "p95", "refId": "A" }] },
    { "id": 4, "type": "timeseries", "title": "Retries and exhausted steps per minute", "gridPos": { "x": 12, "y": 8, "w": 12, "h": 8 }, "targets": [{ "expr": "sum(rate(getratchet_retries_total[5m])) * 60", "legendFormat": "Retries", "refId": "A" }, { "expr": "sum(rate(getratchet_steps_exhausted_total[5m])) * 60", "legendFormat": "Exhausted", "refId": "B" }] },
    { "id": 5, "type": "timeseries", "title": "Circuit transitions", "gridPos": { "x": 0, "y": 16, "w": 12, "h": 8 }, "targets": [{ "expr": "sum by (state) (increase(getratchet_circuit_transitions_total[5m]))", "legendFormat": "{{state}}", "refId": "A" }] },
    { "id": 6, "type": "timeseries", "title": "Queue depth and age", "gridPos": { "x": 12, "y": 16, "w": 12, "h": 8 }, "targets": [{ "expr": "max(getratchet_queue_depth)", "legendFormat": "Queued", "refId": "A" }, { "expr": "max(getratchet_queue_oldest_age_seconds)", "legendFormat": "Oldest age (s)", "refId": "B" }] },
    { "id": 7, "type": "timeseries", "title": "Worker heartbeat and lease expirations", "gridPos": { "x": 0, "y": 24, "w": 12, "h": 8 }, "targets": [{ "expr": "max(getratchet_worker_latest_heartbeat_age_seconds)", "legendFormat": "Latest heartbeat age (s)", "refId": "A" }, { "expr": "sum(increase(getratchet_worker_lease_expirations_total[5m]))", "legendFormat": "Lease expirations", "refId": "B" }] },
    { "id": 8, "type": "timeseries", "title": "Recovery outcomes", "gridPos": { "x": 12, "y": 24, "w": 12, "h": 8 }, "targets": [{ "expr": "sum by (state) (increase(getratchet_recovery_items_total[5m]))", "legendFormat": "{{state}}", "refId": "A" }] },
    { "id": 9, "type": "timeseries", "title": "API requests and server errors per minute", "gridPos": { "x": 0, "y": 32, "w": 12, "h": 8 }, "targets": [{ "expr": "sum(rate(getratchet_api_requests_total[5m])) * 60", "legendFormat": "All", "refId": "A" }, { "expr": "sum(rate(getratchet_api_requests_total{status_class=\"5xx\"}[5m])) * 60", "legendFormat": "5xx", "refId": "B" }] },
    { "id": 10, "type": "timeseries", "title": "API handler duration p95 (ms)", "gridPos": { "x": 12, "y": 32, "w": 12, "h": 8 }, "targets": [{ "expr": "histogram_quantile(0.95, sum by (le) (rate(getratchet_api_request_duration_milliseconds_bucket[5m])))", "legendFormat": "p95", "refId": "A" }] }
  ]
}
