toad-eye 2.4.5 → 2.6.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 (50) hide show
  1. package/README.md +34 -1
  2. package/dist/agent.js +6 -2
  3. package/dist/cli.js +8 -1
  4. package/dist/context/error.d.ts +15 -0
  5. package/dist/context/error.js +17 -0
  6. package/dist/context/guard.d.ts +8 -0
  7. package/dist/context/guard.js +41 -0
  8. package/dist/context/index.d.ts +1 -0
  9. package/dist/context/index.js +4 -0
  10. package/dist/core/metrics.d.ts +4 -1
  11. package/dist/core/metrics.js +74 -2
  12. package/dist/core/pricing.d.ts +2 -0
  13. package/dist/core/pricing.js +61 -16
  14. package/dist/core/spans.d.ts +2 -0
  15. package/dist/core/spans.js +48 -9
  16. package/dist/core/tracer.js +7 -1
  17. package/dist/instrumentations/anthropic.js +8 -2
  18. package/dist/instrumentations/create.js +67 -8
  19. package/dist/instrumentations/gemini.js +7 -0
  20. package/dist/instrumentations/openai.js +5 -0
  21. package/dist/instrumentations/types.d.ts +8 -0
  22. package/dist/mcp/context.d.ts +12 -0
  23. package/dist/mcp/context.js +22 -0
  24. package/dist/mcp/index.d.ts +3 -0
  25. package/dist/mcp/index.js +1 -0
  26. package/dist/mcp/metrics.d.ts +11 -0
  27. package/dist/mcp/metrics.js +58 -0
  28. package/dist/mcp/middleware.d.ts +48 -0
  29. package/dist/mcp/middleware.js +253 -0
  30. package/dist/mcp/spans.d.ts +28 -0
  31. package/dist/mcp/spans.js +67 -0
  32. package/dist/mcp/types.d.ts +34 -0
  33. package/dist/mcp/types.js +1 -0
  34. package/dist/types/attributes.d.ts +1 -0
  35. package/dist/types/attributes.js +1 -0
  36. package/dist/types/config.d.ts +9 -0
  37. package/dist/types/metrics.d.ts +8 -0
  38. package/dist/types/metrics.js +10 -0
  39. package/dist/types/spans.d.ts +4 -0
  40. package/package.json +11 -2
  41. package/templates/docker-compose.yml +4 -4
  42. package/templates/grafana/dashboards/agent-workflow.json +154 -31
  43. package/templates/grafana/dashboards/cost-breakdown.json +168 -40
  44. package/templates/grafana/dashboards/error-drilldown.json +155 -37
  45. package/templates/grafana/dashboards/finops-attribution.json +192 -43
  46. package/templates/grafana/dashboards/latency-analysis.json +103 -24
  47. package/templates/grafana/dashboards/llm-overview.json +268 -66
  48. package/templates/grafana/dashboards/mcp-server.json +519 -0
  49. package/templates/grafana/dashboards/model-comparison.json +119 -26
  50. package/templates/grafana/dashboards/provider-health.json +137 -31
