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