@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,1659 @@
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": "row",
23
+ "name": "Row",
24
+ "type": "panel",
25
+ "version": ""
26
+ },
27
+ {
28
+ "id": "timeseries",
29
+ "name": "Time series",
30
+ "type": "panel",
31
+ "version": ""
32
+ },
33
+ {
34
+ "id": "stat",
35
+ "name": "Stat",
36
+ "type": "panel",
37
+ "version": ""
38
+ },
39
+ {
40
+ "id": "logs",
41
+ "name": "Logs",
42
+ "type": "panel",
43
+ "version": ""
44
+ },
45
+ {
46
+ "id": "table",
47
+ "name": "Table",
48
+ "type": "panel",
49
+ "version": ""
50
+ }
51
+ ],
52
+ "annotations": {
53
+ "list": []
54
+ },
55
+ "editable": true,
56
+ "fiscalYearStartMonth": 0,
57
+ "graphTooltip": 1,
58
+ "id": null,
59
+ "links": [
60
+ {
61
+ "icon": "external link",
62
+ "includeVars": true,
63
+ "keepTime": true,
64
+ "targetBlank": false,
65
+ "title": "Overview",
66
+ "tooltip": "Open the overview with the current time range.",
67
+ "type": "link",
68
+ "url": "/d/observme-overview/observme-overview?${__url_time_range}"
69
+ },
70
+ {
71
+ "icon": "external link",
72
+ "includeVars": true,
73
+ "keepTime": true,
74
+ "targetBlank": false,
75
+ "title": "Models",
76
+ "tooltip": "Open provider and model reliability details.",
77
+ "type": "link",
78
+ "url": "/d/observme-models/observme-models?${__url_time_range}"
79
+ },
80
+ {
81
+ "icon": "external link",
82
+ "includeVars": true,
83
+ "keepTime": true,
84
+ "targetBlank": false,
85
+ "title": "Tools",
86
+ "tooltip": "Open tool reliability and latency details.",
87
+ "type": "link",
88
+ "url": "/d/observme-tools/observme-tools?${__url_time_range}"
89
+ },
90
+ {
91
+ "icon": "external link",
92
+ "includeVars": true,
93
+ "keepTime": true,
94
+ "targetBlank": false,
95
+ "title": "Agents",
96
+ "tooltip": "Open agent and lineage reliability details.",
97
+ "type": "link",
98
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
99
+ },
100
+ {
101
+ "icon": "external link",
102
+ "includeVars": true,
103
+ "keepTime": true,
104
+ "targetBlank": false,
105
+ "title": "Trace Journey",
106
+ "tooltip": "Open trace/log drill-downs with the current time range and context filters.",
107
+ "type": "link",
108
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
109
+ },
110
+ {
111
+ "icon": "external link",
112
+ "includeVars": true,
113
+ "keepTime": true,
114
+ "targetBlank": false,
115
+ "title": "Export Health",
116
+ "tooltip": "Open export and handler self-observability panels.",
117
+ "type": "link",
118
+ "url": "/d/observme-export-health/observme-export-health?${__url_time_range}"
119
+ }
120
+ ],
121
+ "liveNow": false,
122
+ "panels": [
123
+ {
124
+ "collapsed": false,
125
+ "gridPos": {
126
+ "h": 1,
127
+ "w": 24,
128
+ "x": 0,
129
+ "y": 0
130
+ },
131
+ "id": 100,
132
+ "panels": [],
133
+ "title": "Error health",
134
+ "type": "row"
135
+ },
136
+ {
137
+ "datasource": {
138
+ "type": "prometheus",
139
+ "uid": "prometheus"
140
+ },
141
+ "description": "Selected-range sum of bounded failure counter increments. This is error-signal pressure, not a unique incident count: one failure can increment more than one lifecycle counter. Missing series are treated as zero.",
142
+ "fieldConfig": {
143
+ "defaults": {
144
+ "color": {
145
+ "mode": "thresholds"
146
+ },
147
+ "mappings": [],
148
+ "thresholds": {
149
+ "mode": "absolute",
150
+ "steps": [
151
+ {
152
+ "color": "green",
153
+ "value": null
154
+ },
155
+ {
156
+ "color": "red",
157
+ "value": 1e-9
158
+ }
159
+ ]
160
+ },
161
+ "unit": "short"
162
+ },
163
+ "overrides": []
164
+ },
165
+ "gridPos": {
166
+ "h": 5,
167
+ "w": 6,
168
+ "x": 0,
169
+ "y": 1
170
+ },
171
+ "id": 11,
172
+ "links": [
173
+ {
174
+ "targetBlank": false,
175
+ "title": "Open Trace Journey",
176
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
177
+ }
178
+ ],
179
+ "options": {
180
+ "colorMode": "value",
181
+ "graphMode": "area",
182
+ "justifyMode": "auto",
183
+ "orientation": "auto",
184
+ "reduceOptions": {
185
+ "calcs": [
186
+ "lastNotNull"
187
+ ],
188
+ "fields": "",
189
+ "values": false
190
+ },
191
+ "showPercentChange": false,
192
+ "textMode": "auto",
193
+ "wideLayout": true
194
+ },
195
+ "pluginVersion": "11.1.0",
196
+ "targets": [
197
+ {
198
+ "datasource": {
199
+ "type": "prometheus",
200
+ "uid": "prometheus"
201
+ },
202
+ "editorMode": "code",
203
+ "expr": "(sum(increase(observme_workflow_errors_total[$__range])) or vector(0)) + (sum(increase(observme_agent_run_errors_total[$__range])) or vector(0)) + (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)) + (sum(increase(observme_child_agent_failures_total[$__range])) or vector(0)) + (sum(increase(observme_llm_errors_total[$__range])) or vector(0)) + (sum(increase(observme_tool_failures_total[$__range])) or vector(0)) + (sum(increase(observme_bash_failures_total[$__range])) or vector(0)) + (sum(increase(observme_telemetry_dropped_total[$__range])) or vector(0)) + (sum(increase(observme_redaction_failures_total[$__range])) or vector(0)) + (sum(increase(observme_export_errors_total[$__range])) or vector(0)) + (sum(increase(observme_handler_errors_total[$__range])) or vector(0))",
204
+ "instant": true,
205
+ "legendFormat": "error signals",
206
+ "range": false,
207
+ "refId": "A"
208
+ }
209
+ ],
210
+ "title": "Total error signals",
211
+ "type": "stat"
212
+ },
213
+ {
214
+ "datasource": {
215
+ "type": "prometheus",
216
+ "uid": "prometheus"
217
+ },
218
+ "description": "Root workflows that ended in an explicit failure during the selected range. Missing series are treated as zero.",
219
+ "fieldConfig": {
220
+ "defaults": {
221
+ "color": {
222
+ "mode": "thresholds"
223
+ },
224
+ "mappings": [],
225
+ "thresholds": {
226
+ "mode": "absolute",
227
+ "steps": [
228
+ {
229
+ "color": "green",
230
+ "value": null
231
+ },
232
+ {
233
+ "color": "red",
234
+ "value": 1e-9
235
+ }
236
+ ]
237
+ },
238
+ "unit": "short"
239
+ },
240
+ "overrides": []
241
+ },
242
+ "gridPos": {
243
+ "h": 5,
244
+ "w": 6,
245
+ "x": 6,
246
+ "y": 1
247
+ },
248
+ "id": 12,
249
+ "links": [
250
+ {
251
+ "targetBlank": false,
252
+ "title": "Open Trace Journey",
253
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
254
+ }
255
+ ],
256
+ "options": {
257
+ "colorMode": "value",
258
+ "graphMode": "area",
259
+ "justifyMode": "auto",
260
+ "orientation": "auto",
261
+ "reduceOptions": {
262
+ "calcs": [
263
+ "lastNotNull"
264
+ ],
265
+ "fields": "",
266
+ "values": false
267
+ },
268
+ "showPercentChange": false,
269
+ "textMode": "auto",
270
+ "wideLayout": true
271
+ },
272
+ "pluginVersion": "11.1.0",
273
+ "targets": [
274
+ {
275
+ "datasource": {
276
+ "type": "prometheus",
277
+ "uid": "prometheus"
278
+ },
279
+ "editorMode": "code",
280
+ "expr": "sum(increase(observme_workflow_errors_total[$__range])) or vector(0)",
281
+ "instant": true,
282
+ "legendFormat": "failed workflows",
283
+ "range": false,
284
+ "refId": "A"
285
+ }
286
+ ],
287
+ "title": "Failed workflows",
288
+ "type": "stat"
289
+ },
290
+ {
291
+ "datasource": {
292
+ "type": "prometheus",
293
+ "uid": "prometheus"
294
+ },
295
+ "description": "Selected-range LLM failures divided by LLM requests. Yellow starts at 2%; red mirrors the default 5% alert threshold. No requests and no failures render as zero.",
296
+ "fieldConfig": {
297
+ "defaults": {
298
+ "color": {
299
+ "mode": "thresholds"
300
+ },
301
+ "mappings": [],
302
+ "max": 1,
303
+ "min": 0,
304
+ "thresholds": {
305
+ "mode": "absolute",
306
+ "steps": [
307
+ {
308
+ "color": "green",
309
+ "value": null
310
+ },
311
+ {
312
+ "color": "yellow",
313
+ "value": 0.02
314
+ },
315
+ {
316
+ "color": "red",
317
+ "value": 0.05
318
+ }
319
+ ]
320
+ },
321
+ "unit": "percentunit"
322
+ },
323
+ "overrides": []
324
+ },
325
+ "gridPos": {
326
+ "h": 5,
327
+ "w": 6,
328
+ "x": 12,
329
+ "y": 1
330
+ },
331
+ "id": 13,
332
+ "links": [
333
+ {
334
+ "targetBlank": false,
335
+ "title": "Open Models",
336
+ "url": "/d/observme-models/observme-models?${__url_time_range}"
337
+ }
338
+ ],
339
+ "options": {
340
+ "colorMode": "value",
341
+ "graphMode": "area",
342
+ "justifyMode": "auto",
343
+ "orientation": "auto",
344
+ "reduceOptions": {
345
+ "calcs": [
346
+ "lastNotNull"
347
+ ],
348
+ "fields": "",
349
+ "values": false
350
+ },
351
+ "showPercentChange": false,
352
+ "textMode": "auto",
353
+ "wideLayout": true
354
+ },
355
+ "pluginVersion": "11.1.0",
356
+ "targets": [
357
+ {
358
+ "datasource": {
359
+ "type": "prometheus",
360
+ "uid": "prometheus"
361
+ },
362
+ "editorMode": "code",
363
+ "expr": "clamp_max((sum(increase(observme_llm_errors_total[$__range])) or vector(0)) / clamp_min((sum(increase(observme_llm_requests_total[$__range])) or vector(0)), 1), 1)",
364
+ "instant": true,
365
+ "legendFormat": "LLM failure ratio",
366
+ "range": false,
367
+ "refId": "A"
368
+ }
369
+ ],
370
+ "title": "LLM failure ratio",
371
+ "type": "stat"
372
+ },
373
+ {
374
+ "datasource": {
375
+ "type": "prometheus",
376
+ "uid": "prometheus"
377
+ },
378
+ "description": "Selected-range tool failures divided by tool calls. Red mirrors the default 10% alert threshold. No calls and no failures render as zero.",
379
+ "fieldConfig": {
380
+ "defaults": {
381
+ "color": {
382
+ "mode": "thresholds"
383
+ },
384
+ "mappings": [],
385
+ "max": 1,
386
+ "min": 0,
387
+ "thresholds": {
388
+ "mode": "absolute",
389
+ "steps": [
390
+ {
391
+ "color": "green",
392
+ "value": null
393
+ },
394
+ {
395
+ "color": "yellow",
396
+ "value": 0.05
397
+ },
398
+ {
399
+ "color": "red",
400
+ "value": 0.1
401
+ }
402
+ ]
403
+ },
404
+ "unit": "percentunit"
405
+ },
406
+ "overrides": []
407
+ },
408
+ "gridPos": {
409
+ "h": 5,
410
+ "w": 6,
411
+ "x": 18,
412
+ "y": 1
413
+ },
414
+ "id": 14,
415
+ "links": [
416
+ {
417
+ "targetBlank": false,
418
+ "title": "Open Tools",
419
+ "url": "/d/observme-tools/observme-tools?${__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_tool_failures_total[$__range])) or vector(0)) / clamp_min((sum(increase(observme_tool_calls_total[$__range])) or vector(0)), 1), 1)",
447
+ "instant": true,
448
+ "legendFormat": "tool failure ratio",
449
+ "range": false,
450
+ "refId": "A"
451
+ }
452
+ ],
453
+ "title": "Tool failure ratio",
454
+ "type": "stat"
455
+ },
456
+ {
457
+ "collapsed": false,
458
+ "gridPos": {
459
+ "h": 1,
460
+ "w": 24,
461
+ "x": 0,
462
+ "y": 6
463
+ },
464
+ "id": 101,
465
+ "panels": [],
466
+ "title": "Error trends",
467
+ "type": "row"
468
+ },
469
+ {
470
+ "datasource": {
471
+ "type": "prometheus",
472
+ "uid": "prometheus"
473
+ },
474
+ "description": "Failure counter increments per second, separated by signal family so overlapping lifecycle failures are visible instead of being presented as unique incidents. Missing series render as zero.",
475
+ "fieldConfig": {
476
+ "defaults": {
477
+ "color": {
478
+ "mode": "palette-classic"
479
+ },
480
+ "mappings": [],
481
+ "min": 0,
482
+ "thresholds": {
483
+ "mode": "absolute",
484
+ "steps": [
485
+ {
486
+ "color": "green",
487
+ "value": null
488
+ },
489
+ {
490
+ "color": "red",
491
+ "value": 1e-9
492
+ }
493
+ ]
494
+ },
495
+ "unit": "ops"
496
+ },
497
+ "overrides": []
498
+ },
499
+ "gridPos": {
500
+ "h": 8,
501
+ "w": 12,
502
+ "x": 0,
503
+ "y": 7
504
+ },
505
+ "id": 1,
506
+ "links": [
507
+ {
508
+ "targetBlank": false,
509
+ "title": "Open Agents",
510
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
511
+ },
512
+ {
513
+ "targetBlank": false,
514
+ "title": "Open Export Health",
515
+ "url": "/d/observme-export-health/observme-export-health?${__url_time_range}"
516
+ }
517
+ ],
518
+ "options": {
519
+ "legend": {
520
+ "calcs": [
521
+ "lastNotNull",
522
+ "max"
523
+ ],
524
+ "displayMode": "table",
525
+ "placement": "bottom",
526
+ "showLegend": true
527
+ },
528
+ "tooltip": {
529
+ "mode": "multi",
530
+ "sort": "desc"
531
+ }
532
+ },
533
+ "targets": [
534
+ {
535
+ "datasource": {
536
+ "type": "prometheus",
537
+ "uid": "prometheus"
538
+ },
539
+ "editorMode": "code",
540
+ "expr": "sum(rate(observme_workflow_errors_total[$__rate_interval])) or vector(0)",
541
+ "legendFormat": "workflow",
542
+ "range": true,
543
+ "refId": "A"
544
+ },
545
+ {
546
+ "datasource": {
547
+ "type": "prometheus",
548
+ "uid": "prometheus"
549
+ },
550
+ "editorMode": "code",
551
+ "expr": "sum(rate(observme_agent_run_errors_total[$__rate_interval])) or vector(0)",
552
+ "legendFormat": "agent run",
553
+ "range": true,
554
+ "refId": "B"
555
+ },
556
+ {
557
+ "datasource": {
558
+ "type": "prometheus",
559
+ "uid": "prometheus"
560
+ },
561
+ "editorMode": "code",
562
+ "expr": "sum(rate(observme_llm_errors_total[$__rate_interval])) or vector(0)",
563
+ "legendFormat": "LLM",
564
+ "range": true,
565
+ "refId": "C"
566
+ },
567
+ {
568
+ "datasource": {
569
+ "type": "prometheus",
570
+ "uid": "prometheus"
571
+ },
572
+ "editorMode": "code",
573
+ "expr": "sum(rate(observme_tool_failures_total[$__rate_interval])) or vector(0)",
574
+ "legendFormat": "tool",
575
+ "range": true,
576
+ "refId": "D"
577
+ },
578
+ {
579
+ "datasource": {
580
+ "type": "prometheus",
581
+ "uid": "prometheus"
582
+ },
583
+ "editorMode": "code",
584
+ "expr": "sum(rate(observme_bash_failures_total[$__rate_interval])) or vector(0)",
585
+ "legendFormat": "bash",
586
+ "range": true,
587
+ "refId": "E"
588
+ },
589
+ {
590
+ "datasource": {
591
+ "type": "prometheus",
592
+ "uid": "prometheus"
593
+ },
594
+ "editorMode": "code",
595
+ "expr": "(sum(rate(observme_subagent_spawn_failures_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_orphan_agents_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_trace_context_propagation_failures_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_child_agent_failures_total[$__rate_interval])) or vector(0))",
596
+ "legendFormat": "lineage",
597
+ "range": true,
598
+ "refId": "F"
599
+ },
600
+ {
601
+ "datasource": {
602
+ "type": "prometheus",
603
+ "uid": "prometheus"
604
+ },
605
+ "editorMode": "code",
606
+ "expr": "(sum(rate(observme_telemetry_dropped_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_redaction_failures_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_export_errors_total[$__rate_interval])) or vector(0)) + (sum(rate(observme_handler_errors_total[$__rate_interval])) or vector(0))",
607
+ "legendFormat": "self-observability",
608
+ "range": true,
609
+ "refId": "G"
610
+ }
611
+ ],
612
+ "title": "Error rate",
613
+ "type": "timeseries"
614
+ },
615
+ {
616
+ "datasource": {
617
+ "type": "prometheus",
618
+ "uid": "prometheus"
619
+ },
620
+ "description": "Safe-handler failures per second grouped by the bounded operation label actually emitted by observme_handler_errors_total. Missing series render as zero.",
621
+ "fieldConfig": {
622
+ "defaults": {
623
+ "color": {
624
+ "mode": "palette-classic"
625
+ },
626
+ "mappings": [],
627
+ "min": 0,
628
+ "thresholds": {
629
+ "mode": "absolute",
630
+ "steps": [
631
+ {
632
+ "color": "green",
633
+ "value": null
634
+ },
635
+ {
636
+ "color": "red",
637
+ "value": 1e-9
638
+ }
639
+ ]
640
+ },
641
+ "unit": "ops"
642
+ },
643
+ "overrides": []
644
+ },
645
+ "gridPos": {
646
+ "h": 8,
647
+ "w": 12,
648
+ "x": 12,
649
+ "y": 7
650
+ },
651
+ "id": 2,
652
+ "links": [
653
+ {
654
+ "targetBlank": false,
655
+ "title": "Open Export Health",
656
+ "url": "/d/observme-export-health/observme-export-health?${__url_time_range}"
657
+ }
658
+ ],
659
+ "options": {
660
+ "legend": {
661
+ "calcs": [
662
+ "lastNotNull",
663
+ "max"
664
+ ],
665
+ "displayMode": "table",
666
+ "placement": "bottom",
667
+ "showLegend": true
668
+ },
669
+ "tooltip": {
670
+ "mode": "multi",
671
+ "sort": "desc"
672
+ }
673
+ },
674
+ "targets": [
675
+ {
676
+ "datasource": {
677
+ "type": "prometheus",
678
+ "uid": "prometheus"
679
+ },
680
+ "editorMode": "code",
681
+ "expr": "(sum by (operation) (rate(observme_handler_errors_total[$__rate_interval])) or on() vector(0))",
682
+ "legendFormat": "{{operation}}",
683
+ "range": true,
684
+ "refId": "A"
685
+ }
686
+ ],
687
+ "title": "Handler errors by operation",
688
+ "type": "timeseries"
689
+ },
690
+ {
691
+ "datasource": {
692
+ "type": "prometheus",
693
+ "uid": "prometheus"
694
+ },
695
+ "description": "LLM failures divided by requests for each provider/model. Active request series with no failures render as zero; 2%/5% thresholds mirror dashboard and alert guidance.",
696
+ "fieldConfig": {
697
+ "defaults": {
698
+ "color": {
699
+ "mode": "palette-classic"
700
+ },
701
+ "mappings": [],
702
+ "max": 1,
703
+ "min": 0,
704
+ "thresholds": {
705
+ "mode": "absolute",
706
+ "steps": [
707
+ {
708
+ "color": "green",
709
+ "value": null
710
+ },
711
+ {
712
+ "color": "yellow",
713
+ "value": 0.02
714
+ },
715
+ {
716
+ "color": "red",
717
+ "value": 0.05
718
+ }
719
+ ]
720
+ },
721
+ "unit": "percentunit"
722
+ },
723
+ "overrides": []
724
+ },
725
+ "gridPos": {
726
+ "h": 8,
727
+ "w": 12,
728
+ "x": 0,
729
+ "y": 15
730
+ },
731
+ "id": 3,
732
+ "links": [
733
+ {
734
+ "targetBlank": false,
735
+ "title": "Open Models",
736
+ "url": "/d/observme-models/observme-models?${__url_time_range}"
737
+ },
738
+ {
739
+ "targetBlank": false,
740
+ "title": "Open matching LLM logs",
741
+ "url": "/d/observme-logs-llm/observme-logs-llm?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
742
+ }
743
+ ],
744
+ "options": {
745
+ "legend": {
746
+ "calcs": [
747
+ "lastNotNull",
748
+ "max"
749
+ ],
750
+ "displayMode": "table",
751
+ "placement": "bottom",
752
+ "showLegend": true
753
+ },
754
+ "tooltip": {
755
+ "mode": "multi",
756
+ "sort": "desc"
757
+ }
758
+ },
759
+ "targets": [
760
+ {
761
+ "datasource": {
762
+ "type": "prometheus",
763
+ "uid": "prometheus"
764
+ },
765
+ "editorMode": "code",
766
+ "expr": "(clamp_max(((sum by (provider, model) (rate(observme_llm_errors_total[$__rate_interval])) or (0 * sum by (provider, model) (rate(observme_llm_requests_total[$__rate_interval])))) / clamp_min(sum by (provider, model) (rate(observme_llm_requests_total[$__rate_interval])), 1e-9)), 1) or on() vector(0))",
767
+ "legendFormat": "{{provider}} / {{model}}",
768
+ "range": true,
769
+ "refId": "A"
770
+ }
771
+ ],
772
+ "title": "LLM failure rate",
773
+ "type": "timeseries"
774
+ },
775
+ {
776
+ "datasource": {
777
+ "type": "prometheus",
778
+ "uid": "prometheus"
779
+ },
780
+ "description": "Top 10 tool failure ratios by tool_name. Active call series with no failures render as zero; 5%/10% thresholds mirror dashboard and alert guidance.",
781
+ "fieldConfig": {
782
+ "defaults": {
783
+ "color": {
784
+ "mode": "palette-classic"
785
+ },
786
+ "mappings": [],
787
+ "max": 1,
788
+ "min": 0,
789
+ "thresholds": {
790
+ "mode": "absolute",
791
+ "steps": [
792
+ {
793
+ "color": "green",
794
+ "value": null
795
+ },
796
+ {
797
+ "color": "yellow",
798
+ "value": 0.05
799
+ },
800
+ {
801
+ "color": "red",
802
+ "value": 0.1
803
+ }
804
+ ]
805
+ },
806
+ "unit": "percentunit"
807
+ },
808
+ "overrides": []
809
+ },
810
+ "gridPos": {
811
+ "h": 8,
812
+ "w": 12,
813
+ "x": 12,
814
+ "y": 15
815
+ },
816
+ "id": 4,
817
+ "links": [
818
+ {
819
+ "targetBlank": false,
820
+ "title": "Open Tools",
821
+ "url": "/d/observme-tools/observme-tools?${__url_time_range}"
822
+ },
823
+ {
824
+ "targetBlank": false,
825
+ "title": "Open Trace Journey",
826
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
827
+ }
828
+ ],
829
+ "options": {
830
+ "legend": {
831
+ "calcs": [
832
+ "lastNotNull",
833
+ "max"
834
+ ],
835
+ "displayMode": "table",
836
+ "placement": "bottom",
837
+ "showLegend": true
838
+ },
839
+ "tooltip": {
840
+ "mode": "multi",
841
+ "sort": "desc"
842
+ }
843
+ },
844
+ "targets": [
845
+ {
846
+ "datasource": {
847
+ "type": "prometheus",
848
+ "uid": "prometheus"
849
+ },
850
+ "editorMode": "code",
851
+ "expr": "(topk(10, clamp_max(((sum by (tool_name) (rate(observme_tool_failures_total[$__rate_interval])) or (0 * sum by (tool_name) (rate(observme_tool_calls_total[$__rate_interval])))) / clamp_min(sum by (tool_name) (rate(observme_tool_calls_total[$__rate_interval])), 1e-9)), 1)) or on() vector(0))",
852
+ "legendFormat": "{{tool_name}}",
853
+ "range": true,
854
+ "refId": "A"
855
+ }
856
+ ],
857
+ "title": "Top tool failure rates",
858
+ "type": "timeseries"
859
+ },
860
+ {
861
+ "collapsed": false,
862
+ "gridPos": {
863
+ "h": 1,
864
+ "w": 24,
865
+ "x": 0,
866
+ "y": 23
867
+ },
868
+ "id": 102,
869
+ "panels": [],
870
+ "title": "Failure stream",
871
+ "type": "row"
872
+ },
873
+ {
874
+ "datasource": {
875
+ "type": "loki",
876
+ "uid": "loki"
877
+ },
878
+ "description": "Newest matching failure, dropped-telemetry, and orphan-agent logs for the selected context. Empty means no matching failure logs in the selected time range. Open a row for structured metadata, then use Trace Journey for correlated spans.",
879
+ "fieldConfig": {
880
+ "defaults": {},
881
+ "overrides": []
882
+ },
883
+ "gridPos": {
884
+ "h": 9,
885
+ "w": 24,
886
+ "x": 0,
887
+ "y": 24
888
+ },
889
+ "id": 5,
890
+ "options": {
891
+ "dedupStrategy": "none",
892
+ "enableLogDetails": true,
893
+ "prettifyLogMessage": false,
894
+ "showCommonLabels": false,
895
+ "showLabels": true,
896
+ "showTime": true,
897
+ "sortOrder": "Descending",
898
+ "wrapLogMessage": true
899
+ },
900
+ "pluginVersion": "11.1.0",
901
+ "targets": [
902
+ {
903
+ "datasource": {
904
+ "type": "loki",
905
+ "uid": "loki"
906
+ },
907
+ "editorMode": "code",
908
+ "expr": "{service_name=\"observme-pi-extension\", event_name=~\".*[.]failed|.*[.]dropped|agent[.]orphaned\", 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}\"}",
909
+ "maxLines": 1000,
910
+ "queryType": "range",
911
+ "range": true,
912
+ "refId": "A"
913
+ }
914
+ ],
915
+ "title": "Recent failure stream",
916
+ "type": "logs",
917
+ "links": [
918
+ {
919
+ "targetBlank": false,
920
+ "title": "Open matching Trace Journey",
921
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
922
+ }
923
+ ]
924
+ },
925
+ {
926
+ "collapsed": false,
927
+ "gridPos": {
928
+ "h": 1,
929
+ "w": 24,
930
+ "x": 0,
931
+ "y": 33
932
+ },
933
+ "id": 103,
934
+ "panels": [],
935
+ "title": "Parsed failure details",
936
+ "type": "row"
937
+ },
938
+ {
939
+ "datasource": {
940
+ "type": "loki",
941
+ "uid": "loki"
942
+ },
943
+ "description": "Parsed llm.request.failed rows for the selected context. Provider/model, stop reason, lineage, and trace labels are exposed when present; trace_id opens Tempo. Empty means no matching failure logs in the selected time range.",
944
+ "fieldConfig": {
945
+ "defaults": {
946
+ "color": {
947
+ "mode": "palette-classic"
948
+ },
949
+ "mappings": [],
950
+ "thresholds": {
951
+ "mode": "absolute",
952
+ "steps": [
953
+ {
954
+ "color": "green",
955
+ "value": null
956
+ }
957
+ ]
958
+ },
959
+ "unit": "short"
960
+ },
961
+ "overrides": [
962
+ {
963
+ "matcher": {
964
+ "id": "byName",
965
+ "options": "trace_id"
966
+ },
967
+ "properties": [
968
+ {
969
+ "id": "links",
970
+ "value": [
971
+ {
972
+ "targetBlank": false,
973
+ "title": "Open Tempo trace",
974
+ "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"
975
+ }
976
+ ]
977
+ }
978
+ ]
979
+ }
980
+ ]
981
+ },
982
+ "gridPos": {
983
+ "h": 9,
984
+ "w": 12,
985
+ "x": 0,
986
+ "y": 34
987
+ },
988
+ "id": 6,
989
+ "links": [
990
+ {
991
+ "targetBlank": false,
992
+ "title": "Open matching Trace Journey",
993
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
994
+ }
995
+ ],
996
+ "options": {
997
+ "cellHeight": "sm",
998
+ "footer": {
999
+ "countRows": false,
1000
+ "fields": "",
1001
+ "reducer": [
1002
+ "sum"
1003
+ ],
1004
+ "show": false
1005
+ },
1006
+ "showHeader": true,
1007
+ "sortBy": [
1008
+ {
1009
+ "desc": true,
1010
+ "displayName": "Time"
1011
+ }
1012
+ ]
1013
+ },
1014
+ "pluginVersion": "11.1.0",
1015
+ "targets": [
1016
+ {
1017
+ "datasource": {
1018
+ "type": "loki",
1019
+ "uid": "loki"
1020
+ },
1021
+ "editorMode": "code",
1022
+ "expr": "{service_name=\"observme-pi-extension\", event_name=\"llm.request.failed\", 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}\"}",
1023
+ "maxLines": 500,
1024
+ "legendFormat": "{{event_name}}",
1025
+ "queryType": "range",
1026
+ "range": true,
1027
+ "refId": "A"
1028
+ }
1029
+ ],
1030
+ "title": "Parsed LLM failure logs",
1031
+ "type": "table",
1032
+ "transformations": [
1033
+ {
1034
+ "id": "labelsToFields",
1035
+ "options": {
1036
+ "mode": "columns"
1037
+ }
1038
+ },
1039
+ {
1040
+ "id": "organize",
1041
+ "options": {
1042
+ "renameByName": {
1043
+ "event_name": "event",
1044
+ "event_category": "category",
1045
+ "pi_session_id": "session",
1046
+ "pi_agent_id": "agent",
1047
+ "pi_agent_parent_id": "parent_agent",
1048
+ "pi_agent_run_id": "agent_run",
1049
+ "pi_llm_stop_reason": "stop_reason",
1050
+ "pi_bash_exit_code": "bash_exit_code",
1051
+ "trace_id": "trace_id",
1052
+ "span_id": "span_id"
1053
+ }
1054
+ }
1055
+ }
1056
+ ]
1057
+ },
1058
+ {
1059
+ "datasource": {
1060
+ "type": "loki",
1061
+ "uid": "loki"
1062
+ },
1063
+ "description": "Parsed tool.call.failed rows for the selected context. Session, workflow, agent, run, and trace labels are exposed when present; trace_id opens Tempo. Empty means no matching failure logs in the selected time range.",
1064
+ "fieldConfig": {
1065
+ "defaults": {
1066
+ "color": {
1067
+ "mode": "palette-classic"
1068
+ },
1069
+ "mappings": [],
1070
+ "thresholds": {
1071
+ "mode": "absolute",
1072
+ "steps": [
1073
+ {
1074
+ "color": "green",
1075
+ "value": null
1076
+ }
1077
+ ]
1078
+ },
1079
+ "unit": "short"
1080
+ },
1081
+ "overrides": [
1082
+ {
1083
+ "matcher": {
1084
+ "id": "byName",
1085
+ "options": "trace_id"
1086
+ },
1087
+ "properties": [
1088
+ {
1089
+ "id": "links",
1090
+ "value": [
1091
+ {
1092
+ "targetBlank": false,
1093
+ "title": "Open Tempo trace",
1094
+ "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"
1095
+ }
1096
+ ]
1097
+ }
1098
+ ]
1099
+ }
1100
+ ]
1101
+ },
1102
+ "gridPos": {
1103
+ "h": 9,
1104
+ "w": 12,
1105
+ "x": 12,
1106
+ "y": 34
1107
+ },
1108
+ "id": 7,
1109
+ "links": [
1110
+ {
1111
+ "targetBlank": false,
1112
+ "title": "Open matching Trace Journey",
1113
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
1114
+ }
1115
+ ],
1116
+ "options": {
1117
+ "cellHeight": "sm",
1118
+ "footer": {
1119
+ "countRows": false,
1120
+ "fields": "",
1121
+ "reducer": [
1122
+ "sum"
1123
+ ],
1124
+ "show": false
1125
+ },
1126
+ "showHeader": true,
1127
+ "sortBy": [
1128
+ {
1129
+ "desc": true,
1130
+ "displayName": "Time"
1131
+ }
1132
+ ]
1133
+ },
1134
+ "pluginVersion": "11.1.0",
1135
+ "targets": [
1136
+ {
1137
+ "datasource": {
1138
+ "type": "loki",
1139
+ "uid": "loki"
1140
+ },
1141
+ "editorMode": "code",
1142
+ "expr": "{service_name=\"observme-pi-extension\", event_name=\"tool.call.failed\", 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}\"}",
1143
+ "maxLines": 500,
1144
+ "legendFormat": "{{event_name}}",
1145
+ "queryType": "range",
1146
+ "range": true,
1147
+ "refId": "A"
1148
+ }
1149
+ ],
1150
+ "title": "Parsed tool failure logs",
1151
+ "type": "table",
1152
+ "transformations": [
1153
+ {
1154
+ "id": "labelsToFields",
1155
+ "options": {
1156
+ "mode": "columns"
1157
+ }
1158
+ },
1159
+ {
1160
+ "id": "organize",
1161
+ "options": {
1162
+ "renameByName": {
1163
+ "event_name": "event",
1164
+ "event_category": "category",
1165
+ "pi_session_id": "session",
1166
+ "pi_agent_id": "agent",
1167
+ "pi_agent_parent_id": "parent_agent",
1168
+ "pi_agent_run_id": "agent_run",
1169
+ "pi_llm_stop_reason": "stop_reason",
1170
+ "pi_bash_exit_code": "bash_exit_code",
1171
+ "trace_id": "trace_id",
1172
+ "span_id": "span_id"
1173
+ }
1174
+ }
1175
+ }
1176
+ ]
1177
+ },
1178
+ {
1179
+ "datasource": {
1180
+ "type": "loki",
1181
+ "uid": "loki"
1182
+ },
1183
+ "description": "Parsed export.failed rows for backend/export diagnosis. Context and trace labels are exposed when present; trace_id opens Tempo. Empty means no matching failure logs in the selected time range.",
1184
+ "fieldConfig": {
1185
+ "defaults": {
1186
+ "color": {
1187
+ "mode": "palette-classic"
1188
+ },
1189
+ "mappings": [],
1190
+ "thresholds": {
1191
+ "mode": "absolute",
1192
+ "steps": [
1193
+ {
1194
+ "color": "green",
1195
+ "value": null
1196
+ }
1197
+ ]
1198
+ },
1199
+ "unit": "short"
1200
+ },
1201
+ "overrides": [
1202
+ {
1203
+ "matcher": {
1204
+ "id": "byName",
1205
+ "options": "trace_id"
1206
+ },
1207
+ "properties": [
1208
+ {
1209
+ "id": "links",
1210
+ "value": [
1211
+ {
1212
+ "targetBlank": false,
1213
+ "title": "Open Tempo trace",
1214
+ "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"
1215
+ }
1216
+ ]
1217
+ }
1218
+ ]
1219
+ }
1220
+ ]
1221
+ },
1222
+ "gridPos": {
1223
+ "h": 9,
1224
+ "w": 8,
1225
+ "x": 0,
1226
+ "y": 43
1227
+ },
1228
+ "id": 8,
1229
+ "links": [
1230
+ {
1231
+ "targetBlank": false,
1232
+ "title": "Open matching Trace Journey",
1233
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
1234
+ }
1235
+ ],
1236
+ "options": {
1237
+ "cellHeight": "sm",
1238
+ "footer": {
1239
+ "countRows": false,
1240
+ "fields": "",
1241
+ "reducer": [
1242
+ "sum"
1243
+ ],
1244
+ "show": false
1245
+ },
1246
+ "showHeader": true,
1247
+ "sortBy": [
1248
+ {
1249
+ "desc": true,
1250
+ "displayName": "Time"
1251
+ }
1252
+ ]
1253
+ },
1254
+ "pluginVersion": "11.1.0",
1255
+ "targets": [
1256
+ {
1257
+ "datasource": {
1258
+ "type": "loki",
1259
+ "uid": "loki"
1260
+ },
1261
+ "editorMode": "code",
1262
+ "expr": "{service_name=\"observme-pi-extension\", event_name=\"export.failed\", 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}\"}",
1263
+ "maxLines": 500,
1264
+ "legendFormat": "{{event_name}}",
1265
+ "queryType": "range",
1266
+ "range": true,
1267
+ "refId": "A"
1268
+ }
1269
+ ],
1270
+ "title": "Parsed export failure logs",
1271
+ "type": "table",
1272
+ "transformations": [
1273
+ {
1274
+ "id": "labelsToFields",
1275
+ "options": {
1276
+ "mode": "columns"
1277
+ }
1278
+ },
1279
+ {
1280
+ "id": "organize",
1281
+ "options": {
1282
+ "renameByName": {
1283
+ "event_name": "event",
1284
+ "event_category": "category",
1285
+ "pi_session_id": "session",
1286
+ "pi_agent_id": "agent",
1287
+ "pi_agent_parent_id": "parent_agent",
1288
+ "pi_agent_run_id": "agent_run",
1289
+ "pi_llm_stop_reason": "stop_reason",
1290
+ "pi_bash_exit_code": "bash_exit_code",
1291
+ "trace_id": "trace_id",
1292
+ "span_id": "span_id"
1293
+ }
1294
+ }
1295
+ }
1296
+ ]
1297
+ },
1298
+ {
1299
+ "datasource": {
1300
+ "type": "loki",
1301
+ "uid": "loki"
1302
+ },
1303
+ "description": "Parsed handler.failed rows for runtime self-observability. Context and trace labels are exposed when present; trace_id opens Tempo. Empty means no matching failure logs in the selected time range.",
1304
+ "fieldConfig": {
1305
+ "defaults": {
1306
+ "color": {
1307
+ "mode": "palette-classic"
1308
+ },
1309
+ "mappings": [],
1310
+ "thresholds": {
1311
+ "mode": "absolute",
1312
+ "steps": [
1313
+ {
1314
+ "color": "green",
1315
+ "value": null
1316
+ }
1317
+ ]
1318
+ },
1319
+ "unit": "short"
1320
+ },
1321
+ "overrides": [
1322
+ {
1323
+ "matcher": {
1324
+ "id": "byName",
1325
+ "options": "trace_id"
1326
+ },
1327
+ "properties": [
1328
+ {
1329
+ "id": "links",
1330
+ "value": [
1331
+ {
1332
+ "targetBlank": false,
1333
+ "title": "Open Tempo trace",
1334
+ "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"
1335
+ }
1336
+ ]
1337
+ }
1338
+ ]
1339
+ }
1340
+ ]
1341
+ },
1342
+ "gridPos": {
1343
+ "h": 9,
1344
+ "w": 8,
1345
+ "x": 8,
1346
+ "y": 43
1347
+ },
1348
+ "id": 9,
1349
+ "links": [
1350
+ {
1351
+ "targetBlank": false,
1352
+ "title": "Open matching Trace Journey",
1353
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
1354
+ }
1355
+ ],
1356
+ "options": {
1357
+ "cellHeight": "sm",
1358
+ "footer": {
1359
+ "countRows": false,
1360
+ "fields": "",
1361
+ "reducer": [
1362
+ "sum"
1363
+ ],
1364
+ "show": false
1365
+ },
1366
+ "showHeader": true,
1367
+ "sortBy": [
1368
+ {
1369
+ "desc": true,
1370
+ "displayName": "Time"
1371
+ }
1372
+ ]
1373
+ },
1374
+ "pluginVersion": "11.1.0",
1375
+ "targets": [
1376
+ {
1377
+ "datasource": {
1378
+ "type": "loki",
1379
+ "uid": "loki"
1380
+ },
1381
+ "editorMode": "code",
1382
+ "expr": "{service_name=\"observme-pi-extension\", event_name=\"handler.failed\", 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}\"}",
1383
+ "maxLines": 500,
1384
+ "legendFormat": "{{event_name}}",
1385
+ "queryType": "range",
1386
+ "range": true,
1387
+ "refId": "A"
1388
+ }
1389
+ ],
1390
+ "title": "Parsed handler failure logs",
1391
+ "type": "table",
1392
+ "transformations": [
1393
+ {
1394
+ "id": "labelsToFields",
1395
+ "options": {
1396
+ "mode": "columns"
1397
+ }
1398
+ },
1399
+ {
1400
+ "id": "organize",
1401
+ "options": {
1402
+ "renameByName": {
1403
+ "event_name": "event",
1404
+ "event_category": "category",
1405
+ "pi_session_id": "session",
1406
+ "pi_agent_id": "agent",
1407
+ "pi_agent_parent_id": "parent_agent",
1408
+ "pi_agent_run_id": "agent_run",
1409
+ "pi_llm_stop_reason": "stop_reason",
1410
+ "pi_bash_exit_code": "bash_exit_code",
1411
+ "trace_id": "trace_id",
1412
+ "span_id": "span_id"
1413
+ }
1414
+ }
1415
+ }
1416
+ ]
1417
+ },
1418
+ {
1419
+ "datasource": {
1420
+ "type": "loki",
1421
+ "uid": "loki"
1422
+ },
1423
+ "description": "Parsed trace_context.propagation_failed rows for lineage diagnosis. Context and trace labels are exposed when present; trace_id opens Tempo. Empty means no matching failure logs in the selected time range.",
1424
+ "fieldConfig": {
1425
+ "defaults": {
1426
+ "color": {
1427
+ "mode": "palette-classic"
1428
+ },
1429
+ "mappings": [],
1430
+ "thresholds": {
1431
+ "mode": "absolute",
1432
+ "steps": [
1433
+ {
1434
+ "color": "green",
1435
+ "value": null
1436
+ }
1437
+ ]
1438
+ },
1439
+ "unit": "short"
1440
+ },
1441
+ "overrides": [
1442
+ {
1443
+ "matcher": {
1444
+ "id": "byName",
1445
+ "options": "trace_id"
1446
+ },
1447
+ "properties": [
1448
+ {
1449
+ "id": "links",
1450
+ "value": [
1451
+ {
1452
+ "targetBlank": false,
1453
+ "title": "Open Tempo trace",
1454
+ "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"
1455
+ }
1456
+ ]
1457
+ }
1458
+ ]
1459
+ }
1460
+ ]
1461
+ },
1462
+ "gridPos": {
1463
+ "h": 9,
1464
+ "w": 8,
1465
+ "x": 16,
1466
+ "y": 43
1467
+ },
1468
+ "id": 10,
1469
+ "links": [
1470
+ {
1471
+ "targetBlank": false,
1472
+ "title": "Open matching Trace Journey",
1473
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
1474
+ }
1475
+ ],
1476
+ "options": {
1477
+ "cellHeight": "sm",
1478
+ "footer": {
1479
+ "countRows": false,
1480
+ "fields": "",
1481
+ "reducer": [
1482
+ "sum"
1483
+ ],
1484
+ "show": false
1485
+ },
1486
+ "showHeader": true,
1487
+ "sortBy": [
1488
+ {
1489
+ "desc": true,
1490
+ "displayName": "Time"
1491
+ }
1492
+ ]
1493
+ },
1494
+ "pluginVersion": "11.1.0",
1495
+ "targets": [
1496
+ {
1497
+ "datasource": {
1498
+ "type": "loki",
1499
+ "uid": "loki"
1500
+ },
1501
+ "editorMode": "code",
1502
+ "expr": "{service_name=\"observme-pi-extension\", event_name=\"trace_context.propagation_failed\", 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}\"}",
1503
+ "maxLines": 500,
1504
+ "legendFormat": "{{event_name}}",
1505
+ "queryType": "range",
1506
+ "range": true,
1507
+ "refId": "A"
1508
+ }
1509
+ ],
1510
+ "title": "Parsed propagation failure logs",
1511
+ "type": "table",
1512
+ "transformations": [
1513
+ {
1514
+ "id": "labelsToFields",
1515
+ "options": {
1516
+ "mode": "columns"
1517
+ }
1518
+ },
1519
+ {
1520
+ "id": "organize",
1521
+ "options": {
1522
+ "renameByName": {
1523
+ "event_name": "event",
1524
+ "event_category": "category",
1525
+ "pi_session_id": "session",
1526
+ "pi_agent_id": "agent",
1527
+ "pi_agent_parent_id": "parent_agent",
1528
+ "pi_agent_run_id": "agent_run",
1529
+ "pi_llm_stop_reason": "stop_reason",
1530
+ "pi_bash_exit_code": "bash_exit_code",
1531
+ "trace_id": "trace_id",
1532
+ "span_id": "span_id"
1533
+ }
1534
+ }
1535
+ }
1536
+ ]
1537
+ }
1538
+ ],
1539
+ "refresh": "30s",
1540
+ "schemaVersion": 39,
1541
+ "style": "dark",
1542
+ "tags": [
1543
+ "observme",
1544
+ "errors"
1545
+ ],
1546
+ "templating": {
1547
+ "list": [
1548
+ {
1549
+ "allValue": ".*",
1550
+ "current": {
1551
+ "selected": true,
1552
+ "text": "All",
1553
+ "value": "$__all"
1554
+ },
1555
+ "datasource": {
1556
+ "type": "loki",
1557
+ "uid": "loki"
1558
+ },
1559
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_name=~\".*[.]failed|.*[.]dropped|agent[.]orphaned\"}, pi_session_id)",
1560
+ "hide": 0,
1561
+ "includeAll": true,
1562
+ "label": "Session ID",
1563
+ "multi": true,
1564
+ "name": "session_id",
1565
+ "options": [],
1566
+ "query": "label_values({service_name=\"observme-pi-extension\", event_name=~\".*[.]failed|.*[.]dropped|agent[.]orphaned\"}, pi_session_id)",
1567
+ "refresh": 2,
1568
+ "regex": "",
1569
+ "skipUrlSync": false,
1570
+ "sort": 1,
1571
+ "type": "query"
1572
+ },
1573
+ {
1574
+ "allValue": ".*",
1575
+ "current": {
1576
+ "selected": true,
1577
+ "text": "All",
1578
+ "value": "$__all"
1579
+ },
1580
+ "datasource": {
1581
+ "type": "loki",
1582
+ "uid": "loki"
1583
+ },
1584
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_name=~\".*[.]failed|.*[.]dropped|agent[.]orphaned\", pi_session_id=~\"${session_id:regex}\"}, pi_workflow_id)",
1585
+ "hide": 0,
1586
+ "includeAll": true,
1587
+ "label": "Workflow ID",
1588
+ "multi": true,
1589
+ "name": "workflow_id",
1590
+ "options": [],
1591
+ "query": "label_values({service_name=\"observme-pi-extension\", event_name=~\".*[.]failed|.*[.]dropped|agent[.]orphaned\", pi_session_id=~\"${session_id:regex}\"}, pi_workflow_id)",
1592
+ "refresh": 2,
1593
+ "regex": "",
1594
+ "skipUrlSync": false,
1595
+ "sort": 1,
1596
+ "type": "query"
1597
+ },
1598
+ {
1599
+ "allValue": ".*",
1600
+ "current": {
1601
+ "selected": true,
1602
+ "text": "All",
1603
+ "value": "$__all"
1604
+ },
1605
+ "datasource": {
1606
+ "type": "loki",
1607
+ "uid": "loki"
1608
+ },
1609
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_name=~\".*[.]failed|.*[.]dropped|agent[.]orphaned\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\"}, pi_agent_id)",
1610
+ "hide": 0,
1611
+ "includeAll": true,
1612
+ "label": "Agent ID",
1613
+ "multi": true,
1614
+ "name": "agent_id",
1615
+ "options": [],
1616
+ "query": "label_values({service_name=\"observme-pi-extension\", event_name=~\".*[.]failed|.*[.]dropped|agent[.]orphaned\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\"}, pi_agent_id)",
1617
+ "refresh": 2,
1618
+ "regex": "",
1619
+ "skipUrlSync": false,
1620
+ "sort": 1,
1621
+ "type": "query"
1622
+ },
1623
+ {
1624
+ "allValue": ".*",
1625
+ "current": {
1626
+ "selected": true,
1627
+ "text": "All",
1628
+ "value": "$__all"
1629
+ },
1630
+ "datasource": {
1631
+ "type": "loki",
1632
+ "uid": "loki"
1633
+ },
1634
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_name=~\".*[.]failed|.*[.]dropped|agent[.]orphaned\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\"}, pi_agent_run_id)",
1635
+ "hide": 0,
1636
+ "includeAll": true,
1637
+ "label": "Agent run ID",
1638
+ "multi": true,
1639
+ "name": "agent_run_id",
1640
+ "options": [],
1641
+ "query": "label_values({service_name=\"observme-pi-extension\", event_name=~\".*[.]failed|.*[.]dropped|agent[.]orphaned\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\"}, pi_agent_run_id)",
1642
+ "refresh": 2,
1643
+ "regex": "",
1644
+ "skipUrlSync": false,
1645
+ "sort": 1,
1646
+ "type": "query"
1647
+ }
1648
+ ]
1649
+ },
1650
+ "time": {
1651
+ "from": "now-6h",
1652
+ "to": "now"
1653
+ },
1654
+ "timezone": "browser",
1655
+ "title": "ObservMe Errors",
1656
+ "uid": "observme-errors",
1657
+ "version": 2,
1658
+ "weekStart": ""
1659
+ }