Skip to content

Commit 2f506a1

Browse files
Simplify telemetry ownership tracking
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 53c1126 commit 2f506a1

1 file changed

Lines changed: 20 additions & 24 deletions

File tree

python/packages/core/agent_framework/observability.py

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,11 @@
9494
logger = 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

110104
OTEL_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

19671963
def _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

19781974
def _get_response_attributes(

0 commit comments

Comments
 (0)