@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,737 @@
1
+ {
2
+ "__requires": [
3
+ {
4
+ "id": "grafana",
5
+ "name": "Grafana",
6
+ "type": "grafana",
7
+ "version": "10.0.0"
8
+ },
9
+ {
10
+ "id": "prometheus",
11
+ "name": "Prometheus",
12
+ "type": "datasource",
13
+ "version": "1.0.0"
14
+ },
15
+ {
16
+ "id": "row",
17
+ "name": "Row",
18
+ "type": "panel",
19
+ "version": ""
20
+ },
21
+ {
22
+ "id": "stat",
23
+ "name": "Stat",
24
+ "type": "panel",
25
+ "version": ""
26
+ },
27
+ {
28
+ "id": "bargauge",
29
+ "name": "Bar gauge",
30
+ "type": "panel",
31
+ "version": ""
32
+ },
33
+ {
34
+ "id": "text",
35
+ "name": "Text",
36
+ "type": "panel",
37
+ "version": ""
38
+ }
39
+ ],
40
+ "annotations": {
41
+ "list": []
42
+ },
43
+ "editable": true,
44
+ "fiscalYearStartMonth": 0,
45
+ "graphTooltip": 0,
46
+ "id": null,
47
+ "links": [
48
+ {
49
+ "icon": "external link",
50
+ "includeVars": true,
51
+ "keepTime": true,
52
+ "targetBlank": false,
53
+ "title": "Overview",
54
+ "tooltip": "Open the ObservMe Overview with the current time range.",
55
+ "type": "link",
56
+ "url": "/d/observme-overview/observme-overview?${__url_time_range}"
57
+ },
58
+ {
59
+ "icon": "external link",
60
+ "includeVars": true,
61
+ "keepTime": true,
62
+ "targetBlank": false,
63
+ "title": "Export Health",
64
+ "tooltip": "Open Export Health for the underlying liveness, drop, export-error, and redaction signals.",
65
+ "type": "link",
66
+ "url": "/d/observme-export-health/observme-export-health?${__url_time_range}"
67
+ },
68
+ {
69
+ "icon": "external link",
70
+ "includeVars": true,
71
+ "keepTime": true,
72
+ "targetBlank": false,
73
+ "title": "Agents",
74
+ "tooltip": "Open Agents for lineage and subagent reliability drill-down.",
75
+ "type": "link",
76
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
77
+ },
78
+ {
79
+ "icon": "external link",
80
+ "includeVars": true,
81
+ "keepTime": true,
82
+ "targetBlank": false,
83
+ "title": "Trace Journey",
84
+ "tooltip": "Open Trace Journey for metric-to-log-to-trace drill-down.",
85
+ "type": "link",
86
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
87
+ },
88
+ {
89
+ "icon": "external link",
90
+ "includeVars": true,
91
+ "keepTime": true,
92
+ "targetBlank": false,
93
+ "title": "Errors",
94
+ "tooltip": "Open Errors for parsed failure log tables and trace links.",
95
+ "type": "link",
96
+ "url": "/d/observme-errors/observme-errors?${__url_time_range}"
97
+ }
98
+ ],
99
+ "liveNow": false,
100
+ "panels": [
101
+ {
102
+ "collapsed": false,
103
+ "gridPos": {
104
+ "h": 1,
105
+ "w": 24,
106
+ "x": 0,
107
+ "y": 0
108
+ },
109
+ "id": 100,
110
+ "panels": [],
111
+ "title": "SLOs",
112
+ "type": "row"
113
+ },
114
+ {
115
+ "datasource": {
116
+ "type": "prometheus",
117
+ "uid": "prometheus"
118
+ },
119
+ "description": "30-day Observability Export SLO from observme-slos.yaml (objective: >=99%). The scorecard is shown only when observed-event workload is positive; No data means no workload or missing telemetry and must be checked in Export Health rather than treated as healthy.",
120
+ "fieldConfig": {
121
+ "defaults": {
122
+ "color": {
123
+ "mode": "thresholds"
124
+ },
125
+ "mappings": [],
126
+ "noValue": "No workload / verify telemetry",
127
+ "thresholds": {
128
+ "mode": "absolute",
129
+ "steps": [
130
+ {
131
+ "color": "red",
132
+ "value": null
133
+ },
134
+ {
135
+ "color": "green",
136
+ "value": 0.99
137
+ }
138
+ ]
139
+ },
140
+ "unit": "percentunit"
141
+ },
142
+ "overrides": []
143
+ },
144
+ "gridPos": {
145
+ "h": 5,
146
+ "w": 5,
147
+ "x": 0,
148
+ "y": 1
149
+ },
150
+ "id": 1,
151
+ "links": [
152
+ {
153
+ "targetBlank": false,
154
+ "title": "Open Export Health",
155
+ "url": "/d/observme-export-health/observme-export-health?${__url_time_range}"
156
+ }
157
+ ],
158
+ "options": {
159
+ "colorMode": "value",
160
+ "graphMode": "area",
161
+ "justifyMode": "auto",
162
+ "orientation": "auto",
163
+ "reduceOptions": {
164
+ "calcs": [
165
+ "lastNotNull"
166
+ ],
167
+ "fields": "",
168
+ "values": false
169
+ },
170
+ "showPercentChange": false,
171
+ "textMode": "auto",
172
+ "wideLayout": true
173
+ },
174
+ "targets": [
175
+ {
176
+ "datasource": {
177
+ "type": "prometheus",
178
+ "uid": "prometheus"
179
+ },
180
+ "editorMode": "code",
181
+ "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])), 1e-9)), 0), 1)) and on() (sum(rate(observme_events_observed_total[30d])) > 0)",
182
+ "instant": true,
183
+ "range": false,
184
+ "refId": "A"
185
+ }
186
+ ],
187
+ "title": "Observability Export SLO (30d)",
188
+ "type": "stat"
189
+ },
190
+ {
191
+ "datasource": {
192
+ "type": "prometheus",
193
+ "uid": "prometheus"
194
+ },
195
+ "description": "30-day Agent Lineage SLO from observme-slos.yaml (objective: >=99%). Failures include missing-lineage spawn failures, orphan agents, and trace-context propagation failures over known subagent spawns. No data means no known spawn workload or missing telemetry, not a healthy score.",
196
+ "fieldConfig": {
197
+ "defaults": {
198
+ "color": {
199
+ "mode": "thresholds"
200
+ },
201
+ "mappings": [],
202
+ "noValue": "No workload / verify telemetry",
203
+ "thresholds": {
204
+ "mode": "absolute",
205
+ "steps": [
206
+ {
207
+ "color": "red",
208
+ "value": null
209
+ },
210
+ {
211
+ "color": "green",
212
+ "value": 0.99
213
+ }
214
+ ]
215
+ },
216
+ "unit": "percentunit"
217
+ },
218
+ "overrides": []
219
+ },
220
+ "gridPos": {
221
+ "h": 5,
222
+ "w": 5,
223
+ "x": 5,
224
+ "y": 1
225
+ },
226
+ "id": 2,
227
+ "links": [
228
+ {
229
+ "targetBlank": false,
230
+ "title": "Open Agents",
231
+ "url": "/d/observme-agents/observme-agents?${__url_time_range}"
232
+ },
233
+ {
234
+ "targetBlank": false,
235
+ "title": "Open Trace Journey",
236
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
237
+ }
238
+ ],
239
+ "options": {
240
+ "colorMode": "value",
241
+ "graphMode": "area",
242
+ "justifyMode": "auto",
243
+ "orientation": "auto",
244
+ "reduceOptions": {
245
+ "calcs": [
246
+ "lastNotNull"
247
+ ],
248
+ "fields": "",
249
+ "values": false
250
+ },
251
+ "showPercentChange": false,
252
+ "textMode": "auto",
253
+ "wideLayout": true
254
+ },
255
+ "targets": [
256
+ {
257
+ "datasource": {
258
+ "type": "prometheus",
259
+ "uid": "prometheus"
260
+ },
261
+ "editorMode": "code",
262
+ "expr": "(clamp_max(clamp_min(1 - (((sum(rate(observme_subagent_spawn_failures_total{reason=\"lineage_missing\"}[30d])) or vector(0)) + (sum(rate(observme_orphan_agents_total[30d])) or vector(0)) + (sum(rate(observme_trace_context_propagation_failures_total[30d])) or vector(0))) / clamp_min(sum(rate(observme_subagents_spawned_total[30d])), 1e-9)), 0), 1)) and on() (sum(rate(observme_subagents_spawned_total[30d])) > 0)",
263
+ "instant": true,
264
+ "range": false,
265
+ "refId": "A"
266
+ }
267
+ ],
268
+ "title": "Agent Lineage SLO (30d)",
269
+ "type": "stat"
270
+ },
271
+ {
272
+ "datasource": {
273
+ "type": "prometheus",
274
+ "uid": "prometheus"
275
+ },
276
+ "description": "30-day Workflow Completion SLO from observme-slos.yaml (objective: >=99%). Started workflows satisfy the SLO when they produce terminal completed or failed telemetry. No data means no started-workflow workload or missing telemetry, not a healthy score.",
277
+ "fieldConfig": {
278
+ "defaults": {
279
+ "color": {
280
+ "mode": "thresholds"
281
+ },
282
+ "mappings": [],
283
+ "noValue": "No workload / verify telemetry",
284
+ "thresholds": {
285
+ "mode": "absolute",
286
+ "steps": [
287
+ {
288
+ "color": "red",
289
+ "value": null
290
+ },
291
+ {
292
+ "color": "green",
293
+ "value": 0.99
294
+ }
295
+ ]
296
+ },
297
+ "unit": "percentunit"
298
+ },
299
+ "overrides": []
300
+ },
301
+ "gridPos": {
302
+ "h": 5,
303
+ "w": 5,
304
+ "x": 10,
305
+ "y": 1
306
+ },
307
+ "id": 3,
308
+ "links": [
309
+ {
310
+ "targetBlank": false,
311
+ "title": "Open Trace Journey",
312
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}"
313
+ }
314
+ ],
315
+ "options": {
316
+ "colorMode": "value",
317
+ "graphMode": "area",
318
+ "justifyMode": "auto",
319
+ "orientation": "auto",
320
+ "reduceOptions": {
321
+ "calcs": [
322
+ "lastNotNull"
323
+ ],
324
+ "fields": "",
325
+ "values": false
326
+ },
327
+ "showPercentChange": false,
328
+ "textMode": "auto",
329
+ "wideLayout": true
330
+ },
331
+ "targets": [
332
+ {
333
+ "datasource": {
334
+ "type": "prometheus",
335
+ "uid": "prometheus"
336
+ },
337
+ "editorMode": "code",
338
+ "expr": "(clamp_max(clamp_min(((sum(rate(observme_workflows_completed_total[30d])) or vector(0)) + (sum(rate(observme_workflow_errors_total[30d])) or vector(0))) / clamp_min(sum(rate(observme_workflows_started_total[30d])), 1e-9), 0), 1)) and on() (sum(rate(observme_workflows_started_total[30d])) > 0)",
339
+ "instant": true,
340
+ "range": false,
341
+ "refId": "A"
342
+ }
343
+ ],
344
+ "title": "Workflow Completion SLO (30d)",
345
+ "type": "stat"
346
+ },
347
+ {
348
+ "datasource": {
349
+ "type": "prometheus",
350
+ "uid": "prometheus"
351
+ },
352
+ "description": "Instrumentation Overhead SLO from observme-slos.yaml: p99 handler duration over 30 days should stay under 10 ms. No data means no handler observations or missing telemetry and must not be interpreted as a zero-millisecond healthy score.",
353
+ "fieldConfig": {
354
+ "defaults": {
355
+ "color": {
356
+ "mode": "thresholds"
357
+ },
358
+ "mappings": [],
359
+ "noValue": "No workload / verify telemetry",
360
+ "thresholds": {
361
+ "mode": "absolute",
362
+ "steps": [
363
+ {
364
+ "color": "green",
365
+ "value": null
366
+ },
367
+ {
368
+ "color": "red",
369
+ "value": 10
370
+ }
371
+ ]
372
+ },
373
+ "unit": "ms"
374
+ },
375
+ "overrides": []
376
+ },
377
+ "gridPos": {
378
+ "h": 5,
379
+ "w": 5,
380
+ "x": 15,
381
+ "y": 1
382
+ },
383
+ "id": 4,
384
+ "links": [
385
+ {
386
+ "targetBlank": false,
387
+ "title": "Open Export Health",
388
+ "url": "/d/observme-export-health/observme-export-health?${__url_time_range}"
389
+ }
390
+ ],
391
+ "options": {
392
+ "colorMode": "value",
393
+ "graphMode": "area",
394
+ "justifyMode": "auto",
395
+ "orientation": "auto",
396
+ "reduceOptions": {
397
+ "calcs": [
398
+ "lastNotNull"
399
+ ],
400
+ "fields": "",
401
+ "values": false
402
+ },
403
+ "showPercentChange": false,
404
+ "textMode": "auto",
405
+ "wideLayout": true
406
+ },
407
+ "targets": [
408
+ {
409
+ "datasource": {
410
+ "type": "prometheus",
411
+ "uid": "prometheus"
412
+ },
413
+ "editorMode": "code",
414
+ "expr": "histogram_quantile(0.99, sum(rate(observme_handler_duration_ms_bucket[30d])) by (le))",
415
+ "instant": true,
416
+ "range": false,
417
+ "refId": "A"
418
+ }
419
+ ],
420
+ "title": "Instrumentation Overhead SLO p99 (30d)",
421
+ "type": "stat"
422
+ },
423
+ {
424
+ "description": "The Redaction SLO is a CI/test-time objective, not a runtime metric. Use the repository redaction tests for the 100% configured secret-pattern target; runtime redaction failures are still surfaced on Export Health and Errors. Runtime scorecards intentionally show No data when their workload denominator is absent.",
425
+ "gridPos": {
426
+ "h": 5,
427
+ "w": 4,
428
+ "x": 20,
429
+ "y": 1
430
+ },
431
+ "id": 5,
432
+ "options": {
433
+ "code": {
434
+ "language": "markdown",
435
+ "showLineNumbers": false,
436
+ "showMiniMap": false
437
+ },
438
+ "content": "### Redaction SLO (CI/test)\n\nTarget: **100%** of configured secret test patterns are redacted in CI. This objective is not derived from production telemetry.\n\nRuntime companion: open **Export Health** for `observme_redaction_failures_total` and failure logs. Runtime **No data** means no denominator workload or missing telemetry; verify liveness before interpreting it.",
439
+ "mode": "markdown"
440
+ },
441
+ "pluginVersion": "11.1.0",
442
+ "title": "Redaction SLO (CI/test)",
443
+ "type": "text"
444
+ },
445
+ {
446
+ "collapsed": false,
447
+ "gridPos": {
448
+ "h": 1,
449
+ "w": 24,
450
+ "x": 0,
451
+ "y": 6
452
+ },
453
+ "id": 101,
454
+ "panels": [],
455
+ "title": "Burn rates",
456
+ "type": "row"
457
+ },
458
+ {
459
+ "datasource": {
460
+ "type": "prometheus",
461
+ "uid": "prometheus"
462
+ },
463
+ "description": "Short-window SLO burn rates normalized by the canonical 1% error budget. Values above 1 consume budget faster than the 99% objectives. A missing workload denominator returns No data, not zero burn; verify telemetry in Export Health. Yellow 1x and red 2x are tunable dashboard guidance, not alert rules.",
464
+ "fieldConfig": {
465
+ "defaults": {
466
+ "color": {
467
+ "mode": "thresholds"
468
+ },
469
+ "mappings": [],
470
+ "noValue": "No workload / verify telemetry",
471
+ "thresholds": {
472
+ "mode": "absolute",
473
+ "steps": [
474
+ {
475
+ "color": "green",
476
+ "value": null
477
+ },
478
+ {
479
+ "color": "yellow",
480
+ "value": 1
481
+ },
482
+ {
483
+ "color": "red",
484
+ "value": 2
485
+ }
486
+ ]
487
+ },
488
+ "unit": "short"
489
+ },
490
+ "overrides": []
491
+ },
492
+ "gridPos": {
493
+ "h": 8,
494
+ "w": 12,
495
+ "x": 0,
496
+ "y": 7
497
+ },
498
+ "id": 6,
499
+ "options": {
500
+ "displayMode": "gradient",
501
+ "maxVizHeight": 300,
502
+ "minVizHeight": 16,
503
+ "minVizWidth": 8,
504
+ "namePlacement": "auto",
505
+ "orientation": "horizontal",
506
+ "reduceOptions": {
507
+ "calcs": [
508
+ "lastNotNull"
509
+ ],
510
+ "fields": "",
511
+ "values": false
512
+ },
513
+ "showUnfilled": true,
514
+ "sizing": "auto",
515
+ "valueMode": "color"
516
+ },
517
+ "targets": [
518
+ {
519
+ "datasource": {
520
+ "type": "prometheus",
521
+ "uid": "prometheus"
522
+ },
523
+ "editorMode": "code",
524
+ "expr": "(((sum(rate(observme_telemetry_dropped_total[1h])) or vector(0)) / clamp_min(sum(rate(observme_events_observed_total[1h])), 1e-9)) / 0.01) and on() (sum(rate(observme_events_observed_total[1h])) > 0)",
525
+ "instant": true,
526
+ "legendFormat": "export drops",
527
+ "range": false,
528
+ "refId": "A"
529
+ },
530
+ {
531
+ "datasource": {
532
+ "type": "prometheus",
533
+ "uid": "prometheus"
534
+ },
535
+ "editorMode": "code",
536
+ "expr": "(((((sum(rate(observme_subagent_spawn_failures_total{reason=\"lineage_missing\"}[1h])) or vector(0)) + (sum(rate(observme_orphan_agents_total[1h])) or vector(0)) + (sum(rate(observme_trace_context_propagation_failures_total[1h])) or vector(0))) / clamp_min(sum(rate(observme_subagents_spawned_total[1h])), 1e-9)) / 0.01) and on() (sum(rate(observme_subagents_spawned_total[1h])) > 0))",
537
+ "instant": true,
538
+ "legendFormat": "agent lineage",
539
+ "range": false,
540
+ "refId": "B"
541
+ },
542
+ {
543
+ "datasource": {
544
+ "type": "prometheus",
545
+ "uid": "prometheus"
546
+ },
547
+ "editorMode": "code",
548
+ "expr": "((clamp_min(1 - clamp_max(((sum(rate(observme_workflows_completed_total[1h])) or vector(0)) + (sum(rate(observme_workflow_errors_total[1h])) or vector(0))) / clamp_min(sum(rate(observme_workflows_started_total[1h])), 1e-9), 1), 0) / 0.01) and on() (sum(rate(observme_workflows_started_total[1h])) > 0))",
549
+ "instant": true,
550
+ "legendFormat": "workflow terminal telemetry",
551
+ "range": false,
552
+ "refId": "C"
553
+ },
554
+ {
555
+ "datasource": {
556
+ "type": "prometheus",
557
+ "uid": "prometheus"
558
+ },
559
+ "editorMode": "code",
560
+ "expr": "((clamp_min(1 - ((sum(rate(observme_handler_duration_ms_bucket{le=\"10\"}[1h])) or vector(0)) / clamp_min(sum(rate(observme_handler_duration_ms_count[1h])), 1e-9)), 0) / 0.01) and on() (sum(rate(observme_handler_duration_ms_count[1h])) > 0))",
561
+ "instant": true,
562
+ "legendFormat": "handler >10ms",
563
+ "range": false,
564
+ "refId": "D"
565
+ }
566
+ ],
567
+ "title": "Runtime SLO burn rate (1h)",
568
+ "type": "bargauge"
569
+ },
570
+ {
571
+ "datasource": {
572
+ "type": "prometheus",
573
+ "uid": "prometheus"
574
+ },
575
+ "description": "Long-window SLO burn rates normalized by the canonical 1% error budget. This pairs with the 1h view to distinguish brief spikes from sustained SLO risk. A missing workload denominator returns No data, not zero burn; yellow 1x and red 2x remain tunable dashboard guidance.",
576
+ "fieldConfig": {
577
+ "defaults": {
578
+ "color": {
579
+ "mode": "thresholds"
580
+ },
581
+ "mappings": [],
582
+ "noValue": "No workload / verify telemetry",
583
+ "thresholds": {
584
+ "mode": "absolute",
585
+ "steps": [
586
+ {
587
+ "color": "green",
588
+ "value": null
589
+ },
590
+ {
591
+ "color": "yellow",
592
+ "value": 1
593
+ },
594
+ {
595
+ "color": "red",
596
+ "value": 2
597
+ }
598
+ ]
599
+ },
600
+ "unit": "short"
601
+ },
602
+ "overrides": []
603
+ },
604
+ "gridPos": {
605
+ "h": 8,
606
+ "w": 12,
607
+ "x": 12,
608
+ "y": 7
609
+ },
610
+ "id": 7,
611
+ "options": {
612
+ "displayMode": "gradient",
613
+ "maxVizHeight": 300,
614
+ "minVizHeight": 16,
615
+ "minVizWidth": 8,
616
+ "namePlacement": "auto",
617
+ "orientation": "horizontal",
618
+ "reduceOptions": {
619
+ "calcs": [
620
+ "lastNotNull"
621
+ ],
622
+ "fields": "",
623
+ "values": false
624
+ },
625
+ "showUnfilled": true,
626
+ "sizing": "auto",
627
+ "valueMode": "color"
628
+ },
629
+ "targets": [
630
+ {
631
+ "datasource": {
632
+ "type": "prometheus",
633
+ "uid": "prometheus"
634
+ },
635
+ "editorMode": "code",
636
+ "expr": "(((sum(rate(observme_telemetry_dropped_total[30d])) or vector(0)) / clamp_min(sum(rate(observme_events_observed_total[30d])), 1e-9)) / 0.01) and on() (sum(rate(observme_events_observed_total[30d])) > 0)",
637
+ "instant": true,
638
+ "legendFormat": "export drops",
639
+ "range": false,
640
+ "refId": "A"
641
+ },
642
+ {
643
+ "datasource": {
644
+ "type": "prometheus",
645
+ "uid": "prometheus"
646
+ },
647
+ "editorMode": "code",
648
+ "expr": "(((((sum(rate(observme_subagent_spawn_failures_total{reason=\"lineage_missing\"}[30d])) or vector(0)) + (sum(rate(observme_orphan_agents_total[30d])) or vector(0)) + (sum(rate(observme_trace_context_propagation_failures_total[30d])) or vector(0))) / clamp_min(sum(rate(observme_subagents_spawned_total[30d])), 1e-9)) / 0.01) and on() (sum(rate(observme_subagents_spawned_total[30d])) > 0))",
649
+ "instant": true,
650
+ "legendFormat": "agent lineage",
651
+ "range": false,
652
+ "refId": "B"
653
+ },
654
+ {
655
+ "datasource": {
656
+ "type": "prometheus",
657
+ "uid": "prometheus"
658
+ },
659
+ "editorMode": "code",
660
+ "expr": "((clamp_min(1 - clamp_max(((sum(rate(observme_workflows_completed_total[30d])) or vector(0)) + (sum(rate(observme_workflow_errors_total[30d])) or vector(0))) / clamp_min(sum(rate(observme_workflows_started_total[30d])), 1e-9), 1), 0) / 0.01) and on() (sum(rate(observme_workflows_started_total[30d])) > 0))",
661
+ "instant": true,
662
+ "legendFormat": "workflow terminal telemetry",
663
+ "range": false,
664
+ "refId": "C"
665
+ },
666
+ {
667
+ "datasource": {
668
+ "type": "prometheus",
669
+ "uid": "prometheus"
670
+ },
671
+ "editorMode": "code",
672
+ "expr": "((clamp_min(1 - ((sum(rate(observme_handler_duration_ms_bucket{le=\"10\"}[30d])) or vector(0)) / clamp_min(sum(rate(observme_handler_duration_ms_count[30d])), 1e-9)), 0) / 0.01) and on() (sum(rate(observme_handler_duration_ms_count[30d])) > 0))",
673
+ "instant": true,
674
+ "legendFormat": "handler >10ms",
675
+ "range": false,
676
+ "refId": "D"
677
+ }
678
+ ],
679
+ "title": "Runtime SLO burn rate (30d)",
680
+ "type": "bargauge"
681
+ },
682
+ {
683
+ "collapsed": false,
684
+ "gridPos": {
685
+ "h": 1,
686
+ "w": 24,
687
+ "x": 0,
688
+ "y": 15
689
+ },
690
+ "id": 102,
691
+ "panels": [],
692
+ "title": "Alert thresholds",
693
+ "type": "row"
694
+ },
695
+ {
696
+ "description": "Default alert expressions, windows, pending durations, and thresholds mirrored from dashboards/observme-alerts.yaml. Cost, fan-out, tree-depth, and active-agent values are tunable deployment guidance; edit the YAML rule rather than treating this panel as configuration.",
697
+ "gridPos": {
698
+ "h": 9,
699
+ "w": 24,
700
+ "x": 0,
701
+ "y": 16
702
+ },
703
+ "id": 8,
704
+ "options": {
705
+ "code": {
706
+ "language": "markdown",
707
+ "showLineNumbers": false,
708
+ "showMiniMap": false
709
+ },
710
+ "content": "### Runtime alert threshold reference (YAML defaults)\n\n- **ObservMeHighLlmErrorRate:** 10m LLM error ratio > **5%** for 10m.\n- **ObservMeHighToolFailureRate:** 10m per-tool failure ratio > **10%** for 10m.\n- **ObservMeSubagentSpawnFailures:** 10m spawn-failure rate > **0** for 10m.\n- **ObservMeExportDropsDetected:** 5m telemetry-drop rate > **0** for 5m.\n- **ObservMeCostSpike:** 1h LLM spend increase > **$50** for 15m; **tune per budget**.\n- **ObservMeRedactionFailures:** 5m redaction-failure rate > **0** for 5m; critical when capture is enabled.\n- **ObservMeRunawayAgentFanOut:** 10m p95 fan-out > **20** for 10m; **tune to normal orchestration load**.\n- **ObservMeExcessiveAgentTreeDepth:** 10m p95 tree depth > **5** for 10m; **tune to expected delegation depth**.\n- **ObservMeOrphanAgentsDetected:** 10m orphan-agent rate > **0** for 10m.\n- **ObservMeTraceContextPropagationFailures:** 10m propagation-failure rate > **0** for 10m.\n- **ObservMeActiveAgentsStuckHigh:** active agents > **100** for 30m; **tune per deployment**.",
711
+ "mode": "markdown"
712
+ },
713
+ "pluginVersion": "11.1.0",
714
+ "title": "Alert threshold reference",
715
+ "type": "text"
716
+ }
717
+ ],
718
+ "refresh": "30s",
719
+ "schemaVersion": 39,
720
+ "style": "dark",
721
+ "tags": [
722
+ "observme",
723
+ "slo-health"
724
+ ],
725
+ "templating": {
726
+ "list": []
727
+ },
728
+ "time": {
729
+ "from": "now-30d",
730
+ "to": "now"
731
+ },
732
+ "timezone": "browser",
733
+ "title": "ObservMe SLO Health",
734
+ "uid": "observme-slo-health",
735
+ "version": 2,
736
+ "weekStart": ""
737
+ }