@senad-d/observme 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/.env.example +57 -0
  2. package/CHANGELOG.md +52 -0
  3. package/LICENSE +21 -0
  4. package/ObservMe-Production-Docs/00-README.md +79 -0
  5. package/ObservMe-Production-Docs/01-requirements-and-scope.md +207 -0
  6. package/ObservMe-Production-Docs/02-reference-architecture.md +306 -0
  7. package/ObservMe-Production-Docs/03-pi-event-and-session-model.md +266 -0
  8. package/ObservMe-Production-Docs/04-telemetry-semantic-conventions.md +722 -0
  9. package/ObservMe-Production-Docs/05-otel-pipeline-and-collector.md +355 -0
  10. package/ObservMe-Production-Docs/06-security-privacy-redaction.md +294 -0
  11. package/ObservMe-Production-Docs/07-extension-implementation-blueprint.md +447 -0
  12. package/ObservMe-Production-Docs/08-query-grafana-integration.md +276 -0
  13. package/ObservMe-Production-Docs/09-dashboards-alerts-slos.md +640 -0
  14. package/ObservMe-Production-Docs/10-testing-release-operations.md +319 -0
  15. package/ObservMe-Production-Docs/11-deployment-runbooks.md +203 -0
  16. package/ObservMe-Production-Docs/12-configuration-reference.md +337 -0
  17. package/ObservMe-Production-Docs/13-source-notes.md +33 -0
  18. package/ObservMe-Production-Docs/pi-session-format.md +427 -0
  19. package/README.md +356 -0
  20. package/SECURITY.md +45 -0
  21. package/dashboards/observme-agent-node-graphs.json +250 -0
  22. package/dashboards/observme-agents.json +1880 -0
  23. package/dashboards/observme-alerts.yaml +113 -0
  24. package/dashboards/observme-branches-compactions.json +1042 -0
  25. package/dashboards/observme-cost.json +1254 -0
  26. package/dashboards/observme-errors.json +1659 -0
  27. package/dashboards/observme-export-health.json +1802 -0
  28. package/dashboards/observme-latency.json +1494 -0
  29. package/dashboards/observme-llm-conversations.json +730 -0
  30. package/dashboards/observme-logs-llm.json +644 -0
  31. package/dashboards/observme-models.json +933 -0
  32. package/dashboards/observme-overview.json +2129 -0
  33. package/dashboards/observme-slo-health.json +737 -0
  34. package/dashboards/observme-slos.yaml +56 -0
  35. package/dashboards/observme-tools.json +902 -0
  36. package/dashboards/observme-trace-journey.json +1793 -0
  37. package/docs/STRUCTURE.md +49 -0
  38. package/docs/agent-subagent-observability-requirements.md +997 -0
  39. package/docs/compatibility-matrix.md +39 -0
  40. package/docs/configuration-tui-design-standard.md +767 -0
  41. package/docs/configuration.md +38 -0
  42. package/docs/review-validation.md +115 -0
  43. package/docs/validation-flow.md +117 -0
  44. package/examples/collector.yaml +123 -0
  45. package/examples/observme.yaml +131 -0
  46. package/img/demo.gif +0 -0
  47. package/img/icon.svg +47 -0
  48. package/package.json +103 -0
  49. package/src/commands/obs-agents-runtime.ts +150 -0
  50. package/src/commands/obs-agents.ts +491 -0
  51. package/src/commands/obs-args.ts +63 -0
  52. package/src/commands/obs-backfill.ts +1334 -0
  53. package/src/commands/obs-command-support.ts +43 -0
  54. package/src/commands/obs-cost.ts +228 -0
  55. package/src/commands/obs-diagnostics.ts +22 -0
  56. package/src/commands/obs-errors.ts +156 -0
  57. package/src/commands/obs-health.ts +301 -0
  58. package/src/commands/obs-link.ts +90 -0
  59. package/src/commands/obs-logs.ts +194 -0
  60. package/src/commands/obs-loki-summary.ts +184 -0
  61. package/src/commands/obs-session.ts +259 -0
  62. package/src/commands/obs-status.ts +359 -0
  63. package/src/commands/obs-tools.ts +274 -0
  64. package/src/commands/obs-trace.ts +411 -0
  65. package/src/commands/obs.ts +211 -0
  66. package/src/config/bootstrap-project-config.ts +300 -0
  67. package/src/config/defaults.ts +143 -0
  68. package/src/config/load-config.ts +631 -0
  69. package/src/config/project-paths.ts +61 -0
  70. package/src/config/schema.ts +405 -0
  71. package/src/config/validate.ts +456 -0
  72. package/src/constants.ts +4 -0
  73. package/src/diagnostics/sanitize.ts +6 -0
  74. package/src/extension.ts +38 -0
  75. package/src/otel/logs.ts +160 -0
  76. package/src/otel/metrics.ts +165 -0
  77. package/src/otel/otlp-endpoint.ts +10 -0
  78. package/src/otel/sdk.ts +114 -0
  79. package/src/otel/shutdown.ts +102 -0
  80. package/src/otel/traces.ts +166 -0
  81. package/src/pi/agent-lineage.ts +378 -0
  82. package/src/pi/agent-tree-tracker.ts +258 -0
  83. package/src/pi/event-handlers/agent-turn.ts +155 -0
  84. package/src/pi/event-handlers/lifecycle.ts +642 -0
  85. package/src/pi/event-handlers/llm.ts +115 -0
  86. package/src/pi/event-handlers/session-events.ts +159 -0
  87. package/src/pi/event-handlers/tool-bash.ts +275 -0
  88. package/src/pi/handler-internals.ts +2154 -0
  89. package/src/pi/handler-runtime.ts +633 -0
  90. package/src/pi/handler-types.ts +261 -0
  91. package/src/pi/handlers.ts +75 -0
  92. package/src/pi/subagent-spawn.ts +975 -0
  93. package/src/pi/subagent-types.ts +29 -0
  94. package/src/privacy/content-capture.ts +104 -0
  95. package/src/privacy/hash.ts +93 -0
  96. package/src/privacy/redact.ts +619 -0
  97. package/src/privacy/secret-patterns.ts +185 -0
  98. package/src/privacy/truncate.ts +69 -0
  99. package/src/query/grafana-readiness.ts +164 -0
  100. package/src/query/grafana-transport.ts +481 -0
  101. package/src/query/grafana.ts +371 -0
  102. package/src/query/loki.ts +332 -0
  103. package/src/query/prometheus.ts +388 -0
  104. package/src/query/tempo.ts +332 -0
  105. package/src/safety/sensitive-input.ts +208 -0
  106. package/src/semconv/attributes.ts +279 -0
  107. package/src/semconv/metrics.ts +146 -0
  108. package/src/semconv/spans.ts +19 -0
  109. package/src/semconv/values.ts +13 -0
  110. package/src/util/bounded-map.ts +97 -0
  111. package/tsconfig.json +15 -0
@@ -0,0 +1,2129 @@
1
+ {
2
+ "__requires": [
3
+ {
4
+ "id": "grafana",
5
+ "name": "Grafana",
6
+ "type": "grafana",
7
+ "version": "10.0.0"
8
+ },
9
+ {
10
+ "id": "prometheus",
11
+ "name": "Prometheus",
12
+ "type": "datasource",
13
+ "version": "1.0.0"
14
+ },
15
+ {
16
+ "id": "row",
17
+ "name": "Row",
18
+ "type": "panel",
19
+ "version": ""
20
+ },
21
+ {
22
+ "id": "stat",
23
+ "name": "Stat",
24
+ "type": "panel",
25
+ "version": ""
26
+ },
27
+ {
28
+ "id": "timeseries",
29
+ "name": "Time series",
30
+ "type": "panel",
31
+ "version": ""
32
+ },
33
+ {
34
+ "id": "bargauge",
35
+ "name": "Bar gauge",
36
+ "type": "panel",
37
+ "version": ""
38
+ },
39
+ {
40
+ "id": "text",
41
+ "name": "Text",
42
+ "type": "panel",
43
+ "version": ""
44
+ }
45
+ ],
46
+ "annotations": {
47
+ "list": []
48
+ },
49
+ "editable": true,
50
+ "fiscalYearStartMonth": 0,
51
+ "graphTooltip": 0,
52
+ "id": null,
53
+ "links": [
54
+ {
55
+ "icon": "external link",
56
+ "includeVars": true,
57
+ "keepTime": true,
58
+ "targetBlank": false,
59
+ "title": "Cost",
60
+ "tooltip": "Open the Cost dashboard with the current time range.",
61
+ "type": "link",
62
+ "url": "/d/observme-cost/observme-cost?${__url_time_range}"
63
+ },
64
+ {
65
+ "icon": "external link",
66
+ "includeVars": true,
67
+ "keepTime": true,
68
+ "targetBlank": false,
69
+ "title": "Models",
70
+ "tooltip": "Open the Models dashboard with the current time range.",
71
+ "type": "link",
72
+ "url": "/d/observme-models/observme-models?${__url_time_range}"
73
+ },
74
+ {
75
+ "icon": "external link",
76
+ "includeVars": true,
77
+ "keepTime": true,
78
+ "targetBlank": false,
79
+ "title": "Latency",
80
+ "tooltip": "Open the Latency dashboard with the current time range.",
81
+ "type": "link",
82
+ "url": "/d/observme-latency/observme-latency?${__url_time_range}"
83
+ },
84
+ {
85
+ "icon": "external link",
86
+ "includeVars": true,
87
+ "keepTime": true,
88
+ "targetBlank": false,
89
+ "title": "Tools",
90
+ "tooltip": "Open the Tools dashboard with the current time range.",
91
+ "type": "link",
92
+ "url": "/d/observme-tools/observme-tools?${__url_time_range}"
93
+ },
94
+ {
95
+ "icon": "external link",
96
+ "includeVars": true,
97
+ "keepTime": true,
98
+ "targetBlank": false,
99
+ "title": "Agents",
100
+ "tooltip": "Open the Agents dashboard with the current time range.",
101
+ "type": "link",
102
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
103
+ },
104
+ {
105
+ "icon": "external link",
106
+ "includeVars": true,
107
+ "keepTime": true,
108
+ "targetBlank": false,
109
+ "title": "Agent Node Graphs",
110
+ "tooltip": "Open the aggregate Agent Node Graphs dashboard with the current time range.",
111
+ "type": "link",
112
+ "url": "/d/observme-agent-node-graphs/observme-agent-node-graphs?${__url_time_range}"
113
+ },
114
+ {
115
+ "icon": "external link",
116
+ "includeVars": true,
117
+ "keepTime": true,
118
+ "targetBlank": false,
119
+ "title": "Trace Journey",
120
+ "tooltip": "Open the Trace Journey dashboard with the current time range.",
121
+ "type": "link",
122
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
123
+ },
124
+ {
125
+ "icon": "external link",
126
+ "includeVars": true,
127
+ "keepTime": true,
128
+ "targetBlank": false,
129
+ "title": "Errors",
130
+ "tooltip": "Open the Errors dashboard with the current time range.",
131
+ "type": "link",
132
+ "url": "/d/observme-errors/observme-errors?${__url_time_range}"
133
+ },
134
+ {
135
+ "icon": "external link",
136
+ "includeVars": true,
137
+ "keepTime": true,
138
+ "targetBlank": false,
139
+ "title": "Export Health",
140
+ "tooltip": "Open the Export Health dashboard with the current time range.",
141
+ "type": "link",
142
+ "url": "/d/observme-export-health/observme-export-health?${__url_time_range}"
143
+ },
144
+ {
145
+ "icon": "external link",
146
+ "includeVars": true,
147
+ "keepTime": true,
148
+ "targetBlank": false,
149
+ "title": "SLO Health",
150
+ "tooltip": "Open the SLO Health dashboard with the current time range.",
151
+ "type": "link",
152
+ "url": "/d/observme-slo-health/observme-slo-health?${__url_time_range}"
153
+ },
154
+ {
155
+ "icon": "external link",
156
+ "includeVars": true,
157
+ "keepTime": true,
158
+ "targetBlank": false,
159
+ "title": "Logs and LLM I/O",
160
+ "tooltip": "Open the privacy-safe Logs and LLM I/O dashboard with the current time range.",
161
+ "type": "link",
162
+ "url": "/d/observme-logs-llm/observme-logs-llm?${__url_time_range}"
163
+ },
164
+ {
165
+ "icon": "external link",
166
+ "includeVars": true,
167
+ "keepTime": true,
168
+ "targetBlank": false,
169
+ "title": "LLM Conversations",
170
+ "tooltip": "Open the redacted opt-in LLM Conversations dashboard with the current time range.",
171
+ "type": "link",
172
+ "url": "/d/observme-llm-conversations/observme-llm-conversations?${__url_time_range}"
173
+ }
174
+ ],
175
+ "liveNow": false,
176
+ "panels": [
177
+ {
178
+ "collapsed": false,
179
+ "gridPos": {
180
+ "h": 1,
181
+ "w": 24,
182
+ "x": 0,
183
+ "y": 0
184
+ },
185
+ "id": 100,
186
+ "panels": [],
187
+ "title": "Health",
188
+ "type": "row"
189
+ },
190
+ {
191
+ "datasource": {
192
+ "type": "prometheus",
193
+ "uid": "prometheus"
194
+ },
195
+ "description": "Selected-range Observability Export health against the canonical 99% objective. This compact landing-page chip intentionally renders no observed workload as healthy idle; open SLO Health to distinguish no-workload scorecard state from measured attainment.",
196
+ "fieldConfig": {
197
+ "defaults": {
198
+ "color": {
199
+ "mode": "thresholds"
200
+ },
201
+ "mappings": [],
202
+ "thresholds": {
203
+ "mode": "absolute",
204
+ "steps": [
205
+ {
206
+ "color": "red",
207
+ "value": null
208
+ },
209
+ {
210
+ "color": "yellow",
211
+ "value": 0.95
212
+ },
213
+ {
214
+ "color": "green",
215
+ "value": 0.99
216
+ }
217
+ ]
218
+ },
219
+ "unit": "percentunit"
220
+ },
221
+ "overrides": []
222
+ },
223
+ "gridPos": {
224
+ "h": 4,
225
+ "w": 4,
226
+ "x": 0,
227
+ "y": 1
228
+ },
229
+ "id": 1,
230
+ "links": [
231
+ {
232
+ "targetBlank": false,
233
+ "title": "Open Export Health",
234
+ "url": "/d/observme-export-health/observme-export-health?${__url_time_range}"
235
+ },
236
+ {
237
+ "targetBlank": false,
238
+ "title": "Open SLO Health",
239
+ "url": "/d/observme-slo-health/observme-slo-health?${__url_time_range}"
240
+ }
241
+ ],
242
+ "options": {
243
+ "colorMode": "value",
244
+ "graphMode": "area",
245
+ "justifyMode": "auto",
246
+ "orientation": "auto",
247
+ "reduceOptions": {
248
+ "calcs": [
249
+ "lastNotNull"
250
+ ],
251
+ "fields": "",
252
+ "values": false
253
+ },
254
+ "showPercentChange": false,
255
+ "textMode": "auto",
256
+ "wideLayout": true
257
+ },
258
+ "pluginVersion": "11.1.0",
259
+ "targets": [
260
+ {
261
+ "datasource": {
262
+ "type": "prometheus",
263
+ "uid": "prometheus"
264
+ },
265
+ "editorMode": "code",
266
+ "expr": "clamp_max(clamp_min(1 - ((sum(rate(observme_telemetry_dropped_total[$__range])) or vector(0)) / clamp_min((sum(rate(observme_events_observed_total[$__range])) or vector(0)), 1e-9)), 0), 1)",
267
+ "instant": true,
268
+ "range": false,
269
+ "refId": "A"
270
+ }
271
+ ],
272
+ "title": "Export health",
273
+ "type": "stat"
274
+ },
275
+ {
276
+ "datasource": {
277
+ "type": "prometheus",
278
+ "uid": "prometheus"
279
+ },
280
+ "description": "Selected-range Agent Lineage health against the canonical 99% objective. The failure numerator uses lineage-missing spawn failures, orphan agents, and trace-context propagation failures; no spawns intentionally render as healthy idle on this landing page.",
281
+ "fieldConfig": {
282
+ "defaults": {
283
+ "color": {
284
+ "mode": "thresholds"
285
+ },
286
+ "mappings": [],
287
+ "thresholds": {
288
+ "mode": "absolute",
289
+ "steps": [
290
+ {
291
+ "color": "red",
292
+ "value": null
293
+ },
294
+ {
295
+ "color": "yellow",
296
+ "value": 0.95
297
+ },
298
+ {
299
+ "color": "green",
300
+ "value": 0.99
301
+ }
302
+ ]
303
+ },
304
+ "unit": "percentunit"
305
+ },
306
+ "overrides": []
307
+ },
308
+ "gridPos": {
309
+ "h": 4,
310
+ "w": 4,
311
+ "x": 4,
312
+ "y": 1
313
+ },
314
+ "id": 2,
315
+ "links": [
316
+ {
317
+ "targetBlank": false,
318
+ "title": "Open Agents",
319
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
320
+ },
321
+ {
322
+ "targetBlank": false,
323
+ "title": "Open Trace Journey",
324
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
325
+ },
326
+ {
327
+ "targetBlank": false,
328
+ "title": "Open SLO Health",
329
+ "url": "/d/observme-slo-health/observme-slo-health?${__url_time_range}"
330
+ }
331
+ ],
332
+ "options": {
333
+ "colorMode": "value",
334
+ "graphMode": "area",
335
+ "justifyMode": "auto",
336
+ "orientation": "auto",
337
+ "reduceOptions": {
338
+ "calcs": [
339
+ "lastNotNull"
340
+ ],
341
+ "fields": "",
342
+ "values": false
343
+ },
344
+ "showPercentChange": false,
345
+ "textMode": "auto",
346
+ "wideLayout": true
347
+ },
348
+ "pluginVersion": "11.1.0",
349
+ "targets": [
350
+ {
351
+ "datasource": {
352
+ "type": "prometheus",
353
+ "uid": "prometheus"
354
+ },
355
+ "editorMode": "code",
356
+ "expr": "clamp_min(1 - (((sum(rate(observme_subagent_spawn_failures_total{reason=\"lineage_missing\"}[$__range])) or vector(0)) + (sum(rate(observme_orphan_agents_total[$__range])) or vector(0)) + (sum(rate(observme_trace_context_propagation_failures_total[$__range])) or vector(0))) / clamp_min((sum(rate(observme_subagents_spawned_total[$__range])) or vector(0)), 1e-9)), 0)",
357
+ "instant": true,
358
+ "range": false,
359
+ "refId": "A"
360
+ }
361
+ ],
362
+ "title": "Agent lineage health",
363
+ "type": "stat"
364
+ },
365
+ {
366
+ "datasource": {
367
+ "type": "prometheus",
368
+ "uid": "prometheus"
369
+ },
370
+ "description": "Selected-range Workflow Completion health against the canonical 99% objective. Completed plus explicitly failed terminal workflows are compared with starts; no starts intentionally render as healthy idle on this landing page.",
371
+ "fieldConfig": {
372
+ "defaults": {
373
+ "color": {
374
+ "mode": "thresholds"
375
+ },
376
+ "mappings": [],
377
+ "thresholds": {
378
+ "mode": "absolute",
379
+ "steps": [
380
+ {
381
+ "color": "red",
382
+ "value": null
383
+ },
384
+ {
385
+ "color": "yellow",
386
+ "value": 0.95
387
+ },
388
+ {
389
+ "color": "green",
390
+ "value": 0.99
391
+ }
392
+ ]
393
+ },
394
+ "unit": "percentunit"
395
+ },
396
+ "overrides": []
397
+ },
398
+ "gridPos": {
399
+ "h": 4,
400
+ "w": 4,
401
+ "x": 8,
402
+ "y": 1
403
+ },
404
+ "id": 3,
405
+ "links": [
406
+ {
407
+ "targetBlank": false,
408
+ "title": "Open Trace Journey",
409
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
410
+ },
411
+ {
412
+ "targetBlank": false,
413
+ "title": "Open Errors",
414
+ "url": "/d/observme-errors/observme-errors?${__url_time_range}"
415
+ },
416
+ {
417
+ "targetBlank": false,
418
+ "title": "Open SLO Health",
419
+ "url": "/d/observme-slo-health/observme-slo-health?${__url_time_range}"
420
+ }
421
+ ],
422
+ "options": {
423
+ "colorMode": "value",
424
+ "graphMode": "area",
425
+ "justifyMode": "auto",
426
+ "orientation": "auto",
427
+ "reduceOptions": {
428
+ "calcs": [
429
+ "lastNotNull"
430
+ ],
431
+ "fields": "",
432
+ "values": false
433
+ },
434
+ "showPercentChange": false,
435
+ "textMode": "auto",
436
+ "wideLayout": true
437
+ },
438
+ "pluginVersion": "11.1.0",
439
+ "targets": [
440
+ {
441
+ "datasource": {
442
+ "type": "prometheus",
443
+ "uid": "prometheus"
444
+ },
445
+ "editorMode": "code",
446
+ "expr": "clamp_max((((sum(increase(observme_workflows_completed_total[$__range])) or vector(0)) + (sum(increase(observme_workflow_errors_total[$__range])) or vector(0))) / clamp_min((sum(increase(observme_workflows_started_total[$__range])) or vector(0)), 1)) + ((sum(increase(observme_workflows_started_total[$__range])) or vector(0)) == bool 0), 1)",
447
+ "instant": true,
448
+ "range": false,
449
+ "refId": "A"
450
+ }
451
+ ],
452
+ "title": "Workflow completion health",
453
+ "type": "stat"
454
+ },
455
+ {
456
+ "datasource": {
457
+ "type": "prometheus",
458
+ "uid": "prometheus"
459
+ },
460
+ "description": "Current cross-domain failure pressure divided by the main workload counters. This is a landing-page index, not a canonical SLO because the failure families have different denominators; 2%/5% are tunable triage assumptions. Zero can mean healthy idle or no failures.",
461
+ "fieldConfig": {
462
+ "defaults": {
463
+ "color": {
464
+ "mode": "thresholds"
465
+ },
466
+ "mappings": [],
467
+ "thresholds": {
468
+ "mode": "absolute",
469
+ "steps": [
470
+ {
471
+ "color": "green",
472
+ "value": null
473
+ },
474
+ {
475
+ "color": "yellow",
476
+ "value": 0.02
477
+ },
478
+ {
479
+ "color": "red",
480
+ "value": 0.05
481
+ }
482
+ ]
483
+ },
484
+ "unit": "percentunit"
485
+ },
486
+ "overrides": []
487
+ },
488
+ "gridPos": {
489
+ "h": 4,
490
+ "w": 4,
491
+ "x": 12,
492
+ "y": 1
493
+ },
494
+ "id": 4,
495
+ "links": [
496
+ {
497
+ "targetBlank": false,
498
+ "title": "Open Errors",
499
+ "url": "/d/observme-errors/observme-errors?${__url_time_range}"
500
+ }
501
+ ],
502
+ "options": {
503
+ "colorMode": "value",
504
+ "graphMode": "area",
505
+ "justifyMode": "auto",
506
+ "orientation": "auto",
507
+ "reduceOptions": {
508
+ "calcs": [
509
+ "lastNotNull"
510
+ ],
511
+ "fields": "",
512
+ "values": false
513
+ },
514
+ "showPercentChange": false,
515
+ "textMode": "auto",
516
+ "wideLayout": true
517
+ },
518
+ "pluginVersion": "11.1.0",
519
+ "targets": [
520
+ {
521
+ "datasource": {
522
+ "type": "prometheus",
523
+ "uid": "prometheus"
524
+ },
525
+ "editorMode": "code",
526
+ "expr": "(((sum(rate(observme_workflow_errors_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_agent_run_errors_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_llm_errors_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_tool_failures_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_handler_errors_total[$__rate_interval])) or vector(0))) / clamp_min(((sum(rate(observme_turns_completed_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_llm_requests_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_tool_calls_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_agent_runs_total[$__rate_interval])) or vector(0))), 1e-9))",
527
+ "instant": true,
528
+ "range": false,
529
+ "refId": "A"
530
+ }
531
+ ],
532
+ "title": "Error pressure",
533
+ "type": "stat"
534
+ },
535
+ {
536
+ "datasource": {
537
+ "type": "prometheus",
538
+ "uid": "prometheus"
539
+ },
540
+ "description": "Estimated LLM cost burn per hour over the selected range. The red 50 USD/h reference matches ObservMeCostSpike; the yellow 10 USD/h early warning is a tunable budget assumption. Grafana's positive $__range_s scalar is used directly in arithmetic.",
541
+ "fieldConfig": {
542
+ "defaults": {
543
+ "color": {
544
+ "mode": "thresholds"
545
+ },
546
+ "mappings": [],
547
+ "thresholds": {
548
+ "mode": "absolute",
549
+ "steps": [
550
+ {
551
+ "color": "green",
552
+ "value": null
553
+ },
554
+ {
555
+ "color": "yellow",
556
+ "value": 10
557
+ },
558
+ {
559
+ "color": "red",
560
+ "value": 50
561
+ }
562
+ ]
563
+ },
564
+ "unit": "currencyUSD"
565
+ },
566
+ "overrides": []
567
+ },
568
+ "gridPos": {
569
+ "h": 4,
570
+ "w": 4,
571
+ "x": 16,
572
+ "y": 1
573
+ },
574
+ "id": 5,
575
+ "links": [
576
+ {
577
+ "targetBlank": false,
578
+ "title": "Open Cost",
579
+ "url": "/d/observme-cost/observme-cost?${__url_time_range}"
580
+ }
581
+ ],
582
+ "options": {
583
+ "colorMode": "value",
584
+ "graphMode": "area",
585
+ "justifyMode": "auto",
586
+ "orientation": "auto",
587
+ "reduceOptions": {
588
+ "calcs": [
589
+ "lastNotNull"
590
+ ],
591
+ "fields": "",
592
+ "values": false
593
+ },
594
+ "showPercentChange": false,
595
+ "textMode": "auto",
596
+ "wideLayout": true
597
+ },
598
+ "pluginVersion": "11.1.0",
599
+ "targets": [
600
+ {
601
+ "datasource": {
602
+ "type": "prometheus",
603
+ "uid": "prometheus"
604
+ },
605
+ "editorMode": "code",
606
+ "expr": "(sum(increase(observme_llm_cost_usd_total[$__range])) or vector(0)) / ($__range_s / 3600)",
607
+ "instant": true,
608
+ "range": false,
609
+ "refId": "A"
610
+ }
611
+ ],
612
+ "title": "Cost burn / hour",
613
+ "type": "stat"
614
+ },
615
+ {
616
+ "datasource": {
617
+ "type": "prometheus",
618
+ "uid": "prometheus"
619
+ },
620
+ "description": "p95 turn latency as the first user-facing latency check. The 30s/60s thresholds are tunable operational assumptions, not alert defaults. A zero fallback keeps the chip compact during idle ranges but can also indicate absent duration instrumentation; verify Latency volume and Export Health when unexpected.",
621
+ "fieldConfig": {
622
+ "defaults": {
623
+ "color": {
624
+ "mode": "thresholds"
625
+ },
626
+ "mappings": [],
627
+ "thresholds": {
628
+ "mode": "absolute",
629
+ "steps": [
630
+ {
631
+ "color": "green",
632
+ "value": null
633
+ },
634
+ {
635
+ "color": "yellow",
636
+ "value": 30000
637
+ },
638
+ {
639
+ "color": "red",
640
+ "value": 60000
641
+ }
642
+ ]
643
+ },
644
+ "unit": "ms"
645
+ },
646
+ "overrides": []
647
+ },
648
+ "gridPos": {
649
+ "h": 4,
650
+ "w": 4,
651
+ "x": 20,
652
+ "y": 1
653
+ },
654
+ "id": 6,
655
+ "links": [
656
+ {
657
+ "targetBlank": false,
658
+ "title": "Open Latency",
659
+ "url": "/d/observme-latency/observme-latency?${__url_time_range}"
660
+ },
661
+ {
662
+ "targetBlank": false,
663
+ "title": "Open Trace Journey",
664
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
665
+ }
666
+ ],
667
+ "options": {
668
+ "colorMode": "value",
669
+ "graphMode": "area",
670
+ "justifyMode": "auto",
671
+ "orientation": "auto",
672
+ "reduceOptions": {
673
+ "calcs": [
674
+ "lastNotNull"
675
+ ],
676
+ "fields": "",
677
+ "values": false
678
+ },
679
+ "showPercentChange": false,
680
+ "textMode": "auto",
681
+ "wideLayout": true
682
+ },
683
+ "pluginVersion": "11.1.0",
684
+ "targets": [
685
+ {
686
+ "datasource": {
687
+ "type": "prometheus",
688
+ "uid": "prometheus"
689
+ },
690
+ "editorMode": "code",
691
+ "expr": "histogram_quantile(0.95, sum(rate(observme_turn_duration_ms_bucket[$__rate_interval])) by (le)) or vector(0)",
692
+ "instant": true,
693
+ "range": false,
694
+ "refId": "A"
695
+ }
696
+ ],
697
+ "title": "Latency health",
698
+ "type": "stat"
699
+ },
700
+ {
701
+ "collapsed": false,
702
+ "gridPos": {
703
+ "h": 1,
704
+ "w": 24,
705
+ "x": 0,
706
+ "y": 5
707
+ },
708
+ "id": 101,
709
+ "panels": [],
710
+ "title": "Workload",
711
+ "type": "row"
712
+ },
713
+ {
714
+ "datasource": {
715
+ "type": "prometheus",
716
+ "uid": "prometheus"
717
+ },
718
+ "description": "Estimated currently active sessions from started minus shutdown counters. This is an estimate and can reset with process restarts; zero can mean healthy idle.",
719
+ "fieldConfig": {
720
+ "defaults": {
721
+ "color": {
722
+ "mode": "palette-classic"
723
+ },
724
+ "mappings": [],
725
+ "thresholds": {
726
+ "mode": "absolute",
727
+ "steps": [
728
+ {
729
+ "color": "green",
730
+ "value": null
731
+ }
732
+ ]
733
+ },
734
+ "unit": "short"
735
+ },
736
+ "overrides": []
737
+ },
738
+ "gridPos": {
739
+ "h": 5,
740
+ "w": 4,
741
+ "x": 0,
742
+ "y": 6
743
+ },
744
+ "id": 7,
745
+ "links": [
746
+ {
747
+ "targetBlank": false,
748
+ "title": "Open Trace Journey",
749
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
750
+ }
751
+ ],
752
+ "options": {
753
+ "colorMode": "value",
754
+ "graphMode": "area",
755
+ "justifyMode": "auto",
756
+ "orientation": "auto",
757
+ "reduceOptions": {
758
+ "calcs": [
759
+ "lastNotNull"
760
+ ],
761
+ "fields": "",
762
+ "values": false
763
+ },
764
+ "showPercentChange": false,
765
+ "textMode": "auto",
766
+ "wideLayout": true
767
+ },
768
+ "pluginVersion": "11.1.0",
769
+ "targets": [
770
+ {
771
+ "datasource": {
772
+ "type": "prometheus",
773
+ "uid": "prometheus"
774
+ },
775
+ "editorMode": "code",
776
+ "expr": "clamp_min((sum(observme_sessions_started_total) or vector(0)) - (sum(observme_sessions_shutdown_total) or vector(0)), 0)",
777
+ "range": true,
778
+ "refId": "A"
779
+ }
780
+ ],
781
+ "title": "Active sessions estimate",
782
+ "type": "stat"
783
+ },
784
+ {
785
+ "datasource": {
786
+ "type": "prometheus",
787
+ "uid": "prometheus"
788
+ },
789
+ "description": "Completed turns per minute, shown as a compact KPI with sparkline. Zero means no completed turns were observed in the interval and can be healthy idle.",
790
+ "fieldConfig": {
791
+ "defaults": {
792
+ "color": {
793
+ "mode": "palette-classic"
794
+ },
795
+ "mappings": [],
796
+ "thresholds": {
797
+ "mode": "absolute",
798
+ "steps": [
799
+ {
800
+ "color": "green",
801
+ "value": null
802
+ }
803
+ ]
804
+ },
805
+ "unit": "short"
806
+ },
807
+ "overrides": []
808
+ },
809
+ "gridPos": {
810
+ "h": 5,
811
+ "w": 4,
812
+ "x": 4,
813
+ "y": 6
814
+ },
815
+ "id": 8,
816
+ "links": [
817
+ {
818
+ "targetBlank": false,
819
+ "title": "Open Latency",
820
+ "url": "/d/observme-latency/observme-latency?${__url_time_range}"
821
+ }
822
+ ],
823
+ "options": {
824
+ "colorMode": "value",
825
+ "graphMode": "area",
826
+ "justifyMode": "auto",
827
+ "orientation": "auto",
828
+ "reduceOptions": {
829
+ "calcs": [
830
+ "lastNotNull"
831
+ ],
832
+ "fields": "",
833
+ "values": false
834
+ },
835
+ "showPercentChange": false,
836
+ "textMode": "auto",
837
+ "wideLayout": true
838
+ },
839
+ "pluginVersion": "11.1.0",
840
+ "targets": [
841
+ {
842
+ "datasource": {
843
+ "type": "prometheus",
844
+ "uid": "prometheus"
845
+ },
846
+ "editorMode": "code",
847
+ "expr": "60 * (sum(rate(observme_turns_completed_total[$__rate_interval])) or vector(0))",
848
+ "range": true,
849
+ "refId": "A"
850
+ }
851
+ ],
852
+ "title": "Turns/min",
853
+ "type": "stat"
854
+ },
855
+ {
856
+ "datasource": {
857
+ "type": "prometheus",
858
+ "uid": "prometheus"
859
+ },
860
+ "description": "LLM requests per minute. Zero means no requests were observed in the interval and can be healthy idle; use Models or Cost for provider/model breakdowns.",
861
+ "fieldConfig": {
862
+ "defaults": {
863
+ "color": {
864
+ "mode": "palette-classic"
865
+ },
866
+ "mappings": [],
867
+ "thresholds": {
868
+ "mode": "absolute",
869
+ "steps": [
870
+ {
871
+ "color": "green",
872
+ "value": null
873
+ }
874
+ ]
875
+ },
876
+ "unit": "short"
877
+ },
878
+ "overrides": []
879
+ },
880
+ "gridPos": {
881
+ "h": 5,
882
+ "w": 4,
883
+ "x": 8,
884
+ "y": 6
885
+ },
886
+ "id": 9,
887
+ "links": [
888
+ {
889
+ "targetBlank": false,
890
+ "title": "Open Models",
891
+ "url": "/d/observme-models/observme-models?${__url_time_range}"
892
+ }
893
+ ],
894
+ "options": {
895
+ "colorMode": "value",
896
+ "graphMode": "area",
897
+ "justifyMode": "auto",
898
+ "orientation": "auto",
899
+ "reduceOptions": {
900
+ "calcs": [
901
+ "lastNotNull"
902
+ ],
903
+ "fields": "",
904
+ "values": false
905
+ },
906
+ "showPercentChange": false,
907
+ "textMode": "auto",
908
+ "wideLayout": true
909
+ },
910
+ "pluginVersion": "11.1.0",
911
+ "targets": [
912
+ {
913
+ "datasource": {
914
+ "type": "prometheus",
915
+ "uid": "prometheus"
916
+ },
917
+ "editorMode": "code",
918
+ "expr": "60 * (sum(rate(observme_llm_requests_total[$__rate_interval])) or vector(0))",
919
+ "range": true,
920
+ "refId": "A"
921
+ }
922
+ ],
923
+ "title": "LLM requests/min",
924
+ "type": "stat"
925
+ },
926
+ {
927
+ "datasource": {
928
+ "type": "prometheus",
929
+ "uid": "prometheus"
930
+ },
931
+ "description": "Tool calls per minute. Zero means no calls were observed in the interval and can be healthy idle; open Tools for reliability and slow-tool breakdowns.",
932
+ "fieldConfig": {
933
+ "defaults": {
934
+ "color": {
935
+ "mode": "palette-classic"
936
+ },
937
+ "mappings": [],
938
+ "thresholds": {
939
+ "mode": "absolute",
940
+ "steps": [
941
+ {
942
+ "color": "green",
943
+ "value": null
944
+ }
945
+ ]
946
+ },
947
+ "unit": "short"
948
+ },
949
+ "overrides": []
950
+ },
951
+ "gridPos": {
952
+ "h": 5,
953
+ "w": 4,
954
+ "x": 12,
955
+ "y": 6
956
+ },
957
+ "id": 10,
958
+ "links": [
959
+ {
960
+ "targetBlank": false,
961
+ "title": "Open Tools",
962
+ "url": "/d/observme-tools/observme-tools?${__url_time_range}"
963
+ }
964
+ ],
965
+ "options": {
966
+ "colorMode": "value",
967
+ "graphMode": "area",
968
+ "justifyMode": "auto",
969
+ "orientation": "auto",
970
+ "reduceOptions": {
971
+ "calcs": [
972
+ "lastNotNull"
973
+ ],
974
+ "fields": "",
975
+ "values": false
976
+ },
977
+ "showPercentChange": false,
978
+ "textMode": "auto",
979
+ "wideLayout": true
980
+ },
981
+ "pluginVersion": "11.1.0",
982
+ "targets": [
983
+ {
984
+ "datasource": {
985
+ "type": "prometheus",
986
+ "uid": "prometheus"
987
+ },
988
+ "editorMode": "code",
989
+ "expr": "60 * (sum(rate(observme_tool_calls_total[$__rate_interval])) or vector(0))",
990
+ "range": true,
991
+ "refId": "A"
992
+ }
993
+ ],
994
+ "title": "Tool calls/min",
995
+ "type": "stat"
996
+ },
997
+ {
998
+ "datasource": {
999
+ "type": "prometheus",
1000
+ "uid": "prometheus"
1001
+ },
1002
+ "description": "Subagent spawns per minute across all roles and depths. Zero means no spawns were observed in the interval and can be healthy idle; open Agents or Trace Journey for lineage details.",
1003
+ "fieldConfig": {
1004
+ "defaults": {
1005
+ "color": {
1006
+ "mode": "palette-classic"
1007
+ },
1008
+ "mappings": [],
1009
+ "thresholds": {
1010
+ "mode": "absolute",
1011
+ "steps": [
1012
+ {
1013
+ "color": "green",
1014
+ "value": null
1015
+ }
1016
+ ]
1017
+ },
1018
+ "unit": "short"
1019
+ },
1020
+ "overrides": []
1021
+ },
1022
+ "gridPos": {
1023
+ "h": 5,
1024
+ "w": 4,
1025
+ "x": 16,
1026
+ "y": 6
1027
+ },
1028
+ "id": 11,
1029
+ "links": [
1030
+ {
1031
+ "targetBlank": false,
1032
+ "title": "Open Agents",
1033
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
1034
+ },
1035
+ {
1036
+ "targetBlank": false,
1037
+ "title": "Open Trace Journey",
1038
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
1039
+ }
1040
+ ],
1041
+ "options": {
1042
+ "colorMode": "value",
1043
+ "graphMode": "area",
1044
+ "justifyMode": "auto",
1045
+ "orientation": "auto",
1046
+ "reduceOptions": {
1047
+ "calcs": [
1048
+ "lastNotNull"
1049
+ ],
1050
+ "fields": "",
1051
+ "values": false
1052
+ },
1053
+ "showPercentChange": false,
1054
+ "textMode": "auto",
1055
+ "wideLayout": true
1056
+ },
1057
+ "pluginVersion": "11.1.0",
1058
+ "targets": [
1059
+ {
1060
+ "datasource": {
1061
+ "type": "prometheus",
1062
+ "uid": "prometheus"
1063
+ },
1064
+ "editorMode": "code",
1065
+ "expr": "60 * (sum(rate(observme_subagents_spawned_total[$__rate_interval])) or vector(0))",
1066
+ "range": true,
1067
+ "refId": "A"
1068
+ }
1069
+ ],
1070
+ "title": "Subagent spawns/min",
1071
+ "type": "stat"
1072
+ },
1073
+ {
1074
+ "datasource": {
1075
+ "type": "prometheus",
1076
+ "uid": "prometheus"
1077
+ },
1078
+ "description": "Currently active ObservMe agent runtimes. Zero can mean healthy idle. Red at 100 references the tunable ObservMeActiveAgentsStuckHigh default; yellow at 50 is an early-warning assumption. Compare sustained values with fan-out and depth.",
1079
+ "fieldConfig": {
1080
+ "defaults": {
1081
+ "color": {
1082
+ "mode": "palette-classic"
1083
+ },
1084
+ "mappings": [],
1085
+ "thresholds": {
1086
+ "mode": "absolute",
1087
+ "steps": [
1088
+ {
1089
+ "color": "green",
1090
+ "value": null
1091
+ },
1092
+ {
1093
+ "color": "yellow",
1094
+ "value": 50
1095
+ },
1096
+ {
1097
+ "color": "red",
1098
+ "value": 100
1099
+ }
1100
+ ]
1101
+ },
1102
+ "unit": "short"
1103
+ },
1104
+ "overrides": []
1105
+ },
1106
+ "gridPos": {
1107
+ "h": 5,
1108
+ "w": 4,
1109
+ "x": 20,
1110
+ "y": 6
1111
+ },
1112
+ "id": 12,
1113
+ "links": [
1114
+ {
1115
+ "targetBlank": false,
1116
+ "title": "Open Agents",
1117
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
1118
+ }
1119
+ ],
1120
+ "options": {
1121
+ "colorMode": "value",
1122
+ "graphMode": "area",
1123
+ "justifyMode": "auto",
1124
+ "orientation": "auto",
1125
+ "reduceOptions": {
1126
+ "calcs": [
1127
+ "lastNotNull"
1128
+ ],
1129
+ "fields": "",
1130
+ "values": false
1131
+ },
1132
+ "showPercentChange": false,
1133
+ "textMode": "auto",
1134
+ "wideLayout": true
1135
+ },
1136
+ "pluginVersion": "11.1.0",
1137
+ "targets": [
1138
+ {
1139
+ "datasource": {
1140
+ "type": "prometheus",
1141
+ "uid": "prometheus"
1142
+ },
1143
+ "editorMode": "code",
1144
+ "expr": "sum(observme_active_agents) or vector(0)",
1145
+ "range": true,
1146
+ "refId": "A"
1147
+ }
1148
+ ],
1149
+ "title": "Active agents",
1150
+ "type": "stat"
1151
+ },
1152
+ {
1153
+ "collapsed": false,
1154
+ "gridPos": {
1155
+ "h": 1,
1156
+ "w": 24,
1157
+ "x": 0,
1158
+ "y": 11
1159
+ },
1160
+ "id": 102,
1161
+ "panels": [],
1162
+ "title": "Cost",
1163
+ "type": "row"
1164
+ },
1165
+ {
1166
+ "datasource": {
1167
+ "type": "prometheus",
1168
+ "uid": "prometheus"
1169
+ },
1170
+ "description": "Total LLM cost over the selected dashboard range. Open Cost for provider/model attribution and budget details.",
1171
+ "fieldConfig": {
1172
+ "defaults": {
1173
+ "color": {
1174
+ "mode": "palette-classic"
1175
+ },
1176
+ "mappings": [],
1177
+ "thresholds": {
1178
+ "mode": "absolute",
1179
+ "steps": [
1180
+ {
1181
+ "color": "green",
1182
+ "value": null
1183
+ },
1184
+ {
1185
+ "color": "yellow",
1186
+ "value": 10
1187
+ },
1188
+ {
1189
+ "color": "red",
1190
+ "value": 50
1191
+ }
1192
+ ]
1193
+ },
1194
+ "unit": "currencyUSD"
1195
+ },
1196
+ "overrides": []
1197
+ },
1198
+ "gridPos": {
1199
+ "h": 7,
1200
+ "w": 4,
1201
+ "x": 0,
1202
+ "y": 12
1203
+ },
1204
+ "id": 13,
1205
+ "links": [
1206
+ {
1207
+ "targetBlank": false,
1208
+ "title": "Open Cost",
1209
+ "url": "/d/observme-cost/observme-cost?${__url_time_range}"
1210
+ }
1211
+ ],
1212
+ "options": {
1213
+ "colorMode": "value",
1214
+ "graphMode": "area",
1215
+ "justifyMode": "auto",
1216
+ "orientation": "auto",
1217
+ "reduceOptions": {
1218
+ "calcs": [
1219
+ "lastNotNull"
1220
+ ],
1221
+ "fields": "",
1222
+ "values": false
1223
+ },
1224
+ "showPercentChange": false,
1225
+ "textMode": "auto",
1226
+ "wideLayout": true
1227
+ },
1228
+ "pluginVersion": "11.1.0",
1229
+ "targets": [
1230
+ {
1231
+ "datasource": {
1232
+ "type": "prometheus",
1233
+ "uid": "prometheus"
1234
+ },
1235
+ "editorMode": "code",
1236
+ "expr": "sum(increase(observme_llm_cost_usd_total[$__range])) or vector(0)",
1237
+ "instant": true,
1238
+ "range": false,
1239
+ "refId": "A"
1240
+ }
1241
+ ],
1242
+ "title": "Total cost",
1243
+ "type": "stat"
1244
+ },
1245
+ {
1246
+ "datasource": {
1247
+ "type": "prometheus",
1248
+ "uid": "prometheus"
1249
+ },
1250
+ "description": "Selected-range LLM token mix. Detailed provider/model token, cache, and reasoning analysis belongs in Cost, Models, and Logs and LLM I/O.",
1251
+ "fieldConfig": {
1252
+ "defaults": {
1253
+ "color": {
1254
+ "mode": "palette-classic"
1255
+ },
1256
+ "mappings": [],
1257
+ "thresholds": {
1258
+ "mode": "absolute",
1259
+ "steps": [
1260
+ {
1261
+ "color": "green",
1262
+ "value": null
1263
+ }
1264
+ ]
1265
+ },
1266
+ "unit": "short"
1267
+ },
1268
+ "overrides": []
1269
+ },
1270
+ "gridPos": {
1271
+ "h": 7,
1272
+ "w": 10,
1273
+ "x": 4,
1274
+ "y": 12
1275
+ },
1276
+ "id": 14,
1277
+ "links": [
1278
+ {
1279
+ "targetBlank": false,
1280
+ "title": "Open Cost",
1281
+ "url": "/d/observme-cost/observme-cost?${__url_time_range}"
1282
+ },
1283
+ {
1284
+ "targetBlank": false,
1285
+ "title": "Open Models",
1286
+ "url": "/d/observme-models/observme-models?${__url_time_range}"
1287
+ },
1288
+ {
1289
+ "targetBlank": false,
1290
+ "title": "Open Logs and LLM I/O",
1291
+ "url": "/d/observme-logs-llm/observme-logs-llm?${__url_time_range}"
1292
+ }
1293
+ ],
1294
+ "options": {
1295
+ "displayMode": "gradient",
1296
+ "maxVizHeight": 300,
1297
+ "minVizHeight": 16,
1298
+ "minVizWidth": 8,
1299
+ "namePlacement": "auto",
1300
+ "orientation": "horizontal",
1301
+ "reduceOptions": {
1302
+ "calcs": [
1303
+ "lastNotNull"
1304
+ ],
1305
+ "fields": "",
1306
+ "values": false
1307
+ },
1308
+ "showUnfilled": true,
1309
+ "sizing": "auto",
1310
+ "valueMode": "color"
1311
+ },
1312
+ "pluginVersion": "11.1.0",
1313
+ "targets": [
1314
+ {
1315
+ "datasource": {
1316
+ "type": "prometheus",
1317
+ "uid": "prometheus"
1318
+ },
1319
+ "editorMode": "code",
1320
+ "expr": "sum(increase(observme_llm_input_tokens_total[$__range])) or vector(0)",
1321
+ "instant": true,
1322
+ "legendFormat": "input",
1323
+ "range": false,
1324
+ "refId": "A"
1325
+ },
1326
+ {
1327
+ "datasource": {
1328
+ "type": "prometheus",
1329
+ "uid": "prometheus"
1330
+ },
1331
+ "editorMode": "code",
1332
+ "expr": "sum(increase(observme_llm_output_tokens_total[$__range])) or vector(0)",
1333
+ "instant": true,
1334
+ "legendFormat": "output",
1335
+ "range": false,
1336
+ "refId": "B"
1337
+ },
1338
+ {
1339
+ "datasource": {
1340
+ "type": "prometheus",
1341
+ "uid": "prometheus"
1342
+ },
1343
+ "editorMode": "code",
1344
+ "expr": "sum(increase(observme_llm_reasoning_tokens_total[$__range])) or vector(0)",
1345
+ "instant": true,
1346
+ "legendFormat": "reasoning",
1347
+ "range": false,
1348
+ "refId": "C"
1349
+ },
1350
+ {
1351
+ "datasource": {
1352
+ "type": "prometheus",
1353
+ "uid": "prometheus"
1354
+ },
1355
+ "editorMode": "code",
1356
+ "expr": "sum(increase(observme_llm_cache_read_tokens_total[$__range])) or vector(0)",
1357
+ "instant": true,
1358
+ "legendFormat": "cache read",
1359
+ "range": false,
1360
+ "refId": "D"
1361
+ },
1362
+ {
1363
+ "datasource": {
1364
+ "type": "prometheus",
1365
+ "uid": "prometheus"
1366
+ },
1367
+ "editorMode": "code",
1368
+ "expr": "sum(increase(observme_llm_cache_write_tokens_total[$__range])) or vector(0)",
1369
+ "instant": true,
1370
+ "legendFormat": "cache write",
1371
+ "range": false,
1372
+ "refId": "E"
1373
+ }
1374
+ ],
1375
+ "title": "Token mix",
1376
+ "type": "bargauge"
1377
+ },
1378
+ {
1379
+ "datasource": {
1380
+ "type": "prometheus",
1381
+ "uid": "prometheus"
1382
+ },
1383
+ "description": "Total LLM cost trend without provider/model detail. Open Cost or Models when this sparkline rises unexpectedly.",
1384
+ "fieldConfig": {
1385
+ "defaults": {
1386
+ "color": {
1387
+ "mode": "palette-classic"
1388
+ },
1389
+ "custom": {
1390
+ "axisBorderShow": false,
1391
+ "axisCenteredZero": false,
1392
+ "axisColorMode": "text",
1393
+ "axisLabel": "USD",
1394
+ "axisPlacement": "auto",
1395
+ "barAlignment": 0,
1396
+ "drawStyle": "line",
1397
+ "fillOpacity": 20,
1398
+ "gradientMode": "opacity",
1399
+ "hideFrom": {
1400
+ "legend": false,
1401
+ "tooltip": false,
1402
+ "viz": false
1403
+ },
1404
+ "insertNulls": false,
1405
+ "lineInterpolation": "smooth",
1406
+ "lineWidth": 2,
1407
+ "pointSize": 5,
1408
+ "scaleDistribution": {
1409
+ "type": "linear"
1410
+ },
1411
+ "showPoints": "never",
1412
+ "spanNulls": false,
1413
+ "stacking": {
1414
+ "group": "A",
1415
+ "mode": "none"
1416
+ },
1417
+ "thresholdsStyle": {
1418
+ "mode": "off"
1419
+ }
1420
+ },
1421
+ "mappings": [],
1422
+ "thresholds": {
1423
+ "mode": "absolute",
1424
+ "steps": [
1425
+ {
1426
+ "color": "green",
1427
+ "value": null
1428
+ }
1429
+ ]
1430
+ },
1431
+ "unit": "currencyUSD"
1432
+ },
1433
+ "overrides": []
1434
+ },
1435
+ "gridPos": {
1436
+ "h": 7,
1437
+ "w": 10,
1438
+ "x": 14,
1439
+ "y": 12
1440
+ },
1441
+ "id": 15,
1442
+ "links": [
1443
+ {
1444
+ "targetBlank": false,
1445
+ "title": "Open Cost",
1446
+ "url": "/d/observme-cost/observme-cost?${__url_time_range}"
1447
+ }
1448
+ ],
1449
+ "options": {
1450
+ "legend": {
1451
+ "calcs": [],
1452
+ "displayMode": "list",
1453
+ "placement": "bottom",
1454
+ "showLegend": false
1455
+ },
1456
+ "tooltip": {
1457
+ "mode": "single",
1458
+ "sort": "none"
1459
+ }
1460
+ },
1461
+ "targets": [
1462
+ {
1463
+ "datasource": {
1464
+ "type": "prometheus",
1465
+ "uid": "prometheus"
1466
+ },
1467
+ "editorMode": "code",
1468
+ "expr": "sum(increase(observme_llm_cost_usd_total[$__interval])) or vector(0)",
1469
+ "legendFormat": "cost/interval",
1470
+ "range": true,
1471
+ "refId": "A"
1472
+ }
1473
+ ],
1474
+ "title": "Cost trend",
1475
+ "type": "timeseries"
1476
+ },
1477
+ {
1478
+ "collapsed": false,
1479
+ "gridPos": {
1480
+ "h": 1,
1481
+ "w": 24,
1482
+ "x": 0,
1483
+ "y": 19
1484
+ },
1485
+ "id": 103,
1486
+ "panels": [],
1487
+ "title": "Latency",
1488
+ "type": "row"
1489
+ },
1490
+ {
1491
+ "datasource": {
1492
+ "type": "prometheus",
1493
+ "uid": "prometheus"
1494
+ },
1495
+ "description": "p95 turn latency trend with a compact sparkline. Zero can mean idle or missing duration buckets, so confirm volume in Latency and export liveness when unexpected. The 30s/60s thresholds are tunable assumptions.",
1496
+ "fieldConfig": {
1497
+ "defaults": {
1498
+ "color": {
1499
+ "mode": "thresholds"
1500
+ },
1501
+ "mappings": [],
1502
+ "thresholds": {
1503
+ "mode": "absolute",
1504
+ "steps": [
1505
+ {
1506
+ "color": "green",
1507
+ "value": null
1508
+ },
1509
+ {
1510
+ "color": "yellow",
1511
+ "value": 30000
1512
+ },
1513
+ {
1514
+ "color": "red",
1515
+ "value": 60000
1516
+ }
1517
+ ]
1518
+ },
1519
+ "unit": "ms"
1520
+ },
1521
+ "overrides": []
1522
+ },
1523
+ "gridPos": {
1524
+ "h": 5,
1525
+ "w": 8,
1526
+ "x": 0,
1527
+ "y": 20
1528
+ },
1529
+ "id": 16,
1530
+ "links": [
1531
+ {
1532
+ "targetBlank": false,
1533
+ "title": "Open Latency",
1534
+ "url": "/d/observme-latency/observme-latency?${__url_time_range}"
1535
+ },
1536
+ {
1537
+ "targetBlank": false,
1538
+ "title": "Open Trace Journey",
1539
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
1540
+ }
1541
+ ],
1542
+ "options": {
1543
+ "colorMode": "value",
1544
+ "graphMode": "area",
1545
+ "justifyMode": "auto",
1546
+ "orientation": "auto",
1547
+ "reduceOptions": {
1548
+ "calcs": [
1549
+ "lastNotNull"
1550
+ ],
1551
+ "fields": "",
1552
+ "values": false
1553
+ },
1554
+ "showPercentChange": false,
1555
+ "textMode": "auto",
1556
+ "wideLayout": true
1557
+ },
1558
+ "pluginVersion": "11.1.0",
1559
+ "targets": [
1560
+ {
1561
+ "datasource": {
1562
+ "type": "prometheus",
1563
+ "uid": "prometheus"
1564
+ },
1565
+ "editorMode": "code",
1566
+ "expr": "histogram_quantile(0.95, sum(rate(observme_turn_duration_ms_bucket[$__rate_interval])) by (le)) or vector(0)",
1567
+ "range": true,
1568
+ "refId": "A"
1569
+ }
1570
+ ],
1571
+ "title": "p95 turn latency",
1572
+ "type": "stat"
1573
+ },
1574
+ {
1575
+ "datasource": {
1576
+ "type": "prometheus",
1577
+ "uid": "prometheus"
1578
+ },
1579
+ "description": "p95 LLM request latency trend. Zero can mean idle or missing duration buckets; open Latency for volume context and Models for provider/model comparison. The 30s/60s thresholds are tunable assumptions.",
1580
+ "fieldConfig": {
1581
+ "defaults": {
1582
+ "color": {
1583
+ "mode": "thresholds"
1584
+ },
1585
+ "mappings": [],
1586
+ "thresholds": {
1587
+ "mode": "absolute",
1588
+ "steps": [
1589
+ {
1590
+ "color": "green",
1591
+ "value": null
1592
+ },
1593
+ {
1594
+ "color": "yellow",
1595
+ "value": 30000
1596
+ },
1597
+ {
1598
+ "color": "red",
1599
+ "value": 60000
1600
+ }
1601
+ ]
1602
+ },
1603
+ "unit": "ms"
1604
+ },
1605
+ "overrides": []
1606
+ },
1607
+ "gridPos": {
1608
+ "h": 5,
1609
+ "w": 8,
1610
+ "x": 8,
1611
+ "y": 20
1612
+ },
1613
+ "id": 17,
1614
+ "links": [
1615
+ {
1616
+ "targetBlank": false,
1617
+ "title": "Open Models",
1618
+ "url": "/d/observme-models/observme-models?${__url_time_range}"
1619
+ },
1620
+ {
1621
+ "targetBlank": false,
1622
+ "title": "Open Latency",
1623
+ "url": "/d/observme-latency/observme-latency?${__url_time_range}"
1624
+ }
1625
+ ],
1626
+ "options": {
1627
+ "colorMode": "value",
1628
+ "graphMode": "area",
1629
+ "justifyMode": "auto",
1630
+ "orientation": "auto",
1631
+ "reduceOptions": {
1632
+ "calcs": [
1633
+ "lastNotNull"
1634
+ ],
1635
+ "fields": "",
1636
+ "values": false
1637
+ },
1638
+ "showPercentChange": false,
1639
+ "textMode": "auto",
1640
+ "wideLayout": true
1641
+ },
1642
+ "pluginVersion": "11.1.0",
1643
+ "targets": [
1644
+ {
1645
+ "datasource": {
1646
+ "type": "prometheus",
1647
+ "uid": "prometheus"
1648
+ },
1649
+ "editorMode": "code",
1650
+ "expr": "histogram_quantile(0.95, sum(rate(observme_llm_request_duration_ms_bucket[$__rate_interval])) by (le)) or vector(0)",
1651
+ "range": true,
1652
+ "refId": "A"
1653
+ }
1654
+ ],
1655
+ "title": "p95 LLM latency",
1656
+ "type": "stat"
1657
+ },
1658
+ {
1659
+ "datasource": {
1660
+ "type": "prometheus",
1661
+ "uid": "prometheus"
1662
+ },
1663
+ "description": "p95 tool-call latency trend. Zero can mean idle or missing duration buckets; open Latency for volume context and Tools for slow or failing tools. The 10s/30s thresholds are tunable assumptions.",
1664
+ "fieldConfig": {
1665
+ "defaults": {
1666
+ "color": {
1667
+ "mode": "thresholds"
1668
+ },
1669
+ "mappings": [],
1670
+ "thresholds": {
1671
+ "mode": "absolute",
1672
+ "steps": [
1673
+ {
1674
+ "color": "green",
1675
+ "value": null
1676
+ },
1677
+ {
1678
+ "color": "yellow",
1679
+ "value": 10000
1680
+ },
1681
+ {
1682
+ "color": "red",
1683
+ "value": 30000
1684
+ }
1685
+ ]
1686
+ },
1687
+ "unit": "ms"
1688
+ },
1689
+ "overrides": []
1690
+ },
1691
+ "gridPos": {
1692
+ "h": 5,
1693
+ "w": 8,
1694
+ "x": 16,
1695
+ "y": 20
1696
+ },
1697
+ "id": 18,
1698
+ "links": [
1699
+ {
1700
+ "targetBlank": false,
1701
+ "title": "Open Tools",
1702
+ "url": "/d/observme-tools/observme-tools?${__url_time_range}"
1703
+ },
1704
+ {
1705
+ "targetBlank": false,
1706
+ "title": "Open Latency",
1707
+ "url": "/d/observme-latency/observme-latency?${__url_time_range}"
1708
+ }
1709
+ ],
1710
+ "options": {
1711
+ "colorMode": "value",
1712
+ "graphMode": "area",
1713
+ "justifyMode": "auto",
1714
+ "orientation": "auto",
1715
+ "reduceOptions": {
1716
+ "calcs": [
1717
+ "lastNotNull"
1718
+ ],
1719
+ "fields": "",
1720
+ "values": false
1721
+ },
1722
+ "showPercentChange": false,
1723
+ "textMode": "auto",
1724
+ "wideLayout": true
1725
+ },
1726
+ "pluginVersion": "11.1.0",
1727
+ "targets": [
1728
+ {
1729
+ "datasource": {
1730
+ "type": "prometheus",
1731
+ "uid": "prometheus"
1732
+ },
1733
+ "editorMode": "code",
1734
+ "expr": "histogram_quantile(0.95, sum(rate(observme_tool_duration_ms_bucket[$__rate_interval])) by (le)) or vector(0)",
1735
+ "range": true,
1736
+ "refId": "A"
1737
+ }
1738
+ ],
1739
+ "title": "p95 tool latency",
1740
+ "type": "stat"
1741
+ },
1742
+ {
1743
+ "collapsed": false,
1744
+ "gridPos": {
1745
+ "h": 1,
1746
+ "w": 24,
1747
+ "x": 0,
1748
+ "y": 25
1749
+ },
1750
+ "id": 104,
1751
+ "panels": [],
1752
+ "title": "Agent lineage",
1753
+ "type": "row"
1754
+ },
1755
+ {
1756
+ "datasource": {
1757
+ "type": "prometheus",
1758
+ "uid": "prometheus"
1759
+ },
1760
+ "description": "Selected-range lineage failures: spawn failures, orphan agents, and trace-context propagation failures. Empty/zero is healthy for the range.",
1761
+ "fieldConfig": {
1762
+ "defaults": {
1763
+ "color": {
1764
+ "mode": "thresholds"
1765
+ },
1766
+ "mappings": [],
1767
+ "thresholds": {
1768
+ "mode": "absolute",
1769
+ "steps": [
1770
+ {
1771
+ "color": "green",
1772
+ "value": null
1773
+ },
1774
+ {
1775
+ "color": "red",
1776
+ "value": 1
1777
+ }
1778
+ ]
1779
+ },
1780
+ "unit": "short"
1781
+ },
1782
+ "overrides": []
1783
+ },
1784
+ "gridPos": {
1785
+ "h": 6,
1786
+ "w": 6,
1787
+ "x": 0,
1788
+ "y": 26
1789
+ },
1790
+ "id": 19,
1791
+ "links": [
1792
+ {
1793
+ "targetBlank": false,
1794
+ "title": "Open Agents",
1795
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
1796
+ },
1797
+ {
1798
+ "targetBlank": false,
1799
+ "title": "Open Trace Journey",
1800
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
1801
+ }
1802
+ ],
1803
+ "options": {
1804
+ "colorMode": "value",
1805
+ "graphMode": "area",
1806
+ "justifyMode": "auto",
1807
+ "orientation": "auto",
1808
+ "reduceOptions": {
1809
+ "calcs": [
1810
+ "lastNotNull"
1811
+ ],
1812
+ "fields": "",
1813
+ "values": false
1814
+ },
1815
+ "showPercentChange": false,
1816
+ "textMode": "auto",
1817
+ "wideLayout": true
1818
+ },
1819
+ "pluginVersion": "11.1.0",
1820
+ "targets": [
1821
+ {
1822
+ "datasource": {
1823
+ "type": "prometheus",
1824
+ "uid": "prometheus"
1825
+ },
1826
+ "editorMode": "code",
1827
+ "expr": "(sum(increase(observme_subagent_spawn_failures_total[$__range])) or vector(0)) + (sum(increase(observme_orphan_agents_total[$__range])) or vector(0)) + (sum(increase(observme_trace_context_propagation_failures_total[$__range])) or vector(0))",
1828
+ "instant": true,
1829
+ "range": false,
1830
+ "refId": "A"
1831
+ }
1832
+ ],
1833
+ "title": "Lineage failures",
1834
+ "type": "stat"
1835
+ },
1836
+ {
1837
+ "datasource": {
1838
+ "type": "prometheus",
1839
+ "uid": "prometheus"
1840
+ },
1841
+ "description": "p95 agent-tree depth. The red reference at 5 matches the tunable ObservMeExcessiveAgentTreeDepth default. Zero can mean idle or missing tree-depth buckets; use Agents for workload context.",
1842
+ "fieldConfig": {
1843
+ "defaults": {
1844
+ "color": {
1845
+ "mode": "thresholds"
1846
+ },
1847
+ "mappings": [],
1848
+ "thresholds": {
1849
+ "mode": "absolute",
1850
+ "steps": [
1851
+ {
1852
+ "color": "green",
1853
+ "value": null
1854
+ },
1855
+ {
1856
+ "color": "red",
1857
+ "value": 5
1858
+ }
1859
+ ]
1860
+ },
1861
+ "unit": "short"
1862
+ },
1863
+ "overrides": []
1864
+ },
1865
+ "gridPos": {
1866
+ "h": 6,
1867
+ "w": 6,
1868
+ "x": 6,
1869
+ "y": 26
1870
+ },
1871
+ "id": 20,
1872
+ "links": [
1873
+ {
1874
+ "targetBlank": false,
1875
+ "title": "Open Agents",
1876
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
1877
+ },
1878
+ {
1879
+ "targetBlank": false,
1880
+ "title": "Open Agent Node Graphs",
1881
+ "url": "/d/observme-agent-node-graphs/observme-agent-node-graphs?${__url_time_range}"
1882
+ }
1883
+ ],
1884
+ "options": {
1885
+ "colorMode": "value",
1886
+ "graphMode": "area",
1887
+ "justifyMode": "auto",
1888
+ "orientation": "auto",
1889
+ "reduceOptions": {
1890
+ "calcs": [
1891
+ "lastNotNull"
1892
+ ],
1893
+ "fields": "",
1894
+ "values": false
1895
+ },
1896
+ "showPercentChange": false,
1897
+ "textMode": "auto",
1898
+ "wideLayout": true
1899
+ },
1900
+ "pluginVersion": "11.1.0",
1901
+ "targets": [
1902
+ {
1903
+ "datasource": {
1904
+ "type": "prometheus",
1905
+ "uid": "prometheus"
1906
+ },
1907
+ "editorMode": "code",
1908
+ "expr": "histogram_quantile(0.95, sum(rate(observme_agent_tree_depth_bucket[$__rate_interval])) by (le)) or vector(0)",
1909
+ "range": true,
1910
+ "refId": "A"
1911
+ }
1912
+ ],
1913
+ "title": "p95 tree depth",
1914
+ "type": "stat"
1915
+ },
1916
+ {
1917
+ "datasource": {
1918
+ "type": "prometheus",
1919
+ "uid": "prometheus"
1920
+ },
1921
+ "description": "p95 fan-out per parent operation. The red reference at 20 matches the tunable ObservMeRunawayAgentFanOut default. Zero can mean idle or missing fan-out buckets; use Agents for workload context.",
1922
+ "fieldConfig": {
1923
+ "defaults": {
1924
+ "color": {
1925
+ "mode": "thresholds"
1926
+ },
1927
+ "mappings": [],
1928
+ "thresholds": {
1929
+ "mode": "absolute",
1930
+ "steps": [
1931
+ {
1932
+ "color": "green",
1933
+ "value": null
1934
+ },
1935
+ {
1936
+ "color": "red",
1937
+ "value": 20
1938
+ }
1939
+ ]
1940
+ },
1941
+ "unit": "short"
1942
+ },
1943
+ "overrides": []
1944
+ },
1945
+ "gridPos": {
1946
+ "h": 6,
1947
+ "w": 6,
1948
+ "x": 12,
1949
+ "y": 26
1950
+ },
1951
+ "id": 21,
1952
+ "links": [
1953
+ {
1954
+ "targetBlank": false,
1955
+ "title": "Open Agents",
1956
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
1957
+ },
1958
+ {
1959
+ "targetBlank": false,
1960
+ "title": "Open Trace Journey",
1961
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
1962
+ }
1963
+ ],
1964
+ "options": {
1965
+ "colorMode": "value",
1966
+ "graphMode": "area",
1967
+ "justifyMode": "auto",
1968
+ "orientation": "auto",
1969
+ "reduceOptions": {
1970
+ "calcs": [
1971
+ "lastNotNull"
1972
+ ],
1973
+ "fields": "",
1974
+ "values": false
1975
+ },
1976
+ "showPercentChange": false,
1977
+ "textMode": "auto",
1978
+ "wideLayout": true
1979
+ },
1980
+ "pluginVersion": "11.1.0",
1981
+ "targets": [
1982
+ {
1983
+ "datasource": {
1984
+ "type": "prometheus",
1985
+ "uid": "prometheus"
1986
+ },
1987
+ "editorMode": "code",
1988
+ "expr": "histogram_quantile(0.95, sum(rate(observme_agent_fanout_count_bucket[$__rate_interval])) by (le)) or vector(0)",
1989
+ "range": true,
1990
+ "refId": "A"
1991
+ }
1992
+ ],
1993
+ "title": "p95 fan-out",
1994
+ "type": "stat"
1995
+ },
1996
+ {
1997
+ "datasource": {
1998
+ "type": "prometheus",
1999
+ "uid": "prometheus"
2000
+ },
2001
+ "description": "Current active agents by bounded role and depth. No rows can mean healthy idle or an absent active-agent gauge; compare with the ungrouped Active agents chip and Export Health before treating it as healthy.",
2002
+ "fieldConfig": {
2003
+ "defaults": {
2004
+ "color": {
2005
+ "mode": "palette-classic"
2006
+ },
2007
+ "mappings": [],
2008
+ "thresholds": {
2009
+ "mode": "absolute",
2010
+ "steps": [
2011
+ {
2012
+ "color": "green",
2013
+ "value": null
2014
+ }
2015
+ ]
2016
+ },
2017
+ "unit": "short"
2018
+ },
2019
+ "overrides": []
2020
+ },
2021
+ "gridPos": {
2022
+ "h": 6,
2023
+ "w": 6,
2024
+ "x": 18,
2025
+ "y": 26
2026
+ },
2027
+ "id": 22,
2028
+ "links": [
2029
+ {
2030
+ "targetBlank": false,
2031
+ "title": "Open Agents",
2032
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
2033
+ }
2034
+ ],
2035
+ "options": {
2036
+ "displayMode": "gradient",
2037
+ "maxVizHeight": 300,
2038
+ "minVizHeight": 16,
2039
+ "minVizWidth": 8,
2040
+ "namePlacement": "auto",
2041
+ "orientation": "horizontal",
2042
+ "reduceOptions": {
2043
+ "calcs": [
2044
+ "lastNotNull"
2045
+ ],
2046
+ "fields": "",
2047
+ "values": false
2048
+ },
2049
+ "showUnfilled": true,
2050
+ "sizing": "auto",
2051
+ "valueMode": "color"
2052
+ },
2053
+ "pluginVersion": "11.1.0",
2054
+ "targets": [
2055
+ {
2056
+ "datasource": {
2057
+ "type": "prometheus",
2058
+ "uid": "prometheus"
2059
+ },
2060
+ "editorMode": "code",
2061
+ "expr": "sum(observme_active_agents) by (agent_role, subagent_depth)",
2062
+ "instant": true,
2063
+ "legendFormat": "{{agent_role}} depth={{subagent_depth}}",
2064
+ "range": false,
2065
+ "refId": "A"
2066
+ }
2067
+ ],
2068
+ "title": "Active agents by role/depth",
2069
+ "type": "bargauge"
2070
+ },
2071
+ {
2072
+ "collapsed": false,
2073
+ "gridPos": {
2074
+ "h": 1,
2075
+ "w": 24,
2076
+ "x": 0,
2077
+ "y": 32
2078
+ },
2079
+ "id": 105,
2080
+ "panels": [],
2081
+ "title": "Links",
2082
+ "type": "row"
2083
+ },
2084
+ {
2085
+ "datasource": null,
2086
+ "description": "Operator navigation map. These links intentionally preserve the current Grafana time range.",
2087
+ "fieldConfig": {
2088
+ "defaults": {},
2089
+ "overrides": []
2090
+ },
2091
+ "gridPos": {
2092
+ "h": 9,
2093
+ "w": 24,
2094
+ "x": 0,
2095
+ "y": 33
2096
+ },
2097
+ "id": 23,
2098
+ "options": {
2099
+ "code": {
2100
+ "language": "plaintext",
2101
+ "showLineNumbers": false,
2102
+ "showMiniMap": false
2103
+ },
2104
+ "content": "# Drill-down dashboards\n\nUse this overview to decide where to go next, then open the focused dashboard with the same time range:\n\n- [Cost](/d/observme-cost/observme-cost?${__url_time_range}) for spend, burn rate, token mix, and cache context.\n- [Models](/d/observme-models/observme-models?${__url_time_range}) for provider/model request, error, latency, and stop-reason context.\n- [Latency](/d/observme-latency/observme-latency?${__url_time_range}) for percentile trends, volume context, and slow-stage investigation.\n- [Tools](/d/observme-tools/observme-tools?${__url_time_range}) for tool volume, failures, latency, sizes, and offenders.\n- [Agents](/d/observme-agents/observme-agents?${__url_time_range}) for subagent reliability, fan-out, depth, orphan, wait, and join behavior.\n- [Agent Node Graphs](/d/observme-agent-node-graphs/observme-agent-node-graphs?${__url_time_range}) for bounded aggregate topology and health.\n- [Trace Journey](/d/observme-trace-journey/observme-trace-journey?${__url_time_range}) for per-execution metric-to-log-to-trace inspection.\n- [Errors](/d/observme-errors/observme-errors?${__url_time_range}) for error-family pressure and parsed failure context.\n- [Export Health](/d/observme-export-health/observme-export-health?${__url_time_range}) for telemetry liveness, drops, redaction, export failures, and handler health.\n- [SLO Health](/d/observme-slo-health/observme-slo-health?${__url_time_range}) for canonical scorecards, burn rates, and no-workload states.\n- [Logs and LLM I/O](/d/observme-logs-llm/observme-logs-llm?${__url_time_range}) for privacy-safe lifecycle logs and token/size trends.\n- [LLM Conversations](/d/observme-llm-conversations/observme-llm-conversations?${__url_time_range}) for redacted opt-in prompt, response, and thinking timelines.",
2105
+ "mode": "markdown"
2106
+ },
2107
+ "pluginVersion": "11.1.0",
2108
+ "title": "Dashboard links",
2109
+ "type": "text"
2110
+ }
2111
+ ],
2112
+ "refresh": "30s",
2113
+ "schemaVersion": 39,
2114
+ "tags": [
2115
+ "observme",
2116
+ "pi",
2117
+ "opentelemetry",
2118
+ "overview"
2119
+ ],
2120
+ "time": {
2121
+ "from": "now-6h",
2122
+ "to": "now"
2123
+ },
2124
+ "timezone": "browser",
2125
+ "title": "ObservMe Overview",
2126
+ "uid": "observme-overview",
2127
+ "version": 3,
2128
+ "weekStart": ""
2129
+ }