9494logger = logging .getLogger ("agent_framework" )
9595
9696
97- class _InnerResponseTelemetryCaptureState :
98- """Tracks response telemetry already captured by an inner chat span."""
99-
100- def __init__ (self ) -> None :
101- self .response_id_captured = False
102- self .usage_captured = False
103-
104-
105- INNER_RESPONSE_TELEMETRY_CAPTURE_STATE : Final [contextvars .ContextVar [_InnerResponseTelemetryCaptureState | None ]] = (
106- contextvars .ContextVar ("inner_response_telemetry_capture_state" , default = None )
97+ INNER_RESPONSE_TELEMETRY_CAPTURED_FIELDS : Final [contextvars .ContextVar [set [str ] | None ]] = contextvars .ContextVar (
98+ "inner_response_telemetry_captured_fields" , default = None
10799)
100+ INNER_RESPONSE_ID_CAPTURED_FIELD : Final [str ] = "response_id"
101+ INNER_USAGE_CAPTURED_FIELD : Final [str ] = "usage"
108102
109103
110104OTEL_METRICS : Final [str ] = "__otel_metrics__"
@@ -1571,9 +1565,9 @@ def run(
15711565 ** merged_client_kwargs ,
15721566 )
15731567
1574- inner_response_telemetry_capture_state = _InnerResponseTelemetryCaptureState ()
1575- inner_response_telemetry_capture_state_token = INNER_RESPONSE_TELEMETRY_CAPTURE_STATE .set (
1576- inner_response_telemetry_capture_state
1568+ inner_response_telemetry_captured_fields : set [ str ] = set ()
1569+ inner_response_telemetry_captured_fields_token = INNER_RESPONSE_TELEMETRY_CAPTURED_FIELDS .set (
1570+ inner_response_telemetry_captured_fields
15771571 )
15781572
15791573 if stream :
@@ -1595,7 +1589,7 @@ def run(
15951589 else :
15961590 raise RuntimeError ("Streaming telemetry requires a ResponseStream result." )
15971591 except Exception :
1598- INNER_RESPONSE_TELEMETRY_CAPTURE_STATE .reset (inner_response_telemetry_capture_state_token )
1592+ INNER_RESPONSE_TELEMETRY_CAPTURED_FIELDS .reset (inner_response_telemetry_captured_fields_token )
15991593 raise
16001594
16011595 # Create span directly without trace.use_span() context attachment.
@@ -1636,8 +1630,9 @@ async def _finalize_stream() -> None:
16361630 response_attributes = _get_response_attributes (
16371631 attributes ,
16381632 response ,
1639- capture_response_id = not inner_response_telemetry_capture_state .response_id_captured ,
1640- capture_usage = not inner_response_telemetry_capture_state .usage_captured ,
1633+ capture_response_id = INNER_RESPONSE_ID_CAPTURED_FIELD
1634+ not in inner_response_telemetry_captured_fields ,
1635+ capture_usage = INNER_USAGE_CAPTURED_FIELD not in inner_response_telemetry_captured_fields ,
16411636 )
16421637 _capture_response (span = span , attributes = response_attributes , duration = duration )
16431638 if (
@@ -1654,7 +1649,7 @@ async def _finalize_stream() -> None:
16541649 except Exception as exception :
16551650 capture_exception (span = span , exception = exception , timestamp = time_ns ())
16561651 finally :
1657- INNER_RESPONSE_TELEMETRY_CAPTURE_STATE .reset (inner_response_telemetry_capture_state_token )
1652+ INNER_RESPONSE_TELEMETRY_CAPTURED_FIELDS .reset (inner_response_telemetry_captured_fields_token )
16581653 _close_span ()
16591654
16601655 # Register a weak reference callback to close the span if stream is garbage collected
@@ -1695,8 +1690,9 @@ async def _run() -> AgentResponse:
16951690 response_attributes = _get_response_attributes (
16961691 attributes ,
16971692 response ,
1698- capture_response_id = not inner_response_telemetry_capture_state .response_id_captured ,
1699- capture_usage = not inner_response_telemetry_capture_state .usage_captured ,
1693+ capture_response_id = INNER_RESPONSE_ID_CAPTURED_FIELD
1694+ not in inner_response_telemetry_captured_fields ,
1695+ capture_usage = INNER_USAGE_CAPTURED_FIELD not in inner_response_telemetry_captured_fields ,
17001696 )
17011697 _capture_response (span = span , attributes = response_attributes , duration = duration )
17021698 if OBSERVABILITY_SETTINGS .SENSITIVE_DATA_ENABLED and response .messages :
@@ -1708,7 +1704,7 @@ async def _run() -> AgentResponse:
17081704 )
17091705 return response # type: ignore[return-value,no-any-return]
17101706 finally :
1711- INNER_RESPONSE_TELEMETRY_CAPTURE_STATE .reset (inner_response_telemetry_capture_state_token )
1707+ INNER_RESPONSE_TELEMETRY_CAPTURED_FIELDS .reset (inner_response_telemetry_captured_fields_token )
17121708
17131709 return _run ()
17141710
@@ -1966,13 +1962,13 @@ def _to_otel_part(content: Content) -> dict[str, Any] | None:
19661962
19671963def _mark_inner_response_telemetry_captured (response : ChatResponse | AgentResponse ) -> None :
19681964 """Record when an inner chat telemetry span already captured response metadata."""
1969- capture_state = INNER_RESPONSE_TELEMETRY_CAPTURE_STATE .get ()
1970- if capture_state is None :
1965+ captured_fields = INNER_RESPONSE_TELEMETRY_CAPTURED_FIELDS .get ()
1966+ if captured_fields is None :
19711967 return
19721968 if response .response_id :
1973- capture_state . response_id_captured = True
1969+ captured_fields . add ( INNER_RESPONSE_ID_CAPTURED_FIELD )
19741970 if response .usage_details :
1975- capture_state . usage_captured = True
1971+ captured_fields . add ( INNER_USAGE_CAPTURED_FIELD )
19761972
19771973
19781974def _get_response_attributes (
0 commit comments