toad-eye 2.7.0 → 2.8.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.
@@ -0,0 +1,295 @@
1
+ {
2
+ "annotations": {
3
+ "list": []
4
+ },
5
+ "editable": true,
6
+ "fiscalYearStartMonth": 0,
7
+ "graphTooltip": 1,
8
+ "id": null,
9
+ "links": [],
10
+ "panels": [
11
+ {
12
+ "title": "Tool Popularity Ranking",
13
+ "description": "Most called tools by total invocations",
14
+ "type": "bargauge",
15
+ "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 },
16
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
17
+ "targets": [
18
+ {
19
+ "expr": "topk(10, sum by (gen_ai_tool_name) (increase(gen_ai_mcp_tool_calls_total[1h])))",
20
+ "legendFormat": "{{gen_ai_tool_name}}",
21
+ "refId": "A",
22
+ "instant": true
23
+ }
24
+ ],
25
+ "fieldConfig": {
26
+ "defaults": {
27
+ "unit": "short",
28
+ "decimals": 0,
29
+ "thresholds": {
30
+ "steps": [
31
+ { "color": "blue", "value": null },
32
+ { "color": "green", "value": 10 },
33
+ { "color": "yellow", "value": 100 },
34
+ { "color": "red", "value": 500 }
35
+ ]
36
+ }
37
+ },
38
+ "overrides": []
39
+ },
40
+ "options": {
41
+ "orientation": "horizontal",
42
+ "displayMode": "gradient",
43
+ "showUnfilled": true,
44
+ "minVizWidth": 0,
45
+ "minVizHeight": 10
46
+ }
47
+ },
48
+ {
49
+ "title": "Unique Callers per Tool",
50
+ "description": "Number of distinct sessions calling each tool",
51
+ "type": "bargauge",
52
+ "gridPos": { "h": 8, "w": 12, "x": 12, "y": 0 },
53
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
54
+ "targets": [
55
+ {
56
+ "expr": "count by (gen_ai_tool_name) (sum by (gen_ai_tool_name, mcp_session_id) (gen_ai_mcp_tool_callers_total))",
57
+ "legendFormat": "{{gen_ai_tool_name}}",
58
+ "refId": "A",
59
+ "instant": true
60
+ }
61
+ ],
62
+ "fieldConfig": {
63
+ "defaults": {
64
+ "unit": "short",
65
+ "decimals": 0,
66
+ "thresholds": {
67
+ "steps": [
68
+ { "color": "purple", "value": null },
69
+ { "color": "blue", "value": 5 },
70
+ { "color": "green", "value": 20 }
71
+ ]
72
+ }
73
+ },
74
+ "overrides": []
75
+ },
76
+ "options": {
77
+ "orientation": "horizontal",
78
+ "displayMode": "gradient",
79
+ "showUnfilled": true,
80
+ "minVizWidth": 0,
81
+ "minVizHeight": 10
82
+ }
83
+ },
84
+ {
85
+ "title": "Tool Usage Over Time",
86
+ "description": "Call rate per tool — spot trends and spikes",
87
+ "type": "timeseries",
88
+ "gridPos": { "h": 8, "w": 24, "x": 0, "y": 8 },
89
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
90
+ "targets": [
91
+ {
92
+ "expr": "sum by (gen_ai_tool_name) (rate(gen_ai_mcp_tool_calls_total[5m]))",
93
+ "legendFormat": "{{gen_ai_tool_name}}",
94
+ "refId": "A"
95
+ }
96
+ ],
97
+ "fieldConfig": {
98
+ "defaults": {
99
+ "unit": "reqps",
100
+ "custom": {
101
+ "drawStyle": "line",
102
+ "lineInterpolation": "smooth",
103
+ "fillOpacity": 20,
104
+ "pointSize": 5,
105
+ "showPoints": "auto",
106
+ "stacking": { "mode": "none" }
107
+ },
108
+ "color": { "mode": "palette-classic" }
109
+ },
110
+ "overrides": []
111
+ },
112
+ "options": {
113
+ "legend": {
114
+ "displayMode": "table",
115
+ "placement": "right",
116
+ "calcs": ["mean", "max", "sum"]
117
+ },
118
+ "tooltip": { "mode": "multi" }
119
+ }
120
+ },
121
+ {
122
+ "title": "Cost per LLM Model (via sampling)",
123
+ "description": "LLM cost breakdown — visible when MCP tools call LLMs internally",
124
+ "type": "piechart",
125
+ "gridPos": { "h": 8, "w": 8, "x": 0, "y": 16 },
126
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
127
+ "targets": [
128
+ {
129
+ "expr": "sum by (gen_ai_request_model) (increase(gen_ai_client_request_cost_USD_sum[1h]))",
130
+ "legendFormat": "{{gen_ai_request_model}}",
131
+ "refId": "A",
132
+ "instant": true
133
+ }
134
+ ],
135
+ "fieldConfig": {
136
+ "defaults": {
137
+ "unit": "currencyUSD",
138
+ "decimals": 4,
139
+ "color": { "mode": "palette-classic" }
140
+ },
141
+ "overrides": []
142
+ },
143
+ "options": {
144
+ "legend": {
145
+ "displayMode": "table",
146
+ "placement": "right",
147
+ "values": ["value", "percent"]
148
+ },
149
+ "pieType": "donut",
150
+ "tooltip": { "mode": "multi" }
151
+ }
152
+ },
153
+ {
154
+ "title": "Cost Over Time",
155
+ "description": "LLM cost rate — attribute to tools via trace context",
156
+ "type": "timeseries",
157
+ "gridPos": { "h": 8, "w": 16, "x": 8, "y": 16 },
158
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
159
+ "targets": [
160
+ {
161
+ "expr": "sum by (gen_ai_request_model) (rate(gen_ai_client_request_cost_USD_sum[5m])) * 3600",
162
+ "legendFormat": "{{gen_ai_request_model}} ($/hr)",
163
+ "refId": "A"
164
+ }
165
+ ],
166
+ "fieldConfig": {
167
+ "defaults": {
168
+ "unit": "currencyUSD",
169
+ "decimals": 4,
170
+ "custom": {
171
+ "drawStyle": "line",
172
+ "lineInterpolation": "smooth",
173
+ "fillOpacity": 15,
174
+ "pointSize": 5,
175
+ "showPoints": "auto"
176
+ },
177
+ "color": { "mode": "palette-classic" }
178
+ },
179
+ "overrides": []
180
+ },
181
+ "options": {
182
+ "legend": {
183
+ "displayMode": "table",
184
+ "placement": "bottom",
185
+ "calcs": ["sum", "mean"]
186
+ },
187
+ "tooltip": { "mode": "multi" }
188
+ }
189
+ },
190
+ {
191
+ "title": "Tool Performance Summary",
192
+ "description": "All tools: call count, avg duration, error rate, unique callers",
193
+ "type": "table",
194
+ "gridPos": { "h": 8, "w": 24, "x": 0, "y": 24 },
195
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
196
+ "targets": [
197
+ {
198
+ "expr": "sum by (gen_ai_tool_name) (increase(gen_ai_mcp_tool_calls_total[1h]))",
199
+ "legendFormat": "",
200
+ "refId": "calls",
201
+ "format": "table",
202
+ "instant": true
203
+ },
204
+ {
205
+ "expr": "sum by (gen_ai_tool_name) (rate(gen_ai_mcp_tool_duration_sum[1h])) / sum by (gen_ai_tool_name) (rate(gen_ai_mcp_tool_duration_count[1h]))",
206
+ "legendFormat": "",
207
+ "refId": "avg_duration",
208
+ "format": "table",
209
+ "instant": true
210
+ },
211
+ {
212
+ "expr": "sum by (gen_ai_tool_name) (increase(gen_ai_mcp_tool_errors_total[1h])) / sum by (gen_ai_tool_name) (increase(gen_ai_mcp_tool_calls_total[1h]))",
213
+ "legendFormat": "",
214
+ "refId": "error_rate",
215
+ "format": "table",
216
+ "instant": true
217
+ },
218
+ {
219
+ "expr": "count by (gen_ai_tool_name) (sum by (gen_ai_tool_name, mcp_session_id) (gen_ai_mcp_tool_callers_total))",
220
+ "legendFormat": "",
221
+ "refId": "callers",
222
+ "format": "table",
223
+ "instant": true
224
+ }
225
+ ],
226
+ "transformations": [
227
+ { "id": "merge" },
228
+ {
229
+ "id": "organize",
230
+ "options": {
231
+ "excludeByName": { "Time": true },
232
+ "renameByName": {
233
+ "gen_ai_tool_name": "Tool",
234
+ "Value #calls": "Calls (1h)",
235
+ "Value #avg_duration": "Avg Duration (ms)",
236
+ "Value #error_rate": "Error Rate",
237
+ "Value #callers": "Unique Callers"
238
+ }
239
+ }
240
+ }
241
+ ],
242
+ "fieldConfig": {
243
+ "defaults": {
244
+ "custom": { "align": "center" }
245
+ },
246
+ "overrides": [
247
+ {
248
+ "matcher": { "id": "byName", "options": "Avg Duration (ms)" },
249
+ "properties": [
250
+ { "id": "unit", "value": "ms" },
251
+ { "id": "decimals", "value": 1 }
252
+ ]
253
+ },
254
+ {
255
+ "matcher": { "id": "byName", "options": "Error Rate" },
256
+ "properties": [
257
+ { "id": "unit", "value": "percentunit" },
258
+ { "id": "decimals", "value": 2 },
259
+ {
260
+ "id": "thresholds",
261
+ "value": {
262
+ "mode": "absolute",
263
+ "steps": [
264
+ { "color": "green", "value": null },
265
+ { "color": "yellow", "value": 0.05 },
266
+ { "color": "red", "value": 0.1 }
267
+ ]
268
+ }
269
+ },
270
+ { "id": "custom.displayMode", "value": "color-background" }
271
+ ]
272
+ },
273
+ {
274
+ "matcher": { "id": "byName", "options": "Calls (1h)" },
275
+ "properties": [{ "id": "decimals", "value": 0 }]
276
+ }
277
+ ]
278
+ }
279
+ }
280
+ ],
281
+ "schemaVersion": 39,
282
+ "tags": ["toad-eye", "mcp", "analytics", "cost"],
283
+ "templating": {
284
+ "list": []
285
+ },
286
+ "time": {
287
+ "from": "now-1h",
288
+ "to": "now"
289
+ },
290
+ "timepicker": {},
291
+ "timezone": "browser",
292
+ "title": "MCP Tool Analytics",
293
+ "uid": "toad-eye-mcp-analytics",
294
+ "version": 1
295
+ }
@@ -0,0 +1,323 @@
1
+ {
2
+ "annotations": {
3
+ "list": []
4
+ },
5
+ "editable": true,
6
+ "fiscalYearStartMonth": 0,
7
+ "graphTooltip": 1,
8
+ "id": null,
9
+ "links": [],
10
+ "panels": [
11
+ {
12
+ "title": "Total Request Rate",
13
+ "description": "Combined rate of MCP client + server operations",
14
+ "type": "stat",
15
+ "gridPos": { "h": 4, "w": 6, "x": 0, "y": 0 },
16
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
17
+ "targets": [
18
+ {
19
+ "expr": "sum(rate(gen_ai_mcp_tool_calls_total[5m])) + sum(rate(gen_ai_client_requests_total[5m])) or vector(0)",
20
+ "refId": "A"
21
+ }
22
+ ],
23
+ "fieldConfig": {
24
+ "defaults": {
25
+ "unit": "reqps",
26
+ "decimals": 2,
27
+ "thresholds": {
28
+ "steps": [
29
+ { "color": "green", "value": null },
30
+ { "color": "yellow", "value": 50 },
31
+ { "color": "red", "value": 100 }
32
+ ]
33
+ }
34
+ },
35
+ "overrides": []
36
+ }
37
+ },
38
+ {
39
+ "title": "LLM Avg Latency",
40
+ "description": "Average LLM call duration (client-side)",
41
+ "type": "stat",
42
+ "gridPos": { "h": 4, "w": 6, "x": 6, "y": 0 },
43
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
44
+ "targets": [
45
+ {
46
+ "expr": "sum(rate(gen_ai_client_operation_duration_sum[5m])) / sum(rate(gen_ai_client_operation_duration_count[5m])) or vector(0)",
47
+ "refId": "A"
48
+ }
49
+ ],
50
+ "fieldConfig": {
51
+ "defaults": {
52
+ "unit": "ms",
53
+ "decimals": 0,
54
+ "thresholds": {
55
+ "steps": [
56
+ { "color": "green", "value": null },
57
+ { "color": "yellow", "value": 1000 },
58
+ { "color": "red", "value": 5000 }
59
+ ]
60
+ }
61
+ },
62
+ "overrides": []
63
+ }
64
+ },
65
+ {
66
+ "title": "Tool Avg Latency",
67
+ "description": "Average MCP tool execution duration (server-side)",
68
+ "type": "stat",
69
+ "gridPos": { "h": 4, "w": 6, "x": 12, "y": 0 },
70
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
71
+ "targets": [
72
+ {
73
+ "expr": "sum(rate(gen_ai_mcp_tool_duration_sum[5m])) / sum(rate(gen_ai_mcp_tool_duration_count[5m])) or vector(0)",
74
+ "refId": "A"
75
+ }
76
+ ],
77
+ "fieldConfig": {
78
+ "defaults": {
79
+ "unit": "ms",
80
+ "decimals": 0,
81
+ "thresholds": {
82
+ "steps": [
83
+ { "color": "green", "value": null },
84
+ { "color": "yellow", "value": 500 },
85
+ { "color": "red", "value": 2000 }
86
+ ]
87
+ }
88
+ },
89
+ "overrides": []
90
+ }
91
+ },
92
+ {
93
+ "title": "End-to-End Error Rate",
94
+ "description": "Combined error rate across LLM + MCP",
95
+ "type": "stat",
96
+ "gridPos": { "h": 4, "w": 6, "x": 18, "y": 0 },
97
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
98
+ "targets": [
99
+ {
100
+ "expr": "(sum(rate(gen_ai_client_errors_total[5m])) + sum(rate(gen_ai_mcp_tool_errors_total[5m]))) / (sum(rate(gen_ai_client_requests_total[5m])) + sum(rate(gen_ai_mcp_tool_calls_total[5m]))) or vector(0)",
101
+ "refId": "A"
102
+ }
103
+ ],
104
+ "fieldConfig": {
105
+ "defaults": {
106
+ "unit": "percentunit",
107
+ "decimals": 2,
108
+ "thresholds": {
109
+ "steps": [
110
+ { "color": "green", "value": null },
111
+ { "color": "yellow", "value": 0.05 },
112
+ { "color": "red", "value": 0.1 }
113
+ ]
114
+ }
115
+ },
116
+ "overrides": []
117
+ }
118
+ },
119
+ {
120
+ "title": "Latency Breakdown: LLM vs Tool",
121
+ "description": "Compare LLM call latency vs MCP tool execution latency over time",
122
+ "type": "timeseries",
123
+ "gridPos": { "h": 8, "w": 12, "x": 0, "y": 4 },
124
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
125
+ "targets": [
126
+ {
127
+ "expr": "sum(rate(gen_ai_client_operation_duration_sum[5m])) / sum(rate(gen_ai_client_operation_duration_count[5m]))",
128
+ "legendFormat": "LLM Avg Latency",
129
+ "refId": "A"
130
+ },
131
+ {
132
+ "expr": "sum(rate(gen_ai_mcp_tool_duration_sum[5m])) / sum(rate(gen_ai_mcp_tool_duration_count[5m]))",
133
+ "legendFormat": "Tool Avg Latency",
134
+ "refId": "B"
135
+ }
136
+ ],
137
+ "fieldConfig": {
138
+ "defaults": {
139
+ "unit": "ms",
140
+ "custom": {
141
+ "drawStyle": "line",
142
+ "lineInterpolation": "smooth",
143
+ "fillOpacity": 20,
144
+ "pointSize": 5,
145
+ "showPoints": "auto"
146
+ }
147
+ },
148
+ "overrides": [
149
+ {
150
+ "matcher": { "id": "byName", "options": "LLM Avg Latency" },
151
+ "properties": [
152
+ {
153
+ "id": "color",
154
+ "value": { "fixedColor": "orange", "mode": "fixed" }
155
+ }
156
+ ]
157
+ },
158
+ {
159
+ "matcher": { "id": "byName", "options": "Tool Avg Latency" },
160
+ "properties": [
161
+ {
162
+ "id": "color",
163
+ "value": { "fixedColor": "blue", "mode": "fixed" }
164
+ }
165
+ ]
166
+ }
167
+ ]
168
+ },
169
+ "options": {
170
+ "legend": {
171
+ "displayMode": "table",
172
+ "placement": "bottom",
173
+ "calcs": ["mean", "max"]
174
+ },
175
+ "tooltip": { "mode": "multi" }
176
+ }
177
+ },
178
+ {
179
+ "title": "Tool Call Waterfall by Tool",
180
+ "description": "Duration per tool over time — identify slow tools",
181
+ "type": "timeseries",
182
+ "gridPos": { "h": 8, "w": 12, "x": 12, "y": 4 },
183
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
184
+ "targets": [
185
+ {
186
+ "expr": "sum by (gen_ai_tool_name) (rate(gen_ai_mcp_tool_duration_sum[5m])) / sum by (gen_ai_tool_name) (rate(gen_ai_mcp_tool_duration_count[5m]))",
187
+ "legendFormat": "{{gen_ai_tool_name}}",
188
+ "refId": "A"
189
+ }
190
+ ],
191
+ "fieldConfig": {
192
+ "defaults": {
193
+ "unit": "ms",
194
+ "custom": {
195
+ "drawStyle": "bars",
196
+ "fillOpacity": 60,
197
+ "stacking": { "mode": "normal" }
198
+ },
199
+ "color": { "mode": "palette-classic" }
200
+ },
201
+ "overrides": []
202
+ },
203
+ "options": {
204
+ "legend": {
205
+ "displayMode": "table",
206
+ "placement": "bottom",
207
+ "calcs": ["mean", "sum"]
208
+ },
209
+ "tooltip": { "mode": "multi" }
210
+ }
211
+ },
212
+ {
213
+ "title": "Error Propagation: LLM vs Tool",
214
+ "description": "Error rates split by LLM errors and MCP tool errors",
215
+ "type": "timeseries",
216
+ "gridPos": { "h": 8, "w": 12, "x": 0, "y": 12 },
217
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
218
+ "targets": [
219
+ {
220
+ "expr": "sum(rate(gen_ai_client_errors_total[5m]))",
221
+ "legendFormat": "LLM Errors",
222
+ "refId": "A"
223
+ },
224
+ {
225
+ "expr": "sum(rate(gen_ai_mcp_tool_errors_total[5m]))",
226
+ "legendFormat": "Tool Errors",
227
+ "refId": "B"
228
+ }
229
+ ],
230
+ "fieldConfig": {
231
+ "defaults": {
232
+ "unit": "reqps",
233
+ "custom": {
234
+ "drawStyle": "line",
235
+ "lineInterpolation": "smooth",
236
+ "fillOpacity": 30,
237
+ "pointSize": 5,
238
+ "showPoints": "auto"
239
+ }
240
+ },
241
+ "overrides": [
242
+ {
243
+ "matcher": { "id": "byName", "options": "LLM Errors" },
244
+ "properties": [
245
+ {
246
+ "id": "color",
247
+ "value": { "fixedColor": "red", "mode": "fixed" }
248
+ }
249
+ ]
250
+ },
251
+ {
252
+ "matcher": { "id": "byName", "options": "Tool Errors" },
253
+ "properties": [
254
+ {
255
+ "id": "color",
256
+ "value": { "fixedColor": "purple", "mode": "fixed" }
257
+ }
258
+ ]
259
+ }
260
+ ]
261
+ },
262
+ "options": {
263
+ "legend": {
264
+ "displayMode": "table",
265
+ "placement": "bottom",
266
+ "calcs": ["sum"]
267
+ },
268
+ "tooltip": { "mode": "multi" }
269
+ }
270
+ },
271
+ {
272
+ "title": "Cost: LLM Calls",
273
+ "description": "Total LLM cost over time — visible when tools call LLMs via sampling",
274
+ "type": "timeseries",
275
+ "gridPos": { "h": 8, "w": 12, "x": 12, "y": 12 },
276
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
277
+ "targets": [
278
+ {
279
+ "expr": "sum by (gen_ai_request_model) (rate(gen_ai_client_request_cost_USD_sum[5m]))",
280
+ "legendFormat": "{{gen_ai_request_model}}",
281
+ "refId": "A"
282
+ }
283
+ ],
284
+ "fieldConfig": {
285
+ "defaults": {
286
+ "unit": "currencyUSD",
287
+ "decimals": 6,
288
+ "custom": {
289
+ "drawStyle": "line",
290
+ "lineInterpolation": "smooth",
291
+ "fillOpacity": 15,
292
+ "pointSize": 5,
293
+ "showPoints": "auto"
294
+ },
295
+ "color": { "mode": "palette-classic" }
296
+ },
297
+ "overrides": []
298
+ },
299
+ "options": {
300
+ "legend": {
301
+ "displayMode": "table",
302
+ "placement": "bottom",
303
+ "calcs": ["sum"]
304
+ },
305
+ "tooltip": { "mode": "multi" }
306
+ }
307
+ }
308
+ ],
309
+ "schemaVersion": 39,
310
+ "tags": ["toad-eye", "mcp", "e2e", "distributed-tracing"],
311
+ "templating": {
312
+ "list": []
313
+ },
314
+ "time": {
315
+ "from": "now-1h",
316
+ "to": "now"
317
+ },
318
+ "timepicker": {},
319
+ "timezone": "browser",
320
+ "title": "MCP End-to-End",
321
+ "uid": "toad-eye-mcp-e2e",
322
+ "version": 1
323
+ }
@@ -506,25 +506,6 @@
506
506
  "tags": ["toad-eye", "mcp", "llm"],
507
507
  "templating": {
508
508
  "list": [
509
- {
510
- "name": "mcp_method",
511
- "label": "MCP Method",
512
- "type": "query",
513
- "datasource": {
514
- "type": "prometheus",
515
- "uid": "prometheus"
516
- },
517
- "query": "label_values(gen_ai_mcp_tool_calls_total, mcp_method_name)",
518
- "refresh": 2,
519
- "includeAll": true,
520
- "allValue": ".*",
521
- "current": {
522
- "text": "All",
523
- "value": "$__all"
524
- },
525
- "multi": true,
526
- "sort": 1
527
- },
528
509
  {
529
510
  "name": "tool_name",
530
511
  "label": "Tool",