vllm-project / vllm-project/agentic-api
feat: request and execution traces across HTTP, WebSocket, and executor stages (#279 phase 2)
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 284
- Forks
- 74
- Avg merge
- 1d 17h
- Merged PRs (30d)
- 93
Description
Problem statement / motivation
Parent: #279 (phase 2). Depends on phase 1 foundation #338.
Make one request followable end-to-end: extract incoming W3C context, hang every executor stage under a single execution span, inject the active context into upstream inference requests, keep streaming spans alive until body completion or disconnect, and record typed execution and delivery outcomes so that HTTP 200 never implies success.
Proposed solution
WIP
Acceptance criteria
- Valid inbound
traceparent→http.server.requestis its child and the mock upstream receives atraceparentwhose parent is the gateway'shttp.client.request; invalid/absent → new root, no error. - A two-round streaming cassette shows
rehydrate, twoinference_round(each with anhttp.client.requestchild),tool.execute(boundedagentic.tool.type),compactionwhen triggered, andpersistunder oneagentic.execute. - Proxy and executor routes, HTTP and WebSocket transports, Responses and Messages APIs produce the same span shape.
- Streaming spans close after the last chunk on success, upstream failure (
error.typebounded), shutdown cancel, and mid-body client drop (delivery=disconnected,execution=cancelled). - Three
response.createmessages on one socket → three distinct execution spans linked to one session span; a pipelined message records non-zero queue wait. - SSE
errorunder HTTP 200 →execution.outcome=failed,otel.status_code=ERROR. - Attribute scanner: no input/output text, tool arguments,
Authorization/x-api-key, raw URLs with query, or upstream error bodies in any exported attribute. - Existing cassette, relay-ordering, and WebSocket tests pass unchanged; no new unbounded channel.
Alternatives considered
Non-goals
Metrics and histogram definitions (phase 3); sampling changes; OTLP logs; refactoring run_stream's channel (#244 owns it); capturing payloads even behind a flag.
Additional context
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Read phase 1 foundation issue #338 and trace the existing run_stream path; first run the cassette, relay-ordering, and WebSocket tests mentioned here. Map the proxy and executor routes plus HTTP and WebSocket transports before changing anything. Done means the listed span shapes, typed outcomes, streaming-close cases, attribute restrictions, and unchanged existing tests all pass.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- api, distributed-systems, observability, testing-qa
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Needs clarification
- Newbie friendliness
- 20/100