@@ -1,5 +1,7 @@
1
1
  {
2
- "annotations": { "list": [] },
2
+ "annotations": {
3
+ "list": []
4
+ },
3
5
  "editable": true,
4
6
  "fiscalYearStartMonth": 0,
5
7
  "graphTooltip": 1,
@@ -9,11 +11,19 @@
9
11
  {
10
12
  "title": "Latency by Model (p95)",
11
13
  "type": "timeseries",
12
- "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 },
13
- "datasource": { "type": "prometheus", "uid": "prometheus" },
14
+ "gridPos": {
15
+ "h": 8,
16
+ "w": 12,
17
+ "x": 0,
18
+ "y": 0
19
+ },
20
+ "datasource": {
21
+ "type": "prometheus",
22
+ "uid": "prometheus"
23
+ },
14
24
  "targets": [
15
25
  {
16
- "expr": "histogram_quantile(0.95, sum(rate(gen_ai_client_operation_duration_milliseconds_bucket{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (le, gen_ai_request_model))",
26
+ "expr": "histogram_quantile(0.95, sum(rate(gen_ai_client_operation_duration_milliseconds_bucket{job=~\"$service\", gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (le, gen_ai_request_model))",
17
27
  "legendFormat": "p95 {{ gen_ai_request_model }}",
18
28
  "refId": "A"
19
29
  }
@@ -21,7 +31,11 @@
21
31
  "fieldConfig": {
22
32
  "defaults": {
23
33
  "unit": "ms",
24
- "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
34
+ "custom": {
35
+ "drawStyle": "line",
36
+ "fillOpacity": 15,
37
+ "lineWidth": 2
38
+ }
25
39
  },
26
40
  "overrides": []
27
41
  }
@@ -29,11 +43,19 @@
29
43
  {
30
44
  "title": "Cost by Model (avg per request)",
31
45
  "type": "timeseries",
32
- "gridPos": { "h": 8, "w": 12, "x": 12, "y": 0 },
33
- "datasource": { "type": "prometheus", "uid": "prometheus" },
46
+ "gridPos": {
47
+ "h": 8,
48
+ "w": 12,
49
+ "x": 12,
50
+ "y": 0
51
+ },
52
+ "datasource": {
53
+ "type": "prometheus",
54
+ "uid": "prometheus"
55
+ },
34
56
  "targets": [
35
57
  {
36
- "expr": "sum(rate(gen_ai_client_request_cost_USD_sum{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model) / sum(rate(gen_ai_client_request_cost_USD_count{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model)",
58
+ "expr": "sum(rate(gen_ai_client_request_cost_USD_sum{job=~\"$service\", gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model) / sum(rate(gen_ai_client_request_cost_USD_count{job=~\"$service\", gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model)",
37
59
  "legendFormat": "{{ gen_ai_request_model }}",
38
60
  "refId": "A"
39
61
  }
@@ -41,7 +63,11 @@
41
63
  "fieldConfig": {
42
64
  "defaults": {
43
65
  "unit": "currencyUSD",
44
- "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
66
+ "custom": {
67
+ "drawStyle": "line",
68
+ "fillOpacity": 15,
69
+ "lineWidth": 2
70
+ }
45
71
  },
46
72
  "overrides": []
47
73
  }
@@ -49,11 +75,19 @@
49
75
  {
50
76
  "title": "Error Rate by Model (%)",
51
77
  "type": "timeseries",
52
- "gridPos": { "h": 8, "w": 12, "x": 0, "y": 8 },
53
- "datasource": { "type": "prometheus", "uid": "prometheus" },
78
+ "gridPos": {
79
+ "h": 8,
80
+ "w": 12,
81
+ "x": 0,
82
+ "y": 8
83
+ },
84
+ "datasource": {
85
+ "type": "prometheus",
86
+ "uid": "prometheus"
87
+ },
54
88
  "targets": [
55
89
  {
56
- "expr": "sum(rate(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model) / sum(rate(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model) * 100",
90
+ "expr": "sum(rate(gen_ai_client_errors_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model) / sum(rate(gen_ai_client_requests_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model) * 100",
57
91
  "legendFormat": "{{ gen_ai_request_model }}",
58
92
  "refId": "A"
59
93
  }
@@ -61,7 +95,11 @@
61
95
  "fieldConfig": {
62
96
  "defaults": {
63
97
  "unit": "percent",
64
- "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
98
+ "custom": {
99
+ "drawStyle": "line",
100
+ "fillOpacity": 15,
101
+ "lineWidth": 2
102
+ }
65
103
  },
66
104
  "overrides": []
67
105
  }
@@ -69,11 +107,19 @@
69
107
  {
70
108
  "title": "Throughput by Model (req/min)",
71
109
  "type": "timeseries",
72
- "gridPos": { "h": 8, "w": 12, "x": 12, "y": 8 },
73
- "datasource": { "type": "prometheus", "uid": "prometheus" },
110
+ "gridPos": {
111
+ "h": 8,
112
+ "w": 12,
113
+ "x": 12,
114
+ "y": 8
115
+ },
116
+ "datasource": {
117
+ "type": "prometheus",
118
+ "uid": "prometheus"
119
+ },
74
120
  "targets": [
75
121
  {
76
- "expr": "sum(rate(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1m])) by (gen_ai_request_model) * 60",
122
+ "expr": "sum(rate(gen_ai_client_requests_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1m])) by (gen_ai_request_model) * 60",
77
123
  "legendFormat": "{{ gen_ai_request_model }}",
78
124
  "refId": "A"
79
125
  }
@@ -81,7 +127,11 @@
81
127
  "fieldConfig": {
82
128
  "defaults": {
83
129
  "unit": "reqpm",
84
- "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
130
+ "custom": {
131
+ "drawStyle": "line",
132
+ "fillOpacity": 15,
133
+ "lineWidth": 2
134
+ }
85
135
  },
86
136
  "overrides": []
87
137
  }
@@ -89,11 +139,19 @@
89
139
  {
90
140
  "title": "Tokens per Request by Model",
91
141
  "type": "timeseries",
92
- "gridPos": { "h": 8, "w": 24, "x": 0, "y": 16 },
93
- "datasource": { "type": "prometheus", "uid": "prometheus" },
142
+ "gridPos": {
143
+ "h": 8,
144
+ "w": 24,
145
+ "x": 0,
146
+ "y": 16
147
+ },
148
+ "datasource": {
149
+ "type": "prometheus",
150
+ "uid": "prometheus"
151
+ },
94
152
  "targets": [
95
153
  {
96
- "expr": "sum(rate(gen_ai_client_token_usage_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model) / sum(rate(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model)",
154
+ "expr": "sum(rate(gen_ai_client_token_usage_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model) / sum(rate(gen_ai_client_requests_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model)",
97
155
  "legendFormat": "{{ gen_ai_request_model }}",
98
156
  "refId": "A"
99
157
  }
@@ -101,7 +159,11 @@
101
159
  "fieldConfig": {
102
160
  "defaults": {
103
161
  "unit": "short",
104
- "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
162
+ "custom": {
163
+ "drawStyle": "line",
164
+ "fillOpacity": 15,
165
+ "lineWidth": 2
166
+ }
105
167
  },
106
168
  "overrides": []
107
169
  }
@@ -112,29 +174,60 @@
112
174
  "tags": ["llm", "observability", "toad-eye"],
113
175
  "templating": {
114
176
  "list": [
177
+ {
178
+ "name": "service",
179
+ "type": "query",
180
+ "datasource": {
181
+ "type": "prometheus",
182
+ "uid": "prometheus"
183
+ },
184
+ "query": "label_values(gen_ai_client_requests_total, job)",
185
+ "includeAll": true,
186
+ "allValue": ".*",
187
+ "current": {
188
+ "text": "All",
189
+ "value": "$__all"
190
+ },
191
+ "multi": true
192
+ },
115
193
  {
116
194
  "name": "provider",
117
195
  "type": "query",
118
- "datasource": { "type": "prometheus", "uid": "prometheus" },
196
+ "datasource": {
197
+ "type": "prometheus",
198
+ "uid": "prometheus"
199
+ },
119
200
  "query": "label_values(gen_ai_client_requests_total, gen_ai_provider_name)",
120
201
  "includeAll": true,
121
202
  "allValue": ".*",
122
- "current": { "text": "All", "value": "$__all" },
203
+ "current": {
204
+ "text": "All",
205
+ "value": "$__all"
206
+ },
123
207
  "multi": true
124
208
  },
125
209
  {
126
210
  "name": "model",
127
211
  "type": "query",
128
- "datasource": { "type": "prometheus", "uid": "prometheus" },
212
+ "datasource": {
213
+ "type": "prometheus",
214
+ "uid": "prometheus"
215
+ },
129
216
  "query": "label_values(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\"}, gen_ai_request_model)",
130
217
  "includeAll": true,
131
218
  "allValue": ".*",
132
- "current": { "text": "All", "value": "$__all" },
219
+ "current": {
220
+ "text": "All",
221
+ "value": "$__all"
222
+ },
133
223
  "multi": true
134
224
  }
135
225
  ]
136
226
  },
137
- "time": { "from": "now-15m", "to": "now" },
227
+ "time": {
228
+ "from": "now-15m",
229
+ "to": "now"
230
+ },
138
231
  "timepicker": {},
139
232
  "timezone": "browser",
140
233
  "title": "toad-eye: Model Comparison",
@@ -1,5 +1,7 @@
1
1
  {
2
- "annotations": { "list": [] },
2
+ "annotations": {
3
+ "list": []
4
+ },
3
5
  "editable": true,
4
6
  "fiscalYearStartMonth": 0,
5
7
  "graphTooltip": 1,
@@ -10,11 +12,19 @@
10
12
  "title": "Provider Status",
11
13
  "description": "healthy (< 10% errors) / degraded (10-50%) / down (> 50%)",
12
14
  "type": "stat",
13
- "gridPos": { "h": 6, "w": 8, "x": 0, "y": 0 },
14
- "datasource": { "type": "prometheus", "uid": "prometheus" },
15
+ "gridPos": {
16
+ "h": 6,
17
+ "w": 8,
18
+ "x": 0,
19
+ "y": 0
20
+ },
21
+ "datasource": {
22
+ "type": "prometheus",
23
+ "uid": "prometheus"
24
+ },
15
25
  "targets": [
16
26
  {
17
- "expr": "sum by (gen_ai_provider_name) (rate(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\"}[5m])) / sum by (gen_ai_provider_name) (rate(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\"}[5m]))",
27
+ "expr": "sum by (gen_ai_provider_name) (rate(gen_ai_client_errors_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\"}[5m])) / sum by (gen_ai_provider_name) (rate(gen_ai_client_requests_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\"}[5m]))",
18
28
  "legendFormat": "{{gen_ai_provider_name}}",
19
29
  "refId": "A"
20
30
  }
@@ -25,9 +35,18 @@
25
35
  "thresholds": {
26
36
  "mode": "absolute",
27
37
  "steps": [
28
- { "color": "green", "value": null },
29
- { "color": "yellow", "value": 0.1 },
30
- { "color": "red", "value": 0.5 }
38
+ {
39
+ "color": "green",
40
+ "value": null
41
+ },
42
+ {
43
+ "color": "yellow",
44
+ "value": 0.1
45
+ },
46
+ {
47
+ "color": "red",
48
+ "value": 0.5
49
+ }
31
50
  ]
32
51
  },
33
52
  "mappings": [
@@ -36,7 +55,10 @@
36
55
  "options": {
37
56
  "from": 0,
38
57
  "to": 0.1,
39
- "result": { "text": "HEALTHY", "color": "green" }
58
+ "result": {
59
+ "text": "HEALTHY",
60
+ "color": "green"
61
+ }
40
62
  }
41
63
  },
42
64
  {
@@ -44,7 +66,10 @@
44
66
  "options": {
45
67
  "from": 0.1,
46
68
  "to": 0.5,
47
- "result": { "text": "DEGRADED", "color": "yellow" }
69
+ "result": {
70
+ "text": "DEGRADED",
71
+ "color": "yellow"
72
+ }
48
73
  }
49
74
  },
50
75
  {
@@ -52,7 +77,10 @@
52
77
  "options": {
53
78
  "from": 0.5,
54
79
  "to": 1,
55
- "result": { "text": "DOWN", "color": "red" }
80
+ "result": {
81
+ "text": "DOWN",
82
+ "color": "red"
83
+ }
56
84
  }
57
85
  }
58
86
  ]
@@ -63,11 +91,19 @@
63
91
  {
64
92
  "title": "Request Volume by Provider",
65
93
  "type": "timeseries",
66
- "gridPos": { "h": 6, "w": 16, "x": 8, "y": 0 },
67
- "datasource": { "type": "prometheus", "uid": "prometheus" },
94
+ "gridPos": {
95
+ "h": 6,
96
+ "w": 16,
97
+ "x": 8,
98
+ "y": 0
99
+ },
100
+ "datasource": {
101
+ "type": "prometheus",
102
+ "uid": "prometheus"
103
+ },
68
104
  "targets": [
69
105
  {
70
- "expr": "sum by (gen_ai_provider_name) (rate(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\"}[5m]))",
106
+ "expr": "sum by (gen_ai_provider_name) (rate(gen_ai_client_requests_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\"}[5m]))",
71
107
  "legendFormat": "{{gen_ai_provider_name}}",
72
108
  "refId": "A"
73
109
  }
@@ -75,7 +111,9 @@
75
111
  "fieldConfig": {
76
112
  "defaults": {
77
113
  "unit": "reqps",
78
- "custom": { "fillOpacity": 15 }
114
+ "custom": {
115
+ "fillOpacity": 15
116
+ }
79
117
  },
80
118
  "overrides": []
81
119
  }
@@ -83,11 +121,19 @@
83
121
  {
84
122
  "title": "Error Rate by Provider (5m window)",
85
123
  "type": "timeseries",
86
- "gridPos": { "h": 8, "w": 12, "x": 0, "y": 6 },
87
- "datasource": { "type": "prometheus", "uid": "prometheus" },
124
+ "gridPos": {
125
+ "h": 8,
126
+ "w": 12,
127
+ "x": 0,
128
+ "y": 6
129
+ },
130
+ "datasource": {
131
+ "type": "prometheus",
132
+ "uid": "prometheus"
133
+ },
88
134
  "targets": [
89
135
  {
90
- "expr": "sum by (gen_ai_provider_name) (rate(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\"}[5m])) / sum by (gen_ai_provider_name) (rate(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\"}[5m]))",
136
+ "expr": "sum by (gen_ai_provider_name) (rate(gen_ai_client_errors_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\"}[5m])) / sum by (gen_ai_provider_name) (rate(gen_ai_client_requests_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\"}[5m]))",
91
137
  "legendFormat": "{{gen_ai_provider_name}} error rate",
92
138
  "refId": "A"
93
139
  }
@@ -95,13 +141,24 @@
95
141
  "fieldConfig": {
96
142
  "defaults": {
97
143
  "unit": "percentunit",
98
- "custom": { "fillOpacity": 10 },
144
+ "custom": {
145
+ "fillOpacity": 10
146
+ },
99
147
  "thresholds": {
100
148
  "mode": "absolute",
101
149
  "steps": [
102
- { "color": "green", "value": null },
103
- { "color": "yellow", "value": 0.1 },
104
- { "color": "red", "value": 0.5 }
150
+ {
151
+ "color": "green",
152
+ "value": null
153
+ },
154
+ {
155
+ "color": "yellow",
156
+ "value": 0.1
157
+ },
158
+ {
159
+ "color": "red",
160
+ "value": 0.5
161
+ }
105
162
  ]
106
163
  }
107
164
  },
@@ -111,11 +168,19 @@
111
168
  {
112
169
  "title": "Error Breakdown by Type",
113
170
  "type": "timeseries",
114
- "gridPos": { "h": 8, "w": 12, "x": 12, "y": 6 },
115
- "datasource": { "type": "prometheus", "uid": "prometheus" },
171
+ "gridPos": {
172
+ "h": 8,
173
+ "w": 12,
174
+ "x": 12,
175
+ "y": 6
176
+ },
177
+ "datasource": {
178
+ "type": "prometheus",
179
+ "uid": "prometheus"
180
+ },
116
181
  "targets": [
117
182
  {
118
- "expr": "sum by (gen_ai_provider_name, error_type) (rate(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\"}[5m]))",
183
+ "expr": "sum by (gen_ai_provider_name, error_type) (rate(gen_ai_client_errors_total{job=~\"$service\", gen_ai_provider_name=~\"$provider\"}[5m]))",
119
184
  "legendFormat": "{{gen_ai_provider_name}} — {{error_type}}",
120
185
  "refId": "A"
121
186
  }
@@ -123,7 +188,12 @@
123
188
  "fieldConfig": {
124
189
  "defaults": {
125
190
  "unit": "reqps",
126
- "custom": { "fillOpacity": 20, "stacking": { "mode": "normal" } }
191
+ "custom": {
192
+ "fillOpacity": 20,
193
+ "stacking": {
194
+ "mode": "normal"
195
+ }
196
+ }
127
197
  },
128
198
  "overrides": []
129
199
  }
@@ -132,8 +202,16 @@
132
202
  "title": "Provider Availability (24h / 7d / 30d)",
133
203
  "description": "Percentage of time with error rate below 10%",
134
204
  "type": "table",
135
- "gridPos": { "h": 6, "w": 24, "x": 0, "y": 14 },
136
- "datasource": { "type": "prometheus", "uid": "prometheus" },
205
+ "gridPos": {
206
+ "h": 6,
207
+ "w": 24,
208
+ "x": 0,
209
+ "y": 14
210
+ },
211
+ "datasource": {
212
+ "type": "prometheus",
213
+ "uid": "prometheus"
214
+ },
137
215
  "targets": [
138
216
  {
139
217
  "expr": "1 - (sum by (gen_ai_provider_name) (rate(gen_ai_client_errors_total[24h])) / sum by (gen_ai_provider_name) (rate(gen_ai_client_requests_total[24h])))",
@@ -161,7 +239,10 @@
161
239
  }
162
240
  ],
163
241
  "fieldConfig": {
164
- "defaults": { "unit": "percentunit", "decimals": 2 },
242
+ "defaults": {
243
+ "unit": "percentunit",
244
+ "decimals": 2
245
+ },
165
246
  "overrides": []
166
247
  }
167
248
  }
@@ -170,19 +251,44 @@
170
251
  "tags": ["toad-eye", "provider-health"],
171
252
  "templating": {
172
253
  "list": [
254
+ {
255
+ "name": "service",
256
+ "type": "query",
257
+ "datasource": {
258
+ "type": "prometheus",
259
+ "uid": "prometheus"
260
+ },
261
+ "query": "label_values(gen_ai_client_requests_total, job)",
262
+ "includeAll": true,
263
+ "allValue": ".*",
264
+ "current": {
265
+ "text": "All",
266
+ "value": "$__all"
267
+ },
268
+ "multi": true
269
+ },
173
270
  {
174
271
  "name": "provider",
175
272
  "type": "query",
176
- "datasource": { "type": "prometheus", "uid": "prometheus" },
273
+ "datasource": {
274
+ "type": "prometheus",
275
+ "uid": "prometheus"
276
+ },
177
277
  "query": "label_values(gen_ai_client_requests_total, gen_ai_provider_name)",
178
278
  "includeAll": true,
179
279
  "multi": true,
180
- "current": { "text": "All", "value": "$__all" },
280
+ "current": {
281
+ "text": "All",
282
+ "value": "$__all"
283
+ },
181
284
  "regex": ""
182
285
  }
183
286
  ]
184
287
  },
185
- "time": { "from": "now-6h", "to": "now" },
288
+ "time": {
289
+ "from": "now-6h",
290
+ "to": "now"
291
+ },
186
292
  "timepicker": {},
187
293
  "timezone": "utc",
188
294
  "title": "toad-eye / Provider Health",