Skip to content

Commit 5cea4a6

Browse files
committed
remove overly complicated env check, add messages to test
1 parent fc0cde0 commit 5cea4a6

File tree

2 files changed

+39
-36
lines changed

2 files changed

+39
-36
lines changed

util/opentelemetry-util-genai/src/opentelemetry/util/genai/generators.py

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import json
3636
from contextlib import contextmanager
3737
from dataclasses import asdict, dataclass, field
38-
from enum import Enum
3938
from typing import Any, Dict, List, Optional, Tuple
4039
from uuid import UUID
4140

@@ -143,41 +142,22 @@ def _collect_finish_reasons(generations: List[OutputMessage]) -> List[str]:
143142
return finish_reasons
144143

145144

146-
class _CaptureTarget(Enum):
147-
SPAN = "span"
148-
EVENT = "event"
149-
150-
151-
def _should_capture_content(mode: _CaptureTarget) -> bool:
152-
# if GEN_AI stability mode is DEFAULT, do not capture message content
153-
if (
145+
def _is_experimental_mode() -> bool:
146+
return (
154147
_OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode(
155148
_OpenTelemetryStabilitySignalType.GEN_AI,
156149
)
157-
== _StabilityMode.DEFAULT
158-
):
159-
return False
160-
161-
capture_mode = get_content_capturing_mode()
162-
if mode == _CaptureTarget.SPAN:
163-
return capture_mode in (
164-
ContentCapturingMode.SPAN_ONLY,
165-
ContentCapturingMode.SPAN_AND_EVENT,
166-
)
167-
168-
if mode == _CaptureTarget.EVENT:
169-
return capture_mode in (
170-
ContentCapturingMode.EVENT_ONLY,
171-
ContentCapturingMode.SPAN_AND_EVENT,
172-
)
173-
174-
return False
150+
is _StabilityMode.GEN_AI_LATEST_EXPERIMENTAL
151+
)
175152

176153

177154
def _maybe_set_span_input_messages(
178155
span: Span, messages: List[InputMessage]
179156
) -> None:
180-
if not _should_capture_content(_CaptureTarget.SPAN):
157+
if not _is_experimental_mode() or get_content_capturing_mode() not in (
158+
ContentCapturingMode.SPAN_ONLY,
159+
ContentCapturingMode.SPAN_AND_EVENT,
160+
):
181161
return
182162
message_parts: List[Dict[str, Any]] = [
183163
asdict(message) for message in messages
@@ -189,7 +169,10 @@ def _maybe_set_span_input_messages(
189169
def _maybe_set_span_output_messages(
190170
span: Span, generations: List[OutputMessage]
191171
) -> None:
192-
if not _should_capture_content(_CaptureTarget.SPAN):
172+
if not _is_experimental_mode() or get_content_capturing_mode() not in (
173+
ContentCapturingMode.SPAN_ONLY,
174+
ContentCapturingMode.SPAN_AND_EVENT,
175+
):
193176
return
194177
generation_parts: List[Dict[str, Any]] = [
195178
asdict(generation) for generation in generations

util/opentelemetry-util-genai/tests/test_utils.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,20 +97,33 @@ def test_get_content_capturing_mode_raises_exception_on_invalid_envvar(
9797

9898

9999
class TestTelemetryHandler(unittest.TestCase):
100-
def setUp(self):
101-
self.span_exporter = InMemorySpanExporter()
100+
@classmethod
101+
def setUpClass(cls):
102+
cls.span_exporter = InMemorySpanExporter()
102103
tracer_provider = TracerProvider()
103104
tracer_provider.add_span_processor(
104-
SimpleSpanProcessor(self.span_exporter)
105+
SimpleSpanProcessor(cls.span_exporter)
105106
)
106-
trace.set_tracer_provider(tracer_provider)
107+
try:
108+
trace.set_tracer_provider(tracer_provider)
109+
except Exception: # pragma: no cover - defensive
110+
pass
111+
112+
def setUp(self):
113+
self.span_exporter = self.__class__.span_exporter
114+
self.span_exporter.clear()
107115
self.telemetry_handler = get_telemetry_handler()
108116

109117
def tearDown(self):
118+
# Clear spans and reset the singleton telemetry handler so each test starts clean
110119
self.span_exporter.clear()
111-
# Reset to default tracer provider
112-
trace.set_tracer_provider(trace.NoOpTracerProvider())
120+
if hasattr(get_telemetry_handler, "_default_handler"):
121+
delattr(get_telemetry_handler, "_default_handler")
113122

123+
@patch_env_vars(
124+
stability_mode="gen_ai_latest_experimental",
125+
content_capturing="SPAN_ONLY",
126+
)
114127
def test_llm_start_and_stop_creates_span(self): # pylint: disable=no-self-use
115128
run_id = uuid4()
116129
message = InputMessage(
@@ -147,4 +160,11 @@ def test_llm_start_and_stop_creates_span(self): # pylint: disable=no-self-use
147160
assert invocation.attributes.get("custom_attr") == "value"
148161
assert invocation.attributes.get("extra") == "info"
149162

150-
# TODO: check messages
163+
# Check messages captured on span
164+
input_messages_json = span_attrs.get("gen_ai.input.messages")
165+
output_messages_json = span_attrs.get("gen_ai.output.messages")
166+
assert input_messages_json is not None
167+
assert output_messages_json is not None
168+
169+
assert isinstance(input_messages_json, str)
170+
assert isinstance(output_messages_json, str)

0 commit comments

Comments
 (0)