@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,730 @@
1
+ {
2
+ "__requires": [
3
+ {
4
+ "id": "grafana",
5
+ "name": "Grafana",
6
+ "type": "grafana",
7
+ "version": "10.0.0"
8
+ },
9
+ {
10
+ "id": "loki",
11
+ "name": "Loki",
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": "logs",
23
+ "name": "Logs",
24
+ "type": "panel",
25
+ "version": ""
26
+ },
27
+ {
28
+ "id": "table",
29
+ "name": "Table",
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 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": "Models",
64
+ "tooltip": "Open provider/model traffic, reliability, latency, and cost details.",
65
+ "type": "link",
66
+ "url": "/d/observme-models/observme-models?${__url_time_range}"
67
+ },
68
+ {
69
+ "icon": "external link",
70
+ "includeVars": true,
71
+ "keepTime": true,
72
+ "targetBlank": false,
73
+ "title": "LLM lifecycle logs",
74
+ "tooltip": "Open non-content LLM lifecycle logs with the current filters.",
75
+ "type": "link",
76
+ "url": "/d/observme-logs-llm/observme-logs-llm?${__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 matching traces and lifecycle logs with the current context filters.",
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 failure ratios, failure logs, 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": "Privacy and capture state",
112
+ "type": "row"
113
+ },
114
+ {
115
+ "description": "Visible privacy and empty-state guidance for optional LLM content capture.",
116
+ "gridPos": {
117
+ "h": 5,
118
+ "w": 24,
119
+ "x": 0,
120
+ "y": 1
121
+ },
122
+ "id": 6,
123
+ "options": {
124
+ "code": {
125
+ "language": "markdown",
126
+ "showLineNumbers": false,
127
+ "showMiniMap": false
128
+ },
129
+ "content": "### Privacy and empty-state guidance\n\n- LLM prompt, response, and thinking capture is **opt-in**. Empty panels normally mean capture is disabled or no matching content exists in the selected range.\n- The recommended configuration redacts content before export. If unsafe capture is explicitly enabled while redaction is disabled, these panels can contain raw sensitive content.\n- Filter with session, workflow, agent, run, provider, model, and content-kind labels. **Never put raw prompt, response, or thinking text into Loki queries.**\n- New settings affect only newly emitted events; previously omitted content cannot be recovered.",
130
+ "mode": "markdown"
131
+ },
132
+ "pluginVersion": "11.1.0",
133
+ "title": "Read before viewing captured content",
134
+ "type": "text"
135
+ },
136
+ {
137
+ "collapsed": false,
138
+ "gridPos": {
139
+ "h": 1,
140
+ "w": 24,
141
+ "x": 0,
142
+ "y": 6
143
+ },
144
+ "id": 101,
145
+ "panels": [],
146
+ "title": "Conversation timeline",
147
+ "type": "row"
148
+ },
149
+ {
150
+ "datasource": {
151
+ "type": "loki",
152
+ "uid": "loki"
153
+ },
154
+ "description": "Canonical timeline of opt-in LLM prompts, responses, and thinking. The recommended redacted capture mode sanitizes content before export; explicit unsafe capture can expose raw sensitive text. Empty is healthy when capture is disabled or no content matches. Do not query by raw prompt, response, or thinking text.",
155
+ "gridPos": {
156
+ "h": 12,
157
+ "w": 24,
158
+ "x": 0,
159
+ "y": 7
160
+ },
161
+ "id": 1,
162
+ "options": {
163
+ "dedupStrategy": "none",
164
+ "enableLogDetails": true,
165
+ "prettifyLogMessage": false,
166
+ "showCommonLabels": false,
167
+ "showLabels": false,
168
+ "showTime": false,
169
+ "sortOrder": "Ascending",
170
+ "wrapLogMessage": true
171
+ },
172
+ "pluginVersion": "11.1.0",
173
+ "targets": [
174
+ {
175
+ "datasource": {
176
+ "type": "loki",
177
+ "uid": "loki"
178
+ },
179
+ "editorMode": "code",
180
+ "expr": "{service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\", pi_agent_run_id=~\"${agent_run_id:regex}\", gen_ai_provider_name=~\"${provider:regex}\", gen_ai_request_model=~\"${model:regex}\", pi_llm_content_kind=~\"${content_kind:regex}\", event_category=\"llm_content\"} | json | line_format \"{{.body}}\"",
181
+ "maxLines": 1000,
182
+ "queryType": "range",
183
+ "range": true,
184
+ "refId": "A"
185
+ }
186
+ ],
187
+ "title": "Conversation timeline (redacted, opt-in)",
188
+ "type": "logs",
189
+ "links": [
190
+ {
191
+ "targetBlank": false,
192
+ "title": "Open matching Trace Journey",
193
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
194
+ },
195
+ {
196
+ "targetBlank": false,
197
+ "title": "Open LLM lifecycle logs",
198
+ "url": "/d/observme-logs-llm/observme-logs-llm?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}&${provider:queryparam}&${model:queryparam}&${content_kind:queryparam}"
199
+ }
200
+ ]
201
+ },
202
+ {
203
+ "collapsed": false,
204
+ "gridPos": {
205
+ "h": 1,
206
+ "w": 24,
207
+ "x": 0,
208
+ "y": 19
209
+ },
210
+ "id": 102,
211
+ "panels": [],
212
+ "title": "Content by kind",
213
+ "type": "row"
214
+ },
215
+ {
216
+ "datasource": {
217
+ "type": "loki",
218
+ "uid": "loki"
219
+ },
220
+ "description": "Opt-in prompt bodies. Recommended capture mode redacts before export; explicit unsafe capture may expose raw sensitive text. Filter by context labels only; do not query by raw prompt text. Empty means prompt capture is disabled or no prompts match.",
221
+ "gridPos": {
222
+ "h": 10,
223
+ "w": 8,
224
+ "x": 0,
225
+ "y": 20
226
+ },
227
+ "id": 2,
228
+ "options": {
229
+ "dedupStrategy": "none",
230
+ "enableLogDetails": true,
231
+ "prettifyLogMessage": false,
232
+ "showCommonLabels": false,
233
+ "showLabels": false,
234
+ "showTime": false,
235
+ "sortOrder": "Ascending",
236
+ "wrapLogMessage": true
237
+ },
238
+ "pluginVersion": "11.1.0",
239
+ "targets": [
240
+ {
241
+ "datasource": {
242
+ "type": "loki",
243
+ "uid": "loki"
244
+ },
245
+ "editorMode": "code",
246
+ "expr": "{service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\", pi_agent_run_id=~\"${agent_run_id:regex}\", gen_ai_provider_name=~\"${provider:regex}\", gen_ai_request_model=~\"${model:regex}\", pi_llm_content_kind=~\"${content_kind:regex}\", event_name=\"llm.prompt.captured\"} | json | line_format \"{{.body}}\"",
247
+ "maxLines": 500,
248
+ "queryType": "range",
249
+ "range": true,
250
+ "refId": "A"
251
+ }
252
+ ],
253
+ "title": "Prompts",
254
+ "type": "logs",
255
+ "links": [
256
+ {
257
+ "targetBlank": false,
258
+ "title": "Open matching Trace Journey",
259
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
260
+ },
261
+ {
262
+ "targetBlank": false,
263
+ "title": "Open LLM lifecycle logs",
264
+ "url": "/d/observme-logs-llm/observme-logs-llm?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}&${provider:queryparam}&${model:queryparam}&${content_kind:queryparam}"
265
+ }
266
+ ]
267
+ },
268
+ {
269
+ "datasource": {
270
+ "type": "loki",
271
+ "uid": "loki"
272
+ },
273
+ "description": "Opt-in assistant response bodies. Recommended capture mode redacts before export; explicit unsafe capture may expose raw sensitive text. Filter by context labels only; do not query by raw response text. Empty means response capture is disabled or no responses match.",
274
+ "gridPos": {
275
+ "h": 10,
276
+ "w": 8,
277
+ "x": 8,
278
+ "y": 20
279
+ },
280
+ "id": 3,
281
+ "options": {
282
+ "dedupStrategy": "none",
283
+ "enableLogDetails": true,
284
+ "prettifyLogMessage": false,
285
+ "showCommonLabels": false,
286
+ "showLabels": false,
287
+ "showTime": false,
288
+ "sortOrder": "Ascending",
289
+ "wrapLogMessage": true
290
+ },
291
+ "pluginVersion": "11.1.0",
292
+ "targets": [
293
+ {
294
+ "datasource": {
295
+ "type": "loki",
296
+ "uid": "loki"
297
+ },
298
+ "editorMode": "code",
299
+ "expr": "{service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\", pi_agent_run_id=~\"${agent_run_id:regex}\", gen_ai_provider_name=~\"${provider:regex}\", gen_ai_request_model=~\"${model:regex}\", pi_llm_content_kind=~\"${content_kind:regex}\", event_name=\"llm.response.captured\"} | json | line_format \"{{.body}}\"",
300
+ "maxLines": 500,
301
+ "queryType": "range",
302
+ "range": true,
303
+ "refId": "A"
304
+ }
305
+ ],
306
+ "title": "Responses",
307
+ "type": "logs",
308
+ "links": [
309
+ {
310
+ "targetBlank": false,
311
+ "title": "Open matching Trace Journey",
312
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
313
+ },
314
+ {
315
+ "targetBlank": false,
316
+ "title": "Open LLM lifecycle logs",
317
+ "url": "/d/observme-logs-llm/observme-logs-llm?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}&${provider:queryparam}&${model:queryparam}&${content_kind:queryparam}"
318
+ }
319
+ ]
320
+ },
321
+ {
322
+ "datasource": {
323
+ "type": "loki",
324
+ "uid": "loki"
325
+ },
326
+ "description": "Opt-in assistant thinking/reasoning bodies. Recommended capture mode redacts before export; explicit unsafe capture may expose raw sensitive text. Filter by context labels only; do not query by raw thinking text. Empty means thinking capture is disabled or no thinking logs match.",
327
+ "gridPos": {
328
+ "h": 10,
329
+ "w": 8,
330
+ "x": 16,
331
+ "y": 20
332
+ },
333
+ "id": 4,
334
+ "options": {
335
+ "dedupStrategy": "none",
336
+ "enableLogDetails": true,
337
+ "prettifyLogMessage": false,
338
+ "showCommonLabels": false,
339
+ "showLabels": false,
340
+ "showTime": false,
341
+ "sortOrder": "Ascending",
342
+ "wrapLogMessage": true
343
+ },
344
+ "pluginVersion": "11.1.0",
345
+ "targets": [
346
+ {
347
+ "datasource": {
348
+ "type": "loki",
349
+ "uid": "loki"
350
+ },
351
+ "editorMode": "code",
352
+ "expr": "{service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\", pi_agent_run_id=~\"${agent_run_id:regex}\", gen_ai_provider_name=~\"${provider:regex}\", gen_ai_request_model=~\"${model:regex}\", pi_llm_content_kind=~\"${content_kind:regex}\", event_name=\"llm.thinking.captured\"} | json | line_format \"{{.body}}\"",
353
+ "maxLines": 500,
354
+ "queryType": "range",
355
+ "range": true,
356
+ "refId": "A"
357
+ }
358
+ ],
359
+ "title": "Thinking",
360
+ "type": "logs",
361
+ "links": [
362
+ {
363
+ "targetBlank": false,
364
+ "title": "Open matching Trace Journey",
365
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
366
+ },
367
+ {
368
+ "targetBlank": false,
369
+ "title": "Open LLM lifecycle logs",
370
+ "url": "/d/observme-logs-llm/observme-logs-llm?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}&${provider:queryparam}&${model:queryparam}&${content_kind:queryparam}"
371
+ }
372
+ ]
373
+ },
374
+ {
375
+ "collapsed": false,
376
+ "gridPos": {
377
+ "h": 1,
378
+ "w": 24,
379
+ "x": 0,
380
+ "y": 30
381
+ },
382
+ "id": 103,
383
+ "panels": [],
384
+ "title": "Trace index",
385
+ "type": "row"
386
+ },
387
+ {
388
+ "datasource": {
389
+ "type": "loki",
390
+ "uid": "loki"
391
+ },
392
+ "description": "Trace index for matching opt-in conversation records. The table hides captured bodies and exposes only context labels plus trace/span IDs; trace_id opens Tempo. Recommended capture mode is redacted, while explicit unsafe capture can contain raw content in Loki. Empty means capture is disabled or no content matches.",
393
+ "fieldConfig": {
394
+ "defaults": {},
395
+ "overrides": [
396
+ {
397
+ "matcher": {
398
+ "id": "byName",
399
+ "options": "trace_id"
400
+ },
401
+ "properties": [
402
+ {
403
+ "id": "links",
404
+ "value": [
405
+ {
406
+ "targetBlank": false,
407
+ "title": "Open Tempo trace",
408
+ "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"
409
+ }
410
+ ]
411
+ },
412
+ {
413
+ "id": "custom.width",
414
+ "value": 220
415
+ }
416
+ ]
417
+ },
418
+ {
419
+ "matcher": {
420
+ "id": "byName",
421
+ "options": "Time"
422
+ },
423
+ "properties": [
424
+ {
425
+ "id": "custom.width",
426
+ "value": 180
427
+ }
428
+ ]
429
+ }
430
+ ]
431
+ },
432
+ "gridPos": {
433
+ "h": 9,
434
+ "w": 24,
435
+ "x": 0,
436
+ "y": 31
437
+ },
438
+ "id": 5,
439
+ "links": [
440
+ {
441
+ "targetBlank": false,
442
+ "title": "Open matching Trace Journey",
443
+ "url": "/d/observme-trace-journey/observme-trace-journey?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}"
444
+ },
445
+ {
446
+ "targetBlank": false,
447
+ "title": "Open LLM lifecycle logs",
448
+ "url": "/d/observme-logs-llm/observme-logs-llm?${__url_time_range}&${session_id:queryparam}&${workflow_id:queryparam}&${agent_id:queryparam}&${agent_run_id:queryparam}&${provider:queryparam}&${model:queryparam}&${content_kind:queryparam}"
449
+ }
450
+ ],
451
+ "options": {
452
+ "cellHeight": "sm",
453
+ "footer": {
454
+ "countRows": false,
455
+ "fields": "",
456
+ "reducer": [
457
+ "sum"
458
+ ],
459
+ "show": false
460
+ },
461
+ "showHeader": true,
462
+ "sortBy": [
463
+ {
464
+ "desc": false,
465
+ "displayName": "Time"
466
+ }
467
+ ]
468
+ },
469
+ "pluginVersion": "11.1.0",
470
+ "targets": [
471
+ {
472
+ "datasource": {
473
+ "type": "loki",
474
+ "uid": "loki"
475
+ },
476
+ "editorMode": "code",
477
+ "expr": "{service_name=\"observme-pi-extension\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\", pi_agent_run_id=~\"${agent_run_id:regex}\", gen_ai_provider_name=~\"${provider:regex}\", gen_ai_request_model=~\"${model:regex}\", pi_llm_content_kind=~\"${content_kind:regex}\", event_category=\"llm_content\"} | 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 }},\"provider\":{{ printf \"%q\" .gen_ai_provider_name }},\"model\":{{ printf \"%q\" .gen_ai_request_model }},\"content_kind\":{{ printf \"%q\" .pi_llm_content_kind }},\"trace_id\":{{ printf \"%q\" .trace_id }},\"span_id\":{{ printf \"%q\" .span_id }}}`",
478
+ "legendFormat": "{{event_name}} {{pi_session_id}} {{pi_agent_run_id}}",
479
+ "maxLines": 500,
480
+ "queryType": "range",
481
+ "range": true,
482
+ "refId": "A"
483
+ }
484
+ ],
485
+ "title": "Conversation trace links",
486
+ "type": "table",
487
+ "transformations": [
488
+ {
489
+ "id": "labelsToFields",
490
+ "options": {
491
+ "mode": "columns"
492
+ }
493
+ },
494
+ {
495
+ "id": "extractFields",
496
+ "options": {
497
+ "format": "json",
498
+ "keepTime": true,
499
+ "replace": false,
500
+ "source": "Line"
501
+ }
502
+ },
503
+ {
504
+ "id": "organize",
505
+ "options": {
506
+ "excludeByName": {
507
+ "Line": true,
508
+ "id": true,
509
+ "labels": true,
510
+ "tsNs": true
511
+ },
512
+ "renameByName": {
513
+ "event_name": "event",
514
+ "event_category": "category",
515
+ "pi_session_id": "session",
516
+ "pi_workflow_id": "workflow",
517
+ "pi_agent_id": "agent",
518
+ "pi_agent_parent_id": "parent_agent",
519
+ "pi_agent_run_id": "agent_run",
520
+ "gen_ai_provider_name": "provider",
521
+ "gen_ai_request_model": "model",
522
+ "pi_llm_content_kind": "content_kind",
523
+ "trace_id": "trace_id",
524
+ "span_id": "span_id"
525
+ }
526
+ }
527
+ }
528
+ ]
529
+ }
530
+ ],
531
+ "refresh": "30s",
532
+ "schemaVersion": 39,
533
+ "style": "dark",
534
+ "tags": [
535
+ "observme",
536
+ "pi",
537
+ "llm",
538
+ "conversation",
539
+ "redacted"
540
+ ],
541
+ "templating": {
542
+ "list": [
543
+ {
544
+ "allValue": ".*",
545
+ "current": {
546
+ "selected": true,
547
+ "text": "All",
548
+ "value": "$__all"
549
+ },
550
+ "datasource": {
551
+ "type": "loki",
552
+ "uid": "loki"
553
+ },
554
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\"}, pi_session_id)",
555
+ "hide": 0,
556
+ "includeAll": true,
557
+ "label": "Session ID",
558
+ "multi": true,
559
+ "name": "session_id",
560
+ "options": [],
561
+ "query": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\"}, pi_session_id)",
562
+ "refresh": 2,
563
+ "regex": "",
564
+ "skipUrlSync": false,
565
+ "sort": 1,
566
+ "type": "query"
567
+ },
568
+ {
569
+ "allValue": ".*",
570
+ "current": {
571
+ "selected": true,
572
+ "text": "All",
573
+ "value": "$__all"
574
+ },
575
+ "datasource": {
576
+ "type": "loki",
577
+ "uid": "loki"
578
+ },
579
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", pi_session_id=~\"${session_id:regex}\"}, pi_workflow_id)",
580
+ "hide": 0,
581
+ "includeAll": true,
582
+ "label": "Workflow ID",
583
+ "multi": true,
584
+ "name": "workflow_id",
585
+ "options": [],
586
+ "query": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", pi_session_id=~\"${session_id:regex}\"}, pi_workflow_id)",
587
+ "refresh": 2,
588
+ "regex": "",
589
+ "skipUrlSync": false,
590
+ "sort": 1,
591
+ "type": "query"
592
+ },
593
+ {
594
+ "allValue": ".*",
595
+ "current": {
596
+ "selected": true,
597
+ "text": "All",
598
+ "value": "$__all"
599
+ },
600
+ "datasource": {
601
+ "type": "loki",
602
+ "uid": "loki"
603
+ },
604
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\"}, pi_agent_id)",
605
+ "hide": 0,
606
+ "includeAll": true,
607
+ "label": "Agent ID",
608
+ "multi": true,
609
+ "name": "agent_id",
610
+ "options": [],
611
+ "query": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\"}, pi_agent_id)",
612
+ "refresh": 2,
613
+ "regex": "",
614
+ "skipUrlSync": false,
615
+ "sort": 1,
616
+ "type": "query"
617
+ },
618
+ {
619
+ "allValue": ".*",
620
+ "current": {
621
+ "selected": true,
622
+ "text": "All",
623
+ "value": "$__all"
624
+ },
625
+ "datasource": {
626
+ "type": "loki",
627
+ "uid": "loki"
628
+ },
629
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\"}, pi_agent_run_id)",
630
+ "hide": 0,
631
+ "includeAll": true,
632
+ "label": "Agent run ID",
633
+ "multi": true,
634
+ "name": "agent_run_id",
635
+ "options": [],
636
+ "query": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", pi_session_id=~\"${session_id:regex}\", pi_workflow_id=~\"${workflow_id:regex}\", pi_agent_id=~\"${agent_id:regex}\"}, pi_agent_run_id)",
637
+ "refresh": 2,
638
+ "regex": "",
639
+ "skipUrlSync": false,
640
+ "sort": 1,
641
+ "type": "query"
642
+ },
643
+ {
644
+ "allValue": ".*",
645
+ "current": {
646
+ "selected": true,
647
+ "text": "All",
648
+ "value": "$__all"
649
+ },
650
+ "datasource": {
651
+ "type": "loki",
652
+ "uid": "loki"
653
+ },
654
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", 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}\"}, gen_ai_provider_name)",
655
+ "hide": 0,
656
+ "includeAll": true,
657
+ "label": "Provider",
658
+ "multi": true,
659
+ "name": "provider",
660
+ "options": [],
661
+ "query": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", 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}\"}, gen_ai_provider_name)",
662
+ "refresh": 2,
663
+ "regex": "",
664
+ "skipUrlSync": false,
665
+ "sort": 1,
666
+ "type": "query"
667
+ },
668
+ {
669
+ "allValue": ".*",
670
+ "current": {
671
+ "selected": true,
672
+ "text": "All",
673
+ "value": "$__all"
674
+ },
675
+ "datasource": {
676
+ "type": "loki",
677
+ "uid": "loki"
678
+ },
679
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", 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}\", gen_ai_provider_name=~\"${provider:regex}\"}, gen_ai_request_model)",
680
+ "hide": 0,
681
+ "includeAll": true,
682
+ "label": "Model",
683
+ "multi": true,
684
+ "name": "model",
685
+ "options": [],
686
+ "query": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", 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}\", gen_ai_provider_name=~\"${provider:regex}\"}, gen_ai_request_model)",
687
+ "refresh": 2,
688
+ "regex": "",
689
+ "skipUrlSync": false,
690
+ "sort": 1,
691
+ "type": "query"
692
+ },
693
+ {
694
+ "allValue": ".*",
695
+ "current": {
696
+ "selected": true,
697
+ "text": "All",
698
+ "value": "$__all"
699
+ },
700
+ "datasource": {
701
+ "type": "loki",
702
+ "uid": "loki"
703
+ },
704
+ "definition": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", 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}\", gen_ai_provider_name=~\"${provider:regex}\", gen_ai_request_model=~\"${model:regex}\"}, pi_llm_content_kind)",
705
+ "hide": 0,
706
+ "includeAll": true,
707
+ "label": "Content kind",
708
+ "multi": true,
709
+ "name": "content_kind",
710
+ "options": [],
711
+ "query": "label_values({service_name=\"observme-pi-extension\", event_category=\"llm_content\", 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}\", gen_ai_provider_name=~\"${provider:regex}\", gen_ai_request_model=~\"${model:regex}\"}, pi_llm_content_kind)",
712
+ "refresh": 2,
713
+ "regex": "",
714
+ "skipUrlSync": false,
715
+ "sort": 1,
716
+ "type": "query"
717
+ }
718
+ ]
719
+ },
720
+ "time": {
721
+ "from": "now-1h",
722
+ "to": "now"
723
+ },
724
+ "timepicker": {},
725
+ "timezone": "browser",
726
+ "title": "ObservMe LLM Conversations",
727
+ "uid": "observme-llm-conversations",
728
+ "version": 3,
729
+ "weekStart": ""
730
+ }