Record actual Responses endpoints in tracing spans (#40906)

## Why

Responses-compatible requests can use routes other than `/responses`, but their
tracing spans reported the default route regardless of the selected endpoint.

## What changed

- Populate `api.path` from the selected `ResponsesEndpoint` for HTTP and
  WebSocket requests.
- Retain the endpoint on WebSocket connections so stream-request spans report
  the same route as connection spans.

GitOrigin-RevId: 349eca94b27d4cc3a1adde8b257313506bdaf0f4
This commit is contained in:
jif
2026-08-26 15:31:30 +00:00
committed by copyberry
parent d4998d611a
commit bde9db1375
3 changed files with 14 additions and 7 deletions
+2 -2
View File
@@ -96,7 +96,7 @@ impl<T: HttpTransport> ResponsesClient<T> {
fields(
transport = "responses_http",
http.method = "POST",
api.path = "responses"
api.path = self.endpoint.path()
)
)]
pub async fn stream_request(
@@ -136,7 +136,7 @@ impl<T: HttpTransport> ResponsesClient<T> {
fields(
transport = "responses_http",
http.method = "POST",
api.path = "responses",
api.path = self.endpoint.path(),
turn.has_state = turn_state.is_some()
)
)]
@@ -182,6 +182,7 @@ struct ResponsesWebsocketTimingLogContext {
pub struct ResponsesWebsocketConnection {
stream: Arc<Mutex<Option<WsStream>>>,
endpoint: ResponsesEndpoint,
// TODO (pakrym): is this the right place for timeout?
idle_timeout: Duration,
server_reasoning_included: bool,
@@ -193,6 +194,7 @@ impl std::fmt::Debug for ResponsesWebsocketConnection {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ResponsesWebsocketConnection")
.field("stream", &"<ws-stream>")
.field("endpoint", &self.endpoint)
.field("idle_timeout", &self.idle_timeout)
.field("server_reasoning_included", &self.server_reasoning_included)
.field("server_model", &self.server_model)
@@ -208,9 +210,11 @@ impl ResponsesWebsocketConnection {
server_reasoning_included: bool,
server_model: Option<String>,
telemetry: Option<Arc<dyn WebsocketTelemetry>>,
endpoint: ResponsesEndpoint,
) -> Self {
Self {
stream: Arc::new(Mutex::new(Some(stream))),
endpoint,
idle_timeout,
server_reasoning_included,
server_model,
@@ -226,7 +230,7 @@ impl ResponsesWebsocketConnection {
name = "responses_websocket.stream_request",
level = "info",
skip_all,
fields(transport = "responses_websocket", api.path = "responses")
fields(transport = "responses_websocket", api.path = self.endpoint.path())
)]
pub async fn stream_request(
&self,
@@ -388,7 +392,7 @@ impl ResponsesWebsocketClient {
name = "responses_websocket.connect",
level = "info",
skip_all,
fields(transport = "responses_websocket", api.path = "responses")
fields(transport = "responses_websocket", api.path = self.endpoint.path())
)]
pub async fn connect(
&self,
@@ -415,6 +419,7 @@ impl ResponsesWebsocketClient {
server_reasoning_included,
server_model,
telemetry,
self.endpoint,
))
}