Skip to content

Commit 08df502

Browse files
gyliu513leseb
andauthored
feat: add parameter usage metrics for Responses API (ogx-ai#5255)
Fixed ogx-ai#5256 # What does this PR do? <!-- Provide a short summary of what this PR does and why. Link to relevant issues if applicable. --> <!-- If resolving an issue, uncomment and update the line below --> Add OpenTelemetry metrics to track which optional parameters callers explicitly provide in Responses API (`POST /v1/responses`) requests. This helps understand API usage patterns and prioritize OpenAI parity work. introduced new counter metric `llama_stack.responses.parameter_usage_total` with `operation` and `parameter` attributes For a request like: ```bash curl -X POST http://localhost:8321/v1/responses \ -H 'Content-Type: application/json' \ -d '{ "input": "What is Python?", "model": "ollama/llama3.2:3b-instruct-fp16", "temperature": 0.7, "stream": true, "tools": [], "instructions": "Be concise" }' ``` The following Prometheus metrics are emitted: ``` llama_stack_llama_stack_responses_parameter_usage_total{operation="create_response", parameter="temperature"} 1 llama_stack_llama_stack_responses_parameter_usage_total{operation="create_response", parameter="stream"} 1 llama_stack_llama_stack_responses_parameter_usage_total{operation="create_response", parameter="tools"} 1 llama_stack_llama_stack_responses_parameter_usage_total{operation="create_response", parameter="instructions"} 1 ``` ```console (llama-stack) gualiu@gualiu-mac llama-stack % curl -s 'http://localhost:9090/api/v1/query?query=llama_stack_llama_stack_responses_parameter_usage_total' | jq { "status": "success", "data": { "resultType": "vector", "result": [ { "metric": { "__name__": "llama_stack_llama_stack_responses_parameter_usage_total", "exported_job": "llama-stack-server", "instance": "otel-collector:9464", "job": "otel-collector", "operation": "create_response", "otel_scope_name": "llama_stack.responses", "otel_scope_version": "1.0.0", "parameter": "instructions" }, "value": [ 1774293626.183, "7" ] }, { "metric": { "__name__": "llama_stack_llama_stack_responses_parameter_usage_total", "exported_job": "llama-stack-server", "instance": "otel-collector:9464", "job": "otel-collector", "operation": "create_response", "otel_scope_name": "llama_stack.responses", "otel_scope_version": "1.0.0", "parameter": "stream" }, "value": [ 1774293626.183, "7" ] }, { "metric": { "__name__": "llama_stack_llama_stack_responses_parameter_usage_total", "exported_job": "llama-stack-server", "instance": "otel-collector:9464", "job": "otel-collector", "operation": "create_response", "otel_scope_name": "llama_stack.responses", "otel_scope_version": "1.0.0", "parameter": "temperature" }, "value": [ 1774293626.183, "4" ] }, { "metric": { "__name__": "llama_stack_llama_stack_responses_parameter_usage_total", "exported_job": "llama-stack-server", "instance": "otel-collector:9464", "job": "otel-collector", "operation": "create_response", "otel_scope_name": "llama_stack.responses", "otel_scope_version": "1.0.0", "parameter": "tools" }, "value": [ 1774293626.183, "4" ] } ] } } ``` Co-authored-by: Sébastien Han <seb@redhat.com>
1 parent ecded04 commit 08df502

5 files changed

Lines changed: 530 additions & 0 deletions

File tree

Lines changed: 384 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,384 @@
1+
{
2+
"annotations": {
3+
"list": [
4+
{
5+
"builtIn": 1,
6+
"datasource": {
7+
"type": "grafana",
8+
"uid": "-- Grafana --"
9+
},
10+
"enable": true,
11+
"hide": true,
12+
"iconColor": "rgba(0, 211, 255, 1)",
13+
"name": "Annotations & Alerts",
14+
"type": "dashboard"
15+
}
16+
]
17+
},
18+
"editable": true,
19+
"fiscalYearStartMonth": 0,
20+
"graphTooltip": 1,
21+
"id": null,
22+
"links": [],
23+
"liveNow": false,
24+
"panels": [
25+
{
26+
"collapsed": false,
27+
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 },
28+
"id": 100,
29+
"title": "Overview",
30+
"type": "row"
31+
},
32+
{
33+
"datasource": {
34+
"type": "prometheus",
35+
"uid": "prometheus"
36+
},
37+
"fieldConfig": {
38+
"defaults": {
39+
"color": { "mode": "thresholds" },
40+
"mappings": [],
41+
"thresholds": {
42+
"mode": "absolute",
43+
"steps": [
44+
{ "color": "green", "value": null }
45+
]
46+
},
47+
"unit": "short"
48+
},
49+
"overrides": []
50+
},
51+
"gridPos": { "h": 4, "w": 8, "x": 0, "y": 1 },
52+
"id": 1,
53+
"options": {
54+
"colorMode": "value",
55+
"graphMode": "area",
56+
"justifyMode": "auto",
57+
"orientation": "auto",
58+
"reduceOptions": {
59+
"calcs": ["lastNotNull"],
60+
"fields": "",
61+
"values": false
62+
},
63+
"textMode": "auto"
64+
},
65+
"targets": [
66+
{
67+
"datasource": { "type": "prometheus", "uid": "prometheus" },
68+
"editorMode": "code",
69+
"expr": "sum(llama_stack_llama_stack_responses_parameter_usage_total)",
70+
"legendFormat": "__auto",
71+
"range": true,
72+
"refId": "A"
73+
}
74+
],
75+
"title": "Total Parameter Usage Events",
76+
"type": "stat"
77+
},
78+
{
79+
"datasource": {
80+
"type": "prometheus",
81+
"uid": "prometheus"
82+
},
83+
"fieldConfig": {
84+
"defaults": {
85+
"color": { "mode": "thresholds" },
86+
"mappings": [],
87+
"thresholds": {
88+
"mode": "absolute",
89+
"steps": [
90+
{ "color": "green", "value": null }
91+
]
92+
},
93+
"unit": "short"
94+
},
95+
"overrides": []
96+
},
97+
"gridPos": { "h": 4, "w": 8, "x": 8, "y": 1 },
98+
"id": 2,
99+
"options": {
100+
"colorMode": "value",
101+
"graphMode": "none",
102+
"justifyMode": "auto",
103+
"orientation": "auto",
104+
"reduceOptions": {
105+
"calcs": ["lastNotNull"],
106+
"fields": "",
107+
"values": false
108+
},
109+
"textMode": "auto"
110+
},
111+
"pluginVersion": "10.2.3",
112+
"targets": [
113+
{
114+
"datasource": { "type": "prometheus", "uid": "prometheus" },
115+
"editorMode": "code",
116+
"expr": "count(count by (parameter) (llama_stack_llama_stack_responses_parameter_usage_total))",
117+
"legendFormat": "__auto",
118+
"range": true,
119+
"refId": "A"
120+
}
121+
],
122+
"title": "Distinct Parameters Used",
123+
"type": "stat"
124+
},
125+
{
126+
"datasource": {
127+
"type": "prometheus",
128+
"uid": "prometheus"
129+
},
130+
"fieldConfig": {
131+
"defaults": {
132+
"color": { "mode": "thresholds" },
133+
"mappings": [],
134+
"thresholds": {
135+
"mode": "absolute",
136+
"steps": [
137+
{ "color": "green", "value": null }
138+
]
139+
},
140+
"unit": "short"
141+
},
142+
"overrides": []
143+
},
144+
"gridPos": { "h": 4, "w": 8, "x": 16, "y": 1 },
145+
"id": 3,
146+
"options": {
147+
"colorMode": "value",
148+
"graphMode": "area",
149+
"justifyMode": "auto",
150+
"orientation": "auto",
151+
"reduceOptions": {
152+
"calcs": ["lastNotNull"],
153+
"fields": "",
154+
"values": false
155+
},
156+
"textMode": "auto"
157+
},
158+
"targets": [
159+
{
160+
"datasource": { "type": "prometheus", "uid": "prometheus" },
161+
"editorMode": "code",
162+
"expr": "sum(llama_stack_llama_stack_responses_parameter_usage_total{parameter=\"stream\"})",
163+
"legendFormat": "__auto",
164+
"range": true,
165+
"refId": "A"
166+
}
167+
],
168+
"title": "Streaming Requests",
169+
"type": "stat"
170+
},
171+
{
172+
"collapsed": false,
173+
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 },
174+
"id": 101,
175+
"title": "Parameter Usage Distribution",
176+
"type": "row"
177+
},
178+
{
179+
"datasource": {
180+
"type": "prometheus",
181+
"uid": "prometheus"
182+
},
183+
"fieldConfig": {
184+
"defaults": {
185+
"color": { "mode": "palette-classic" },
186+
"custom": {
187+
"hideFrom": { "tooltip": false, "viz": false, "legend": false }
188+
},
189+
"mappings": []
190+
},
191+
"overrides": []
192+
},
193+
"gridPos": { "h": 10, "w": 12, "x": 0, "y": 6 },
194+
"id": 4,
195+
"options": {
196+
"displayLabels": ["name", "percent"],
197+
"legend": {
198+
"displayMode": "table",
199+
"placement": "right",
200+
"showLegend": true,
201+
"values": ["value", "percent"]
202+
},
203+
"pieType": "donut",
204+
"reduceOptions": {
205+
"calcs": ["lastNotNull"],
206+
"fields": "",
207+
"values": false
208+
},
209+
"tooltip": { "mode": "single", "sort": "none" }
210+
},
211+
"targets": [
212+
{
213+
"datasource": { "type": "prometheus", "uid": "prometheus" },
214+
"editorMode": "code",
215+
"expr": "sum by (parameter) (llama_stack_llama_stack_responses_parameter_usage_total)",
216+
"legendFormat": "{{parameter}}",
217+
"range": true,
218+
"refId": "A"
219+
}
220+
],
221+
"title": "Parameter Usage Distribution",
222+
"type": "piechart"
223+
},
224+
{
225+
"datasource": {
226+
"type": "prometheus",
227+
"uid": "prometheus"
228+
},
229+
"fieldConfig": {
230+
"defaults": {
231+
"color": { "mode": "palette-classic" },
232+
"custom": {
233+
"axisCenteredZero": false,
234+
"axisColorMode": "text",
235+
"axisLabel": "",
236+
"axisPlacement": "auto",
237+
"barAlignment": 0,
238+
"drawStyle": "bars",
239+
"fillOpacity": 80,
240+
"gradientMode": "none",
241+
"hideFrom": { "tooltip": false, "viz": false, "legend": false },
242+
"lineInterpolation": "linear",
243+
"lineWidth": 1,
244+
"pointSize": 5,
245+
"scaleDistribution": { "type": "linear" },
246+
"showPoints": "never",
247+
"spanNulls": false,
248+
"stacking": { "group": "A", "mode": "normal" },
249+
"thresholdsStyle": { "mode": "off" }
250+
},
251+
"mappings": [],
252+
"thresholds": {
253+
"mode": "absolute",
254+
"steps": [{ "color": "green", "value": null }]
255+
},
256+
"unit": "reqps"
257+
},
258+
"overrides": []
259+
},
260+
"gridPos": { "h": 10, "w": 12, "x": 12, "y": 6 },
261+
"id": 5,
262+
"options": {
263+
"legend": {
264+
"calcs": ["last"],
265+
"displayMode": "table",
266+
"placement": "bottom",
267+
"showLegend": true
268+
},
269+
"tooltip": { "mode": "multi", "sort": "desc" }
270+
},
271+
"targets": [
272+
{
273+
"datasource": { "type": "prometheus", "uid": "prometheus" },
274+
"editorMode": "code",
275+
"expr": "sum by (operation, parameter) (rate(llama_stack_llama_stack_responses_parameter_usage_total[5m]))",
276+
"legendFormat": "{{operation}}/{{parameter}}",
277+
"range": true,
278+
"refId": "A"
279+
}
280+
],
281+
"title": "Parameter Usage Rate (per second)",
282+
"type": "timeseries"
283+
},
284+
{
285+
"collapsed": false,
286+
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 16 },
287+
"id": 102,
288+
"title": "Details",
289+
"type": "row"
290+
},
291+
{
292+
"datasource": {
293+
"type": "prometheus",
294+
"uid": "prometheus"
295+
},
296+
"fieldConfig": {
297+
"defaults": {
298+
"color": { "mode": "thresholds" },
299+
"custom": {
300+
"align": "auto",
301+
"cellOptions": { "type": "auto" },
302+
"inspect": false
303+
},
304+
"mappings": [],
305+
"thresholds": {
306+
"mode": "absolute",
307+
"steps": [{ "color": "green", "value": null }]
308+
}
309+
},
310+
"overrides": [
311+
{
312+
"matcher": { "id": "byName", "options": "Value" },
313+
"properties": [{ "id": "displayName", "value": "Count" }]
314+
}
315+
]
316+
},
317+
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 17 },
318+
"id": 6,
319+
"options": {
320+
"cellHeight": "sm",
321+
"footer": {
322+
"countRows": false,
323+
"fields": "",
324+
"reducer": ["sum"],
325+
"show": false
326+
},
327+
"showHeader": true,
328+
"sortBy": [
329+
{ "desc": true, "displayName": "Count" }
330+
]
331+
},
332+
"pluginVersion": "10.2.3",
333+
"targets": [
334+
{
335+
"datasource": { "type": "prometheus", "uid": "prometheus" },
336+
"editorMode": "code",
337+
"exemplar": false,
338+
"expr": "sum by (operation, parameter) (llama_stack_llama_stack_responses_parameter_usage_total)",
339+
"format": "table",
340+
"instant": true,
341+
"legendFormat": "__auto",
342+
"range": false,
343+
"refId": "A"
344+
}
345+
],
346+
"title": "Parameter Usage Counts",
347+
"transformations": [
348+
{
349+
"id": "organize",
350+
"options": {
351+
"excludeByName": { "Time": true },
352+
"indexByName": {},
353+
"renameByName": {
354+
"operation": "Operation",
355+
"parameter": "Parameter"
356+
}
357+
}
358+
}
359+
],
360+
"type": "table"
361+
}
362+
],
363+
"refresh": "5s",
364+
"schemaVersion": 38,
365+
"style": "dark",
366+
"tags": [
367+
"llama-stack",
368+
"metrics",
369+
"responses"
370+
],
371+
"templating": {
372+
"list": []
373+
},
374+
"time": {
375+
"from": "now-15m",
376+
"to": "now"
377+
},
378+
"timepicker": {},
379+
"timezone": "",
380+
"title": "Llama Stack - Responses API Parameter Usage",
381+
"uid": "llama-stack-responses-metrics",
382+
"version": 0,
383+
"weekStart": ""
384+
}

scripts/telemetry/setup_telemetry.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ $CONTAINER_RUNTIME run -d --name grafana \
140140
-v "$SCRIPT_DIR/llama-stack-tool-runtime-metrics.json:/etc/grafana/provisioning/dashboards/llama-stack-tool-runtime-metrics.json:Z" \
141141
-v "$SCRIPT_DIR/llama-stack-vector-io-metrics.json:/etc/grafana/provisioning/dashboards/llama-stack-vector-io-metrics.json:Z" \
142142
-v "$SCRIPT_DIR/llama-stack-request-metrics.json:/etc/grafana/provisioning/dashboards/llama-stack-request-metrics.json:Z" \
143+
-v "$SCRIPT_DIR/llama-stack-responses-metrics.json:/etc/grafana/provisioning/dashboards/llama-stack-responses-metrics.json:Z" \
143144
docker.io/grafana/grafana:11.0.0
144145

145146
# Wait for services to start

0 commit comments

Comments
 (0)