@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,1793 @@
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": "loki",
17
+ "name": "Loki",
18
+ "type": "datasource",
19
+ "version": "1.0.0"
20
+ },
21
+ {
22
+ "id": "tempo",
23
+ "name": "Tempo",
24
+ "type": "datasource",
25
+ "version": "1.0.0"
26
+ },
27
+ {
28
+ "id": "row",
29
+ "name": "Row",
30
+ "type": "panel",
31
+ "version": ""
32
+ },
33
+ {
34
+ "id": "timeseries",
35
+ "name": "Time series",
36
+ "type": "panel",
37
+ "version": ""
38
+ },
39
+ {
40
+ "id": "stat",
41
+ "name": "Stat",
42
+ "type": "panel",
43
+ "version": ""
44
+ },
45
+ {
46
+ "id": "bargauge",
47
+ "name": "Bar gauge",
48
+ "type": "panel",
49
+ "version": ""
50
+ },
51
+ {
52
+ "id": "barchart",
53
+ "name": "Bar chart",
54
+ "type": "panel",
55
+ "version": ""
56
+ },
57
+ {
58
+ "id": "table",
59
+ "name": "Table",
60
+ "type": "panel",
61
+ "version": ""
62
+ },
63
+ {
64
+ "id": "logs",
65
+ "name": "Logs",
66
+ "type": "panel",
67
+ "version": ""
68
+ },
69
+ {
70
+ "id": "text",
71
+ "name": "Text",
72
+ "type": "panel",
73
+ "version": ""
74
+ }
75
+ ],
76
+ "annotations": {
77
+ "list": []
78
+ },
79
+ "editable": true,
80
+ "fiscalYearStartMonth": 0,
81
+ "graphTooltip": 0,
82
+ "id": null,
83
+ "links": [
84
+ {
85
+ "targetBlank": false,
86
+ "title": "Open matching LLM Conversations",
87
+ "url": "/d/observme-llm-conversations/observme-llm-conversations?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
88
+ },
89
+ {
90
+ "targetBlank": false,
91
+ "title": "Agents",
92
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
93
+ },
94
+ {
95
+ "targetBlank": false,
96
+ "title": "Agent Node Graphs",
97
+ "url": "/d/observme-agent-node-graphs/observme-agent-node-graphs?${__url_time_range}"
98
+ }
99
+ ],
100
+ "liveNow": false,
101
+ "panels": [
102
+ {
103
+ "collapsed": false,
104
+ "gridPos": {
105
+ "h": 1,
106
+ "w": 24,
107
+ "x": 0,
108
+ "y": 0
109
+ },
110
+ "id": 100,
111
+ "panels": [],
112
+ "title": "Summary",
113
+ "type": "row"
114
+ },
115
+ {
116
+ "datasource": null,
117
+ "description": "A trace-first journey map for Pi sessions. Prometheus sections show bounded aggregate flow and latency; Loki and Tempo sections use the high-cardinality filters for one execution. Zero summary activity can be healthy idle, while missing telemetry should be checked in Export Health.",
118
+ "fieldConfig": {
119
+ "defaults": {},
120
+ "overrides": []
121
+ },
122
+ "gridPos": {
123
+ "h": 5,
124
+ "w": 24,
125
+ "x": 0,
126
+ "y": 1
127
+ },
128
+ "id": 1,
129
+ "options": {
130
+ "code": {
131
+ "language": "plaintext",
132
+ "showLineNumbers": false,
133
+ "showMiniMap": false
134
+ },
135
+ "content": "# ObservMe Trace Journey\n\nFollow how one Pi request travels through the system: `session → agent run → turn → LLM → tool/bash → subagent spawn → wait/join → branch/compaction`. Prometheus panels show aggregate flow and latency only; session, workflow, agent, and run filters apply to Loki/Tempo drill-downs. Start with summary and flow, inspect lineage logs for trace IDs, then open the Tempo waterfall. Empty journey rows can mean no matching work in the selected range; verify ingestion in Export Health when an active execution is unexpectedly absent.",
136
+ "mode": "markdown"
137
+ },
138
+ "pluginVersion": "11.1.0",
139
+ "title": "Trace journey map",
140
+ "type": "text"
141
+ },
142
+ {
143
+ "datasource": {
144
+ "type": "prometheus",
145
+ "uid": "prometheus"
146
+ },
147
+ "description": "Current ObservMe agent runtimes from the active-agent gauge. Zero can mean healthy idle or an absent gauge; check Export Health before treating an unexpected zero as healthy.",
148
+ "fieldConfig": {
149
+ "defaults": {
150
+ "color": {
151
+ "mode": "palette-classic"
152
+ },
153
+ "mappings": [],
154
+ "thresholds": {
155
+ "mode": "absolute",
156
+ "steps": [
157
+ {
158
+ "color": "green",
159
+ "value": null
160
+ }
161
+ ]
162
+ },
163
+ "unit": "short"
164
+ },
165
+ "overrides": []
166
+ },
167
+ "gridPos": {
168
+ "h": 4,
169
+ "w": 3,
170
+ "x": 0,
171
+ "y": 6
172
+ },
173
+ "id": 2,
174
+ "options": {
175
+ "colorMode": "value",
176
+ "graphMode": "area",
177
+ "justifyMode": "auto",
178
+ "orientation": "auto",
179
+ "reduceOptions": {
180
+ "calcs": [
181
+ "lastNotNull"
182
+ ],
183
+ "fields": "",
184
+ "values": false
185
+ },
186
+ "showPercentChange": false,
187
+ "textMode": "auto",
188
+ "wideLayout": true
189
+ },
190
+ "pluginVersion": "11.1.0",
191
+ "targets": [
192
+ {
193
+ "datasource": {
194
+ "type": "prometheus",
195
+ "uid": "prometheus"
196
+ },
197
+ "editorMode": "code",
198
+ "expr": "(sum(observme_active_agents) or vector(0))",
199
+ "instant": true,
200
+ "range": false,
201
+ "refId": "A"
202
+ }
203
+ ],
204
+ "title": "Active agents",
205
+ "type": "stat"
206
+ },
207
+ {
208
+ "datasource": {
209
+ "type": "prometheus",
210
+ "uid": "prometheus"
211
+ },
212
+ "description": "Completed workflows during the selected dashboard range. Empty ranges render as zero.",
213
+ "fieldConfig": {
214
+ "defaults": {
215
+ "color": {
216
+ "mode": "palette-classic"
217
+ },
218
+ "mappings": [],
219
+ "thresholds": {
220
+ "mode": "absolute",
221
+ "steps": [
222
+ {
223
+ "color": "green",
224
+ "value": null
225
+ }
226
+ ]
227
+ },
228
+ "unit": "short"
229
+ },
230
+ "overrides": []
231
+ },
232
+ "gridPos": {
233
+ "h": 4,
234
+ "w": 3,
235
+ "x": 3,
236
+ "y": 6
237
+ },
238
+ "id": 3,
239
+ "options": {
240
+ "colorMode": "value",
241
+ "graphMode": "area",
242
+ "justifyMode": "auto",
243
+ "orientation": "auto",
244
+ "reduceOptions": {
245
+ "calcs": [
246
+ "lastNotNull"
247
+ ],
248
+ "fields": "",
249
+ "values": false
250
+ },
251
+ "showPercentChange": false,
252
+ "textMode": "auto",
253
+ "wideLayout": true
254
+ },
255
+ "pluginVersion": "11.1.0",
256
+ "targets": [
257
+ {
258
+ "datasource": {
259
+ "type": "prometheus",
260
+ "uid": "prometheus"
261
+ },
262
+ "editorMode": "code",
263
+ "expr": "sum(increase(observme_workflows_completed_total[$__range])) or vector(0)",
264
+ "instant": true,
265
+ "range": false,
266
+ "refId": "A"
267
+ }
268
+ ],
269
+ "title": "Completed workflows",
270
+ "type": "stat"
271
+ },
272
+ {
273
+ "datasource": {
274
+ "type": "prometheus",
275
+ "uid": "prometheus"
276
+ },
277
+ "description": "Failed workflows during the selected dashboard range. Any non-zero value should be investigated with the ordered logs and Tempo traces below.",
278
+ "fieldConfig": {
279
+ "defaults": {
280
+ "color": {
281
+ "mode": "thresholds"
282
+ },
283
+ "mappings": [],
284
+ "thresholds": {
285
+ "mode": "absolute",
286
+ "steps": [
287
+ {
288
+ "color": "green",
289
+ "value": null
290
+ },
291
+ {
292
+ "color": "red",
293
+ "value": 1
294
+ }
295
+ ]
296
+ },
297
+ "unit": "short"
298
+ },
299
+ "overrides": []
300
+ },
301
+ "gridPos": {
302
+ "h": 4,
303
+ "w": 3,
304
+ "x": 6,
305
+ "y": 6
306
+ },
307
+ "id": 16,
308
+ "options": {
309
+ "colorMode": "value",
310
+ "graphMode": "area",
311
+ "justifyMode": "auto",
312
+ "orientation": "auto",
313
+ "reduceOptions": {
314
+ "calcs": [
315
+ "lastNotNull"
316
+ ],
317
+ "fields": "",
318
+ "values": false
319
+ },
320
+ "showPercentChange": false,
321
+ "textMode": "auto",
322
+ "wideLayout": true
323
+ },
324
+ "pluginVersion": "11.1.0",
325
+ "targets": [
326
+ {
327
+ "datasource": {
328
+ "type": "prometheus",
329
+ "uid": "prometheus"
330
+ },
331
+ "editorMode": "code",
332
+ "expr": "sum(increase(observme_workflow_errors_total[$__range])) or vector(0)",
333
+ "instant": true,
334
+ "range": false,
335
+ "refId": "A"
336
+ }
337
+ ],
338
+ "title": "Failed workflows",
339
+ "type": "stat"
340
+ },
341
+ {
342
+ "datasource": {
343
+ "type": "prometheus",
344
+ "uid": "prometheus"
345
+ },
346
+ "description": "Successful terminal workflows divided by completed plus failed workflows over the selected range. A zero can mean no terminal workflows or that every terminal workflow failed; interpret it beside both workflow count stats rather than as a standalone health signal.",
347
+ "fieldConfig": {
348
+ "defaults": {
349
+ "color": {
350
+ "mode": "thresholds"
351
+ },
352
+ "mappings": [],
353
+ "thresholds": {
354
+ "mode": "absolute",
355
+ "steps": [
356
+ {
357
+ "color": "red",
358
+ "value": null
359
+ },
360
+ {
361
+ "color": "yellow",
362
+ "value": 0.95
363
+ },
364
+ {
365
+ "color": "green",
366
+ "value": 0.99
367
+ }
368
+ ]
369
+ },
370
+ "unit": "percentunit"
371
+ },
372
+ "overrides": []
373
+ },
374
+ "gridPos": {
375
+ "h": 4,
376
+ "w": 3,
377
+ "x": 9,
378
+ "y": 6
379
+ },
380
+ "id": 17,
381
+ "options": {
382
+ "colorMode": "value",
383
+ "graphMode": "area",
384
+ "justifyMode": "auto",
385
+ "orientation": "auto",
386
+ "reduceOptions": {
387
+ "calcs": [
388
+ "lastNotNull"
389
+ ],
390
+ "fields": "",
391
+ "values": false
392
+ },
393
+ "showPercentChange": false,
394
+ "textMode": "auto",
395
+ "wideLayout": true
396
+ },
397
+ "pluginVersion": "11.1.0",
398
+ "targets": [
399
+ {
400
+ "datasource": {
401
+ "type": "prometheus",
402
+ "uid": "prometheus"
403
+ },
404
+ "editorMode": "code",
405
+ "expr": "(sum(increase(observme_workflows_completed_total[$__range])) or vector(0)) / clamp_min((sum(increase(observme_workflows_completed_total[$__range])) or vector(0)) + (sum(increase(observme_workflow_errors_total[$__range])) or vector(0)), 1)",
406
+ "instant": true,
407
+ "range": false,
408
+ "refId": "A"
409
+ }
410
+ ],
411
+ "title": "Workflow completion ratio",
412
+ "type": "stat"
413
+ },
414
+ {
415
+ "datasource": {
416
+ "type": "prometheus",
417
+ "uid": "prometheus"
418
+ },
419
+ "description": "Subagent spawn operations in the selected range. Zero means no matching spawns were observed and can be healthy idle.",
420
+ "fieldConfig": {
421
+ "defaults": {
422
+ "color": {
423
+ "mode": "palette-classic"
424
+ },
425
+ "mappings": [],
426
+ "thresholds": {
427
+ "mode": "absolute",
428
+ "steps": [
429
+ {
430
+ "color": "green",
431
+ "value": null
432
+ }
433
+ ]
434
+ },
435
+ "unit": "short"
436
+ },
437
+ "overrides": []
438
+ },
439
+ "gridPos": {
440
+ "h": 4,
441
+ "w": 3,
442
+ "x": 12,
443
+ "y": 6
444
+ },
445
+ "id": 4,
446
+ "options": {
447
+ "colorMode": "value",
448
+ "graphMode": "area",
449
+ "justifyMode": "auto",
450
+ "orientation": "auto",
451
+ "reduceOptions": {
452
+ "calcs": [
453
+ "lastNotNull"
454
+ ],
455
+ "fields": "",
456
+ "values": false
457
+ },
458
+ "showPercentChange": false,
459
+ "textMode": "auto",
460
+ "wideLayout": true
461
+ },
462
+ "pluginVersion": "11.1.0",
463
+ "targets": [
464
+ {
465
+ "datasource": {
466
+ "type": "prometheus",
467
+ "uid": "prometheus"
468
+ },
469
+ "editorMode": "code",
470
+ "expr": "sum(increase(observme_subagents_spawned_total[$__range])) or vector(0)",
471
+ "instant": true,
472
+ "range": false,
473
+ "refId": "A"
474
+ }
475
+ ],
476
+ "title": "Subagent spawns",
477
+ "type": "stat"
478
+ },
479
+ {
480
+ "datasource": {
481
+ "type": "prometheus",
482
+ "uid": "prometheus"
483
+ },
484
+ "description": "LLM requests in the selected range. Zero means no matching requests were observed and can be healthy idle.",
485
+ "fieldConfig": {
486
+ "defaults": {
487
+ "color": {
488
+ "mode": "palette-classic"
489
+ },
490
+ "mappings": [],
491
+ "thresholds": {
492
+ "mode": "absolute",
493
+ "steps": [
494
+ {
495
+ "color": "green",
496
+ "value": null
497
+ }
498
+ ]
499
+ },
500
+ "unit": "short"
501
+ },
502
+ "overrides": []
503
+ },
504
+ "gridPos": {
505
+ "h": 4,
506
+ "w": 3,
507
+ "x": 15,
508
+ "y": 6
509
+ },
510
+ "id": 5,
511
+ "options": {
512
+ "colorMode": "value",
513
+ "graphMode": "area",
514
+ "justifyMode": "auto",
515
+ "orientation": "auto",
516
+ "reduceOptions": {
517
+ "calcs": [
518
+ "lastNotNull"
519
+ ],
520
+ "fields": "",
521
+ "values": false
522
+ },
523
+ "showPercentChange": false,
524
+ "textMode": "auto",
525
+ "wideLayout": true
526
+ },
527
+ "pluginVersion": "11.1.0",
528
+ "targets": [
529
+ {
530
+ "datasource": {
531
+ "type": "prometheus",
532
+ "uid": "prometheus"
533
+ },
534
+ "editorMode": "code",
535
+ "expr": "sum(increase(observme_llm_requests_total[$__range])) or vector(0)",
536
+ "instant": true,
537
+ "range": false,
538
+ "refId": "A"
539
+ }
540
+ ],
541
+ "title": "LLM requests",
542
+ "type": "stat"
543
+ },
544
+ {
545
+ "datasource": {
546
+ "type": "prometheus",
547
+ "uid": "prometheus"
548
+ },
549
+ "description": "Tool calls in the selected range. Zero means no matching calls were observed and can be healthy idle.",
550
+ "fieldConfig": {
551
+ "defaults": {
552
+ "color": {
553
+ "mode": "palette-classic"
554
+ },
555
+ "mappings": [],
556
+ "thresholds": {
557
+ "mode": "absolute",
558
+ "steps": [
559
+ {
560
+ "color": "green",
561
+ "value": null
562
+ }
563
+ ]
564
+ },
565
+ "unit": "short"
566
+ },
567
+ "overrides": []
568
+ },
569
+ "gridPos": {
570
+ "h": 4,
571
+ "w": 3,
572
+ "x": 18,
573
+ "y": 6
574
+ },
575
+ "id": 6,
576
+ "options": {
577
+ "colorMode": "value",
578
+ "graphMode": "area",
579
+ "justifyMode": "auto",
580
+ "orientation": "auto",
581
+ "reduceOptions": {
582
+ "calcs": [
583
+ "lastNotNull"
584
+ ],
585
+ "fields": "",
586
+ "values": false
587
+ },
588
+ "showPercentChange": false,
589
+ "textMode": "auto",
590
+ "wideLayout": true
591
+ },
592
+ "pluginVersion": "11.1.0",
593
+ "targets": [
594
+ {
595
+ "datasource": {
596
+ "type": "prometheus",
597
+ "uid": "prometheus"
598
+ },
599
+ "editorMode": "code",
600
+ "expr": "sum(increase(observme_tool_calls_total[$__range])) or vector(0)",
601
+ "instant": true,
602
+ "range": false,
603
+ "refId": "A"
604
+ }
605
+ ],
606
+ "title": "Tool calls",
607
+ "type": "stat"
608
+ },
609
+ {
610
+ "datasource": {
611
+ "type": "prometheus",
612
+ "uid": "prometheus"
613
+ },
614
+ "description": "Trace-context propagation failures in the selected range. Zero means no matching failures were observed; investigate any non-zero value in the lineage logs and Tempo.",
615
+ "fieldConfig": {
616
+ "defaults": {
617
+ "color": {
618
+ "mode": "thresholds"
619
+ },
620
+ "mappings": [],
621
+ "thresholds": {
622
+ "mode": "absolute",
623
+ "steps": [
624
+ {
625
+ "color": "green",
626
+ "value": null
627
+ },
628
+ {
629
+ "color": "red",
630
+ "value": 1
631
+ }
632
+ ]
633
+ },
634
+ "unit": "short"
635
+ },
636
+ "overrides": []
637
+ },
638
+ "gridPos": {
639
+ "h": 4,
640
+ "w": 3,
641
+ "x": 21,
642
+ "y": 6
643
+ },
644
+ "id": 7,
645
+ "options": {
646
+ "colorMode": "value",
647
+ "graphMode": "area",
648
+ "justifyMode": "auto",
649
+ "orientation": "auto",
650
+ "reduceOptions": {
651
+ "calcs": [
652
+ "lastNotNull"
653
+ ],
654
+ "fields": "",
655
+ "values": false
656
+ },
657
+ "showPercentChange": false,
658
+ "textMode": "auto",
659
+ "wideLayout": true
660
+ },
661
+ "pluginVersion": "11.1.0",
662
+ "targets": [
663
+ {
664
+ "datasource": {
665
+ "type": "prometheus",
666
+ "uid": "prometheus"
667
+ },
668
+ "editorMode": "code",
669
+ "expr": "sum(increase(observme_trace_context_propagation_failures_total[$__range])) or vector(0)",
670
+ "instant": true,
671
+ "range": false,
672
+ "refId": "A"
673
+ }
674
+ ],
675
+ "title": "Propagation failures",
676
+ "type": "stat"
677
+ },
678
+ {
679
+ "collapsed": false,
680
+ "gridPos": {
681
+ "h": 1,
682
+ "w": 24,
683
+ "x": 0,
684
+ "y": 10
685
+ },
686
+ "id": 101,
687
+ "panels": [],
688
+ "title": "Flow",
689
+ "type": "row"
690
+ },
691
+ {
692
+ "datasource": {
693
+ "type": "prometheus",
694
+ "uid": "prometheus"
695
+ },
696
+ "description": "Per-minute aggregate work rate through major trace stages. Missing series indicate no matching metric samples; they are not synthesized into per-execution data.",
697
+ "fieldConfig": {
698
+ "defaults": {
699
+ "color": {
700
+ "mode": "palette-classic"
701
+ },
702
+ "custom": {
703
+ "axisBorderShow": false,
704
+ "axisCenteredZero": false,
705
+ "axisColorMode": "text",
706
+ "axisLabel": "events/min",
707
+ "axisPlacement": "auto",
708
+ "barAlignment": 0,
709
+ "drawStyle": "line",
710
+ "fillOpacity": 18,
711
+ "gradientMode": "opacity",
712
+ "hideFrom": {
713
+ "legend": false,
714
+ "tooltip": false,
715
+ "viz": false
716
+ },
717
+ "insertNulls": false,
718
+ "lineInterpolation": "smooth",
719
+ "lineWidth": 2,
720
+ "pointSize": 5,
721
+ "scaleDistribution": {
722
+ "type": "linear"
723
+ },
724
+ "showPoints": "never",
725
+ "spanNulls": false,
726
+ "stacking": {
727
+ "group": "A",
728
+ "mode": "none"
729
+ },
730
+ "thresholdsStyle": {
731
+ "mode": "off"
732
+ }
733
+ },
734
+ "mappings": [],
735
+ "thresholds": {
736
+ "mode": "absolute",
737
+ "steps": [
738
+ {
739
+ "color": "green",
740
+ "value": null
741
+ }
742
+ ]
743
+ },
744
+ "unit": "ops"
745
+ },
746
+ "overrides": []
747
+ },
748
+ "gridPos": {
749
+ "h": 8,
750
+ "w": 24,
751
+ "x": 0,
752
+ "y": 11
753
+ },
754
+ "id": 8,
755
+ "options": {
756
+ "legend": {
757
+ "calcs": [],
758
+ "displayMode": "list",
759
+ "placement": "bottom",
760
+ "showLegend": true
761
+ },
762
+ "tooltip": {
763
+ "mode": "multi",
764
+ "sort": "none"
765
+ }
766
+ },
767
+ "targets": [
768
+ {
769
+ "datasource": {
770
+ "type": "prometheus",
771
+ "uid": "prometheus"
772
+ },
773
+ "editorMode": "code",
774
+ "expr": "60 * sum(rate(observme_turns_completed_total[$__rate_interval]))",
775
+ "legendFormat": "turns",
776
+ "range": true,
777
+ "refId": "A"
778
+ },
779
+ {
780
+ "datasource": {
781
+ "type": "prometheus",
782
+ "uid": "prometheus"
783
+ },
784
+ "editorMode": "code",
785
+ "expr": "60 * sum(rate(observme_llm_requests_total[$__rate_interval]))",
786
+ "legendFormat": "llm requests",
787
+ "range": true,
788
+ "refId": "B"
789
+ },
790
+ {
791
+ "datasource": {
792
+ "type": "prometheus",
793
+ "uid": "prometheus"
794
+ },
795
+ "editorMode": "code",
796
+ "expr": "60 * sum(rate(observme_tool_calls_total[$__rate_interval]))",
797
+ "legendFormat": "tool calls",
798
+ "range": true,
799
+ "refId": "C"
800
+ },
801
+ {
802
+ "datasource": {
803
+ "type": "prometheus",
804
+ "uid": "prometheus"
805
+ },
806
+ "editorMode": "code",
807
+ "expr": "60 * sum(rate(observme_bash_executions_total[$__rate_interval]))",
808
+ "legendFormat": "bash executions",
809
+ "range": true,
810
+ "refId": "D"
811
+ },
812
+ {
813
+ "datasource": {
814
+ "type": "prometheus",
815
+ "uid": "prometheus"
816
+ },
817
+ "editorMode": "code",
818
+ "expr": "60 * sum(rate(observme_subagents_spawned_total[$__rate_interval]))",
819
+ "legendFormat": "subagent spawns",
820
+ "range": true,
821
+ "refId": "E"
822
+ },
823
+ {
824
+ "datasource": {
825
+ "type": "prometheus",
826
+ "uid": "prometheus"
827
+ },
828
+ "editorMode": "code",
829
+ "expr": "60 * sum(rate(observme_compactions_total[$__rate_interval]))",
830
+ "legendFormat": "compactions",
831
+ "range": true,
832
+ "refId": "F"
833
+ }
834
+ ],
835
+ "title": "Journey flow rate",
836
+ "type": "timeseries"
837
+ },
838
+ {
839
+ "collapsed": false,
840
+ "gridPos": {
841
+ "h": 1,
842
+ "w": 24,
843
+ "x": 0,
844
+ "y": 19
845
+ },
846
+ "id": 102,
847
+ "panels": [],
848
+ "title": "Latency",
849
+ "type": "row"
850
+ },
851
+ {
852
+ "datasource": {
853
+ "type": "prometheus",
854
+ "uid": "prometheus"
855
+ },
856
+ "description": "Current p95 duration for major trace stages from bounded aggregate histograms. Sparse or idle windows can show no value; use Journey flow rate for volume context before choosing a representative Tempo trace.",
857
+ "fieldConfig": {
858
+ "defaults": {
859
+ "color": {
860
+ "mode": "palette-classic"
861
+ },
862
+ "mappings": [],
863
+ "thresholds": {
864
+ "mode": "absolute",
865
+ "steps": [
866
+ {
867
+ "color": "green",
868
+ "value": null
869
+ }
870
+ ]
871
+ },
872
+ "unit": "ms"
873
+ },
874
+ "overrides": []
875
+ },
876
+ "gridPos": {
877
+ "h": 8,
878
+ "w": 24,
879
+ "x": 0,
880
+ "y": 20
881
+ },
882
+ "id": 9,
883
+ "options": {
884
+ "displayMode": "gradient",
885
+ "maxVizHeight": 300,
886
+ "minVizHeight": 10,
887
+ "minVizWidth": 0,
888
+ "namePlacement": "auto",
889
+ "orientation": "horizontal",
890
+ "reduceOptions": {
891
+ "calcs": [
892
+ "lastNotNull"
893
+ ],
894
+ "fields": "",
895
+ "values": false
896
+ },
897
+ "showUnfilled": true,
898
+ "sizing": "auto"
899
+ },
900
+ "pluginVersion": "11.1.0",
901
+ "targets": [
902
+ {
903
+ "datasource": {
904
+ "type": "prometheus",
905
+ "uid": "prometheus"
906
+ },
907
+ "editorMode": "code",
908
+ "expr": "histogram_quantile(0.95, sum(rate(observme_agent_run_duration_ms_bucket[$__rate_interval])) by (le))",
909
+ "instant": true,
910
+ "legendFormat": "agent run",
911
+ "range": false,
912
+ "refId": "A"
913
+ },
914
+ {
915
+ "datasource": {
916
+ "type": "prometheus",
917
+ "uid": "prometheus"
918
+ },
919
+ "editorMode": "code",
920
+ "expr": "histogram_quantile(0.95, sum(rate(observme_turn_duration_ms_bucket[$__rate_interval])) by (le))",
921
+ "instant": true,
922
+ "legendFormat": "turn",
923
+ "range": false,
924
+ "refId": "B"
925
+ },
926
+ {
927
+ "datasource": {
928
+ "type": "prometheus",
929
+ "uid": "prometheus"
930
+ },
931
+ "editorMode": "code",
932
+ "expr": "histogram_quantile(0.95, sum(rate(observme_llm_request_duration_ms_bucket[$__rate_interval])) by (le))",
933
+ "instant": true,
934
+ "legendFormat": "llm",
935
+ "range": false,
936
+ "refId": "C"
937
+ },
938
+ {
939
+ "datasource": {
940
+ "type": "prometheus",
941
+ "uid": "prometheus"
942
+ },
943
+ "editorMode": "code",
944
+ "expr": "histogram_quantile(0.95, sum(rate(observme_tool_duration_ms_bucket[$__rate_interval])) by (le))",
945
+ "instant": true,
946
+ "legendFormat": "tool",
947
+ "range": false,
948
+ "refId": "D"
949
+ },
950
+ {
951
+ "datasource": {
952
+ "type": "prometheus",
953
+ "uid": "prometheus"
954
+ },
955
+ "editorMode": "code",
956
+ "expr": "histogram_quantile(0.95, sum(rate(observme_bash_duration_ms_bucket[$__rate_interval])) by (le))",
957
+ "instant": true,
958
+ "legendFormat": "bash",
959
+ "range": false,
960
+ "refId": "E"
961
+ },
962
+ {
963
+ "datasource": {
964
+ "type": "prometheus",
965
+ "uid": "prometheus"
966
+ },
967
+ "editorMode": "code",
968
+ "expr": "histogram_quantile(0.95, sum(rate(observme_agent_wait_duration_ms_bucket[$__rate_interval])) by (le))",
969
+ "instant": true,
970
+ "legendFormat": "wait",
971
+ "range": false,
972
+ "refId": "F"
973
+ },
974
+ {
975
+ "datasource": {
976
+ "type": "prometheus",
977
+ "uid": "prometheus"
978
+ },
979
+ "editorMode": "code",
980
+ "expr": "histogram_quantile(0.95, sum(rate(observme_agent_join_duration_ms_bucket[$__rate_interval])) by (le))",
981
+ "instant": true,
982
+ "legendFormat": "join",
983
+ "range": false,
984
+ "refId": "G"
985
+ }
986
+ ],
987
+ "title": "p95 stage latency",
988
+ "type": "bargauge"
989
+ },
990
+ {
991
+ "collapsed": false,
992
+ "gridPos": {
993
+ "h": 1,
994
+ "w": 24,
995
+ "x": 0,
996
+ "y": 28
997
+ },
998
+ "id": 103,
999
+ "panels": [],
1000
+ "title": "Agent lineage",
1001
+ "type": "row"
1002
+ },
1003
+ {
1004
+ "datasource": {
1005
+ "type": "prometheus",
1006
+ "uid": "prometheus"
1007
+ },
1008
+ "description": "Shape of the agent tree over time without using workflow or agent IDs as metric labels. Constant reference lines mirror the depth=5 and fan-out=20 alert thresholds.",
1009
+ "fieldConfig": {
1010
+ "defaults": {
1011
+ "color": {
1012
+ "mode": "palette-classic"
1013
+ },
1014
+ "custom": {
1015
+ "axisBorderShow": false,
1016
+ "axisCenteredZero": false,
1017
+ "axisColorMode": "text",
1018
+ "axisLabel": "count",
1019
+ "axisPlacement": "auto",
1020
+ "barAlignment": 0,
1021
+ "drawStyle": "line",
1022
+ "fillOpacity": 12,
1023
+ "gradientMode": "opacity",
1024
+ "hideFrom": {
1025
+ "legend": false,
1026
+ "tooltip": false,
1027
+ "viz": false
1028
+ },
1029
+ "insertNulls": false,
1030
+ "lineInterpolation": "smooth",
1031
+ "lineWidth": 2,
1032
+ "pointSize": 5,
1033
+ "scaleDistribution": {
1034
+ "type": "linear"
1035
+ },
1036
+ "showPoints": "never",
1037
+ "spanNulls": false,
1038
+ "stacking": {
1039
+ "group": "A",
1040
+ "mode": "none"
1041
+ },
1042
+ "thresholdsStyle": {
1043
+ "mode": "off"
1044
+ }
1045
+ },
1046
+ "mappings": [],
1047
+ "thresholds": {
1048
+ "mode": "absolute",
1049
+ "steps": [
1050
+ {
1051
+ "color": "green",
1052
+ "value": null
1053
+ }
1054
+ ]
1055
+ },
1056
+ "unit": "short"
1057
+ },
1058
+ "overrides": []
1059
+ },
1060
+ "gridPos": {
1061
+ "h": 8,
1062
+ "w": 12,
1063
+ "x": 0,
1064
+ "y": 29
1065
+ },
1066
+ "id": 10,
1067
+ "options": {
1068
+ "legend": {
1069
+ "calcs": [],
1070
+ "displayMode": "list",
1071
+ "placement": "bottom",
1072
+ "showLegend": true
1073
+ },
1074
+ "tooltip": {
1075
+ "mode": "multi",
1076
+ "sort": "none"
1077
+ }
1078
+ },
1079
+ "targets": [
1080
+ {
1081
+ "datasource": {
1082
+ "type": "prometheus",
1083
+ "uid": "prometheus"
1084
+ },
1085
+ "editorMode": "code",
1086
+ "expr": "sum(observme_active_agents) by (agent_role)",
1087
+ "legendFormat": "active {{agent_role}}",
1088
+ "range": true,
1089
+ "refId": "A"
1090
+ },
1091
+ {
1092
+ "datasource": {
1093
+ "type": "prometheus",
1094
+ "uid": "prometheus"
1095
+ },
1096
+ "editorMode": "code",
1097
+ "expr": "histogram_quantile(0.95, sum(rate(observme_agent_tree_depth_bucket[$__rate_interval])) by (le))",
1098
+ "legendFormat": "tree depth p95",
1099
+ "range": true,
1100
+ "refId": "B"
1101
+ },
1102
+ {
1103
+ "datasource": {
1104
+ "type": "prometheus",
1105
+ "uid": "prometheus"
1106
+ },
1107
+ "editorMode": "code",
1108
+ "expr": "histogram_quantile(0.95, sum(rate(observme_agent_tree_width_bucket[$__rate_interval])) by (le))",
1109
+ "legendFormat": "tree width p95",
1110
+ "range": true,
1111
+ "refId": "C"
1112
+ },
1113
+ {
1114
+ "datasource": {
1115
+ "type": "prometheus",
1116
+ "uid": "prometheus"
1117
+ },
1118
+ "editorMode": "code",
1119
+ "expr": "histogram_quantile(0.95, sum(rate(observme_agent_fanout_count_bucket[$__rate_interval])) by (le))",
1120
+ "legendFormat": "fan-out p95",
1121
+ "range": true,
1122
+ "refId": "D"
1123
+ },
1124
+ {
1125
+ "datasource": {
1126
+ "type": "prometheus",
1127
+ "uid": "prometheus"
1128
+ },
1129
+ "editorMode": "code",
1130
+ "expr": "vector(5)",
1131
+ "refId": "E",
1132
+ "legendFormat": "depth alert threshold 5",
1133
+ "range": true
1134
+ },
1135
+ {
1136
+ "datasource": {
1137
+ "type": "prometheus",
1138
+ "uid": "prometheus"
1139
+ },
1140
+ "editorMode": "code",
1141
+ "expr": "vector(20)",
1142
+ "refId": "F",
1143
+ "legendFormat": "fan-out alert threshold 20",
1144
+ "range": true
1145
+ }
1146
+ ],
1147
+ "title": "Agent tree shape",
1148
+ "type": "timeseries",
1149
+ "links": [
1150
+ {
1151
+ "targetBlank": false,
1152
+ "title": "Open Agents dashboard",
1153
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
1154
+ },
1155
+ {
1156
+ "targetBlank": false,
1157
+ "title": "Open Agent Node Graphs",
1158
+ "url": "/d/observme-agent-node-graphs/observme-agent-node-graphs?${__url_time_range}"
1159
+ }
1160
+ ]
1161
+ },
1162
+ {
1163
+ "datasource": {
1164
+ "type": "prometheus",
1165
+ "uid": "prometheus"
1166
+ },
1167
+ "description": "Selected-range spawn attempts by emitted depth/reason labels, with failed spawn volume grouped separately by the failure counter’s emitted spawn_type/error_class labels. The two frames provide context and must not be read as direct label-matched attribution.",
1168
+ "fieldConfig": {
1169
+ "defaults": {
1170
+ "color": {
1171
+ "mode": "palette-classic"
1172
+ },
1173
+ "custom": {
1174
+ "axisBorderShow": false,
1175
+ "axisCenteredZero": false,
1176
+ "axisColorMode": "text",
1177
+ "axisLabel": "spawns",
1178
+ "axisPlacement": "auto",
1179
+ "fillOpacity": 80,
1180
+ "gradientMode": "none",
1181
+ "hideFrom": {
1182
+ "legend": false,
1183
+ "tooltip": false,
1184
+ "viz": false
1185
+ },
1186
+ "lineWidth": 1,
1187
+ "scaleDistribution": {
1188
+ "type": "linear"
1189
+ },
1190
+ "thresholdsStyle": {
1191
+ "mode": "off"
1192
+ }
1193
+ },
1194
+ "mappings": [],
1195
+ "thresholds": {
1196
+ "mode": "absolute",
1197
+ "steps": [
1198
+ {
1199
+ "color": "green",
1200
+ "value": null
1201
+ }
1202
+ ]
1203
+ },
1204
+ "unit": "short"
1205
+ },
1206
+ "overrides": []
1207
+ },
1208
+ "gridPos": {
1209
+ "h": 8,
1210
+ "w": 12,
1211
+ "x": 12,
1212
+ "y": 29
1213
+ },
1214
+ "id": 11,
1215
+ "options": {
1216
+ "barRadius": 0,
1217
+ "barWidth": 0.97,
1218
+ "fullHighlight": false,
1219
+ "groupWidth": 0.7,
1220
+ "legend": {
1221
+ "calcs": [],
1222
+ "displayMode": "list",
1223
+ "placement": "bottom",
1224
+ "showLegend": true
1225
+ },
1226
+ "orientation": "auto",
1227
+ "showValue": "auto",
1228
+ "stacking": "normal",
1229
+ "tooltip": {
1230
+ "mode": "multi",
1231
+ "sort": "none"
1232
+ },
1233
+ "xTickLabelRotation": 0,
1234
+ "xTickLabelSpacing": 0
1235
+ },
1236
+ "targets": [
1237
+ {
1238
+ "datasource": {
1239
+ "type": "prometheus",
1240
+ "uid": "prometheus"
1241
+ },
1242
+ "editorMode": "code",
1243
+ "expr": "sum(increase(observme_subagents_spawned_total[$__range])) by (subagent_depth, spawn_reason)",
1244
+ "instant": true,
1245
+ "legendFormat": "depth {{subagent_depth}} / {{spawn_reason}}",
1246
+ "range": false,
1247
+ "refId": "A"
1248
+ },
1249
+ {
1250
+ "datasource": {
1251
+ "type": "prometheus",
1252
+ "uid": "prometheus"
1253
+ },
1254
+ "editorMode": "code",
1255
+ "expr": "sum(increase(observme_subagent_spawn_failures_total[$__range])) by (spawn_type, error_class)",
1256
+ "refId": "B",
1257
+ "legendFormat": "failed {{spawn_type}} / {{error_class}}",
1258
+ "instant": true,
1259
+ "range": false
1260
+ }
1261
+ ],
1262
+ "title": "Subagent handoffs by depth and reason",
1263
+ "type": "barchart",
1264
+ "links": [
1265
+ {
1266
+ "targetBlank": false,
1267
+ "title": "Open Agents dashboard",
1268
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
1269
+ }
1270
+ ]
1271
+ },
1272
+ {
1273
+ "collapsed": false,
1274
+ "gridPos": {
1275
+ "h": 1,
1276
+ "w": 24,
1277
+ "x": 0,
1278
+ "y": 37
1279
+ },
1280
+ "id": 104,
1281
+ "panels": [],
1282
+ "title": "Logs",
1283
+ "type": "row"
1284
+ },
1285
+ {
1286
+ "datasource": {
1287
+ "type": "loki",
1288
+ "uid": "loki"
1289
+ },
1290
+ "description": "Chronological ObservMe journey events from Loki. Session, workflow, agent, and run filters narrow one execution; this remains a logs panel because Loki log streams do not provide state-timeline frames without extra transforms. Empty means no matching lifecycle logs were observed in the selected range.",
1291
+ "fieldConfig": {
1292
+ "defaults": {
1293
+ "color": {
1294
+ "mode": "palette-classic"
1295
+ },
1296
+ "custom": {
1297
+ "fillOpacity": 70,
1298
+ "hideFrom": {
1299
+ "legend": false,
1300
+ "tooltip": false,
1301
+ "viz": false
1302
+ },
1303
+ "lineWidth": 0,
1304
+ "spanNulls": false
1305
+ },
1306
+ "mappings": [],
1307
+ "thresholds": {
1308
+ "mode": "absolute",
1309
+ "steps": [
1310
+ {
1311
+ "color": "green",
1312
+ "value": null
1313
+ }
1314
+ ]
1315
+ },
1316
+ "unit": "short"
1317
+ },
1318
+ "overrides": []
1319
+ },
1320
+ "gridPos": {
1321
+ "h": 8,
1322
+ "w": 24,
1323
+ "x": 0,
1324
+ "y": 38
1325
+ },
1326
+ "id": 12,
1327
+ "options": {
1328
+ "dedupStrategy": "none",
1329
+ "enableLogDetails": true,
1330
+ "prettifyLogMessage": false,
1331
+ "showCommonLabels": false,
1332
+ "showLabels": true,
1333
+ "showTime": true,
1334
+ "sortOrder": "Ascending",
1335
+ "wrapLogMessage": true
1336
+ },
1337
+ "targets": [
1338
+ {
1339
+ "datasource": {
1340
+ "type": "loki",
1341
+ "uid": "loki"
1342
+ },
1343
+ "editorMode": "code",
1344
+ "expr": "{service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\", pi_agent_run_id=~\"${agent_run_id:regex}\", event_name=~\"session[.](started|shutdown)|workflow[.](started|completed|failed)|agent[.](run[.](started|completed|failed)|spawn[.](started|completed|failed)|wait[.](started|completed)|join[.](started|completed)|orphaned)|trace_context[.]propagation_failed|turn[.](started|completed)|llm[.]request[.](started|completed|failed)|tool[.]call[.](started|completed|failed)|bash[.]completed|branch[.]created|compaction[.]created\"}",
1345
+ "queryType": "range",
1346
+ "refId": "A",
1347
+ "maxLines": 1000,
1348
+ "range": true
1349
+ }
1350
+ ],
1351
+ "title": "Execution journey events",
1352
+ "type": "logs",
1353
+ "links": [
1354
+ {
1355
+ "targetBlank": false,
1356
+ "title": "Open matching LLM Conversations",
1357
+ "url": "/d/observme-llm-conversations/observme-llm-conversations?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
1358
+ }
1359
+ ]
1360
+ },
1361
+ {
1362
+ "datasource": {
1363
+ "type": "loki",
1364
+ "uid": "loki"
1365
+ },
1366
+ "description": "Chronological parent/child handoff and lineage-failure rows from Loki. Deterministic safe fields expose event, session, workflow, parent, child/agent, run, trace, and span context while hiding the raw line. trace_id opens Tempo and agent_run reopens this dashboard with matching filters. Empty means no matching handoff or lineage-failure logs were observed in the selected range.",
1367
+ "fieldConfig": {
1368
+ "defaults": {
1369
+ "color": {
1370
+ "mode": "palette-classic"
1371
+ },
1372
+ "mappings": [],
1373
+ "thresholds": {
1374
+ "mode": "absolute",
1375
+ "steps": [
1376
+ {
1377
+ "color": "green",
1378
+ "value": null
1379
+ }
1380
+ ]
1381
+ },
1382
+ "unit": "short"
1383
+ },
1384
+ "overrides": [
1385
+ {
1386
+ "matcher": {
1387
+ "id": "byName",
1388
+ "options": "trace_id"
1389
+ },
1390
+ "properties": [
1391
+ {
1392
+ "id": "links",
1393
+ "value": [
1394
+ {
1395
+ "targetBlank": false,
1396
+ "title": "Open Tempo trace",
1397
+ "url": "/explore?left=%7B%22datasource%22:%22tempo%22,%22queries%22:%5B%7B%22query%22:%22${__value.raw}%22%7D%5D,%22range%22:%7B%22from%22:%22${__from}%22,%22to%22:%22${__to}%22%7D%7D"
1398
+ }
1399
+ ]
1400
+ }
1401
+ ]
1402
+ },
1403
+ {
1404
+ "matcher": {
1405
+ "id": "byName",
1406
+ "options": "agent_run"
1407
+ },
1408
+ "properties": [
1409
+ {
1410
+ "id": "links",
1411
+ "value": [
1412
+ {
1413
+ "targetBlank": false,
1414
+ "title": "Open filtered Trace Journey",
1415
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&var-session_id=${__data.fields[\"session\"]}&var-workflow_id=${__data.fields[\"workflow\"]}&var-agent_id=${__data.fields[\"agent\"]}&var-agent_run_id=${__value.raw}"
1416
+ }
1417
+ ]
1418
+ }
1419
+ ]
1420
+ }
1421
+ ]
1422
+ },
1423
+ "gridPos": {
1424
+ "h": 10,
1425
+ "w": 24,
1426
+ "x": 0,
1427
+ "y": 46
1428
+ },
1429
+ "id": 13,
1430
+ "options": {
1431
+ "cellHeight": "sm",
1432
+ "footer": {
1433
+ "countRows": false,
1434
+ "fields": "",
1435
+ "reducer": [
1436
+ "sum"
1437
+ ],
1438
+ "show": false
1439
+ },
1440
+ "showHeader": true,
1441
+ "sortBy": [
1442
+ {
1443
+ "desc": false,
1444
+ "displayName": "Time"
1445
+ }
1446
+ ]
1447
+ },
1448
+ "targets": [
1449
+ {
1450
+ "datasource": {
1451
+ "type": "loki",
1452
+ "uid": "loki"
1453
+ },
1454
+ "editorMode": "code",
1455
+ "expr": "{service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\", pi_agent_run_id=~\"${agent_run_id:regex}\", event_category=\"agent-tree\", event_name=~\"agent[.]spawn[.](started|completed|failed)|agent[.](wait|join)[.](started|completed)|agent[.]orphaned|trace_context[.]propagation_failed\"} | line_format `{\"event\":{{ printf \"%q\" .event_name }},\"session\":{{ printf \"%q\" .pi_session_id }},\"workflow\":{{ printf \"%q\" .pi_workflow_id }},\"parent\":{{ printf \"%q\" .pi_agent_parent_id }},\"child\":{{ printf \"%q\" .pi_agent_child_id }},\"agent\":{{ printf \"%q\" .pi_agent_id }},\"agent_run\":{{ printf \"%q\" .pi_agent_run_id }},\"trace_id\":{{ printf \"%q\" .trace_id }},\"span_id\":{{ printf \"%q\" .span_id }}}`",
1456
+ "legendFormat": "{{event_name}}",
1457
+ "maxLines": 500,
1458
+ "queryType": "range",
1459
+ "range": true,
1460
+ "refId": "A"
1461
+ }
1462
+ ],
1463
+ "title": "Parent → child handoffs",
1464
+ "type": "table",
1465
+ "transformations": [
1466
+ {
1467
+ "id": "labelsToFields",
1468
+ "options": {
1469
+ "mode": "columns"
1470
+ }
1471
+ },
1472
+ {
1473
+ "id": "extractFields",
1474
+ "options": {
1475
+ "format": "json",
1476
+ "keepTime": true,
1477
+ "replace": false,
1478
+ "source": "Line"
1479
+ }
1480
+ },
1481
+ {
1482
+ "id": "organize",
1483
+ "options": {
1484
+ "excludeByName": {
1485
+ "Line": true,
1486
+ "id": true,
1487
+ "labels": true,
1488
+ "tsNs": true,
1489
+ "service_name": true,
1490
+ "telemetry_source": true
1491
+ },
1492
+ "renameByName": {
1493
+ "event_name": "event",
1494
+ "pi_session_id": "session",
1495
+ "pi_workflow_id": "workflow",
1496
+ "pi_agent_parent_id": "parent",
1497
+ "pi_agent_child_id": "child",
1498
+ "pi_agent_id": "agent",
1499
+ "pi_agent_run_id": "agent_run",
1500
+ "trace_id": "trace_id",
1501
+ "span_id": "span_id"
1502
+ }
1503
+ }
1504
+ }
1505
+ ],
1506
+ "pluginVersion": "11.1.0",
1507
+ "links": [
1508
+ {
1509
+ "targetBlank": false,
1510
+ "title": "Open Agents dashboard",
1511
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
1512
+ },
1513
+ {
1514
+ "targetBlank": false,
1515
+ "title": "Open Agent Node Graphs",
1516
+ "url": "/d/observme-agent-node-graphs/observme-agent-node-graphs?${__url_time_range}"
1517
+ }
1518
+ ]
1519
+ },
1520
+ {
1521
+ "datasource": {
1522
+ "type": "loki",
1523
+ "uid": "loki"
1524
+ },
1525
+ "description": "Full chronological lifecycle log for the selected execution filters. Labels and log details remain available for correlation with Tempo; empty means no matching lifecycle logs were observed in the selected range.",
1526
+ "gridPos": {
1527
+ "h": 10,
1528
+ "w": 24,
1529
+ "x": 0,
1530
+ "y": 56
1531
+ },
1532
+ "id": 15,
1533
+ "options": {
1534
+ "dedupStrategy": "none",
1535
+ "enableLogDetails": true,
1536
+ "prettifyLogMessage": false,
1537
+ "showCommonLabels": false,
1538
+ "showLabels": true,
1539
+ "showTime": true,
1540
+ "sortOrder": "Ascending",
1541
+ "wrapLogMessage": true
1542
+ },
1543
+ "targets": [
1544
+ {
1545
+ "datasource": {
1546
+ "type": "loki",
1547
+ "uid": "loki"
1548
+ },
1549
+ "editorMode": "code",
1550
+ "expr": "{service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\", pi_agent_run_id=~\"${agent_run_id:regex}\", event_name=~\"session[.](started|shutdown)|workflow[.](started|completed|failed)|agent[.](run[.](started|completed|failed)|spawn[.](started|completed|failed)|wait[.](started|completed)|join[.](started|completed)|orphaned)|trace_context[.]propagation_failed|turn[.](started|completed)|llm[.]request[.](started|completed|failed)|tool[.]call[.](started|completed|failed)|bash[.]completed|branch[.]created|compaction[.]created\"}",
1551
+ "queryType": "range",
1552
+ "refId": "A",
1553
+ "maxLines": 1000,
1554
+ "range": true
1555
+ }
1556
+ ],
1557
+ "title": "Ordered journey log",
1558
+ "type": "logs",
1559
+ "links": [
1560
+ {
1561
+ "title": "Open matching Trace Journey filters",
1562
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}",
1563
+ "targetBlank": false
1564
+ },
1565
+ {
1566
+ "title": "Open matching LLM Conversations",
1567
+ "url": "/d/observme-llm-conversations/observme-llm-conversations?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}",
1568
+ "targetBlank": false
1569
+ }
1570
+ ]
1571
+ },
1572
+ {
1573
+ "collapsed": false,
1574
+ "gridPos": {
1575
+ "h": 1,
1576
+ "w": 24,
1577
+ "x": 0,
1578
+ "y": 66
1579
+ },
1580
+ "id": 105,
1581
+ "panels": [],
1582
+ "title": "Traces",
1583
+ "type": "row"
1584
+ },
1585
+ {
1586
+ "datasource": {
1587
+ "type": "tempo",
1588
+ "uid": "tempo"
1589
+ },
1590
+ "description": "Recent ObservMe traces returned by a valid service-scoped TraceQL search. Open a trace row for the waterfall, or use trace_id links in the handoff table for an exact execution. Dashboard links keep the current Loki execution filters beside the trace search.",
1591
+ "fieldConfig": {
1592
+ "defaults": {
1593
+ "color": {
1594
+ "mode": "palette-classic"
1595
+ },
1596
+ "mappings": [],
1597
+ "thresholds": {
1598
+ "mode": "absolute",
1599
+ "steps": [
1600
+ {
1601
+ "color": "green",
1602
+ "value": null
1603
+ }
1604
+ ]
1605
+ },
1606
+ "unit": "short"
1607
+ },
1608
+ "overrides": []
1609
+ },
1610
+ "gridPos": {
1611
+ "h": 9,
1612
+ "w": 24,
1613
+ "x": 0,
1614
+ "y": 67
1615
+ },
1616
+ "id": 14,
1617
+ "options": {
1618
+ "cellHeight": "sm",
1619
+ "footer": {
1620
+ "countRows": false,
1621
+ "fields": "",
1622
+ "reducer": [
1623
+ "sum"
1624
+ ],
1625
+ "show": false
1626
+ },
1627
+ "showHeader": true
1628
+ },
1629
+ "targets": [
1630
+ {
1631
+ "datasource": {
1632
+ "type": "tempo",
1633
+ "uid": "tempo"
1634
+ },
1635
+ "limit": 100,
1636
+ "query": "{ resource.service.name = \"observme-pi-extension\" }",
1637
+ "queryType": "traceql",
1638
+ "refId": "A",
1639
+ "tableType": "traces"
1640
+ }
1641
+ ],
1642
+ "title": "Recent Tempo traces",
1643
+ "type": "table",
1644
+ "links": [
1645
+ {
1646
+ "title": "Open matching journey logs",
1647
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}",
1648
+ "targetBlank": false
1649
+ },
1650
+ {
1651
+ "title": "Open matching LLM Conversations",
1652
+ "url": "/d/observme-llm-conversations/observme-llm-conversations?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}",
1653
+ "targetBlank": false
1654
+ },
1655
+ {
1656
+ "title": "Open Agents dashboard",
1657
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}",
1658
+ "targetBlank": false
1659
+ },
1660
+ {
1661
+ "title": "Open Agent Node Graphs",
1662
+ "url": "/d/observme-agent-node-graphs/observme-agent-node-graphs?${__url_time_range}",
1663
+ "targetBlank": false
1664
+ }
1665
+ ]
1666
+ }
1667
+ ],
1668
+ "refresh": "10s",
1669
+ "schemaVersion": 39,
1670
+ "style": "dark",
1671
+ "tags": [
1672
+ "observme",
1673
+ "pi",
1674
+ "trace",
1675
+ "journey",
1676
+ "tempo",
1677
+ "lineage"
1678
+ ],
1679
+ "templating": {
1680
+ "list": [
1681
+ {
1682
+ "allValue": ".*",
1683
+ "current": {
1684
+ "selected": true,
1685
+ "text": "All",
1686
+ "value": "$__all"
1687
+ },
1688
+ "datasource": {
1689
+ "type": "loki",
1690
+ "uid": "loki"
1691
+ },
1692
+ "definition": "label_values({service_name=\"observme-pi-extension\"}, pi_session_id)",
1693
+ "hide": 0,
1694
+ "includeAll": true,
1695
+ "label": "Session ID",
1696
+ "multi": true,
1697
+ "name": "session_id",
1698
+ "options": [],
1699
+ "query": "label_values({service_name=\"observme-pi-extension\"}, pi_session_id)",
1700
+ "refresh": 2,
1701
+ "regex": "",
1702
+ "skipUrlSync": false,
1703
+ "sort": 1,
1704
+ "type": "query"
1705
+ },
1706
+ {
1707
+ "allValue": ".*",
1708
+ "current": {
1709
+ "selected": true,
1710
+ "text": "All",
1711
+ "value": "$__all"
1712
+ },
1713
+ "datasource": {
1714
+ "type": "loki",
1715
+ "uid": "loki"
1716
+ },
1717
+ "definition": "label_values({service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\"}, pi_workflow_id)",
1718
+ "hide": 0,
1719
+ "includeAll": true,
1720
+ "label": "Workflow ID",
1721
+ "multi": true,
1722
+ "name": "workflow_id",
1723
+ "options": [],
1724
+ "query": "label_values({service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\"}, pi_workflow_id)",
1725
+ "refresh": 2,
1726
+ "regex": "",
1727
+ "skipUrlSync": false,
1728
+ "sort": 1,
1729
+ "type": "query"
1730
+ },
1731
+ {
1732
+ "allValue": ".*",
1733
+ "current": {
1734
+ "selected": true,
1735
+ "text": "All",
1736
+ "value": "$__all"
1737
+ },
1738
+ "datasource": {
1739
+ "type": "loki",
1740
+ "uid": "loki"
1741
+ },
1742
+ "definition": "label_values({service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\"}, pi_agent_id)",
1743
+ "hide": 0,
1744
+ "includeAll": true,
1745
+ "label": "Agent ID",
1746
+ "multi": true,
1747
+ "name": "agent_id",
1748
+ "options": [],
1749
+ "query": "label_values({service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\"}, pi_agent_id)",
1750
+ "refresh": 2,
1751
+ "regex": "",
1752
+ "skipUrlSync": false,
1753
+ "sort": 1,
1754
+ "type": "query"
1755
+ },
1756
+ {
1757
+ "allValue": ".*",
1758
+ "current": {
1759
+ "selected": true,
1760
+ "text": "All",
1761
+ "value": "$__all"
1762
+ },
1763
+ "datasource": {
1764
+ "type": "loki",
1765
+ "uid": "loki"
1766
+ },
1767
+ "definition": "label_values({service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\"}, pi_agent_run_id)",
1768
+ "hide": 0,
1769
+ "includeAll": true,
1770
+ "label": "Agent run ID",
1771
+ "multi": true,
1772
+ "name": "agent_run_id",
1773
+ "options": [],
1774
+ "query": "label_values({service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\"}, pi_agent_run_id)",
1775
+ "refresh": 2,
1776
+ "regex": "",
1777
+ "skipUrlSync": false,
1778
+ "sort": 1,
1779
+ "type": "query"
1780
+ }
1781
+ ]
1782
+ },
1783
+ "time": {
1784
+ "from": "now-6h",
1785
+ "to": "now"
1786
+ },
1787
+ "timepicker": {},
1788
+ "timezone": "browser",
1789
+ "title": "ObservMe Trace Journey",
1790
+ "uid": "observme-trace-journey",
1791
+ "version": 2,
1792
+ "weekStart": ""
1793
+ }