Skip to content

Commit 1c57ab7

Browse files
committed
migrate span generator to use updated data type
1 parent 5691155 commit 1c57ab7

File tree

3 files changed

+17
-15
lines changed

3 files changed

+17
-15
lines changed

instrumentation-genai/opentelemetry-instrumentation-langchain-alpha/src/opentelemetry/instrumentation/langchain/__init__.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
"""
4343

4444
import json
45+
import os
4546
from typing import Collection
4647

4748
from wrapt import wrap_function_wrapper
@@ -98,10 +99,17 @@ def instrumentation_dependencies(self) -> Collection[str]:
9899
return _instruments
99100

100101
def _instrument(self, **kwargs):
102+
# Ensure metrics + events generator by default
103+
from opentelemetry.util.genai.environment_variables import OTEL_INSTRUMENTATION_GENAI_GENERATOR
104+
105+
if not os.environ.get(OTEL_INSTRUMENTATION_GENAI_GENERATOR):
106+
os.environ[OTEL_INSTRUMENTATION_GENAI_GENERATOR] = "span_metric_event"
101107
tracer_provider = kwargs.get("tracer_provider")
102-
# Create dedicated handler bound to provided tracer provider (ensures spans go to test exporter)
108+
meter_provider = kwargs.get("meter_provider")
109+
# Create dedicated handler bound to provided tracer and meter providers (ensures spans and metrics go to test exporters)
103110
self._telemetry_handler = TelemetryHandler(
104-
tracer_provider=tracer_provider
111+
tracer_provider=tracer_provider,
112+
meter_provider=meter_provider,
105113
)
106114

107115
def _build_input_messages(messages):

instrumentation-genai/opentelemetry-instrumentation-langchain-alpha/src/opentelemetry/instrumentation/langchain/callback_handler.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ def on_chat_model_start(
139139
input_messages=input_messages,
140140
attributes=attrs,
141141
)
142+
# no need for messages/chat_generations fields; generator uses input_messages and output_messages
142143
self._telemetry_handler.start_llm(inv)
143144
with self._lock:
144145
self._invocations[run_id] = inv
@@ -178,6 +179,7 @@ def on_llm_end(
178179
finish_reason=finish_reason,
179180
)
180181
]
182+
# no additional assignments needed; generator uses output_messages
181183
llm_output = getattr(response, "llm_output", None) or {}
182184
response_model = llm_output.get("model_name") or llm_output.get(
183185
"model"

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

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -121,18 +121,14 @@ def finish(self, invocation: LLMInvocation): # type: ignore[override]
121121
)
122122
invocation.span = span
123123

124-
# Normalize invocation collections for metrics helpers
125-
if not invocation.messages:
126-
invocation.messages = invocation.input_messages
127-
if not invocation.chat_generations:
128-
invocation.chat_generations = invocation.output_messages
124+
# Use input_messages and output_messages directly
129125

130126
# Update any new attributes added after start
131127
for k, v in invocation.attributes.items():
132128
span.set_attribute(k, v)
133129

134130
# Finish reasons & response / usage attrs
135-
finish_reasons = _collect_finish_reasons(invocation.chat_generations)
131+
finish_reasons = _collect_finish_reasons(invocation.output_messages)
136132
if finish_reasons:
137133
span.set_attribute(
138134
GenAI.GEN_AI_RESPONSE_FINISH_REASONS, finish_reasons
@@ -147,20 +143,16 @@ def finish(self, invocation: LLMInvocation): # type: ignore[override]
147143
)
148144

149145
# Emit per-choice generation events (gated by environment var)
150-
if (
151-
invocation.chat_generations
152-
and self._logger
153-
and os.getenv(_ENV_VAR)
154-
):
146+
if invocation.output_messages and self._logger and os.getenv(_ENV_VAR):
155147
try:
156148
_emit_chat_generation_logs(
157149
self._logger,
158-
invocation.chat_generations,
150+
invocation.output_messages,
159151
provider_name=invocation.provider,
160152
framework=invocation.attributes.get("framework"),
161153
capture_content=self._capture_content,
162154
)
163-
except Exception: # pragma: no cover
155+
except Exception:
164156
pass
165157

166158
# Record metrics (duration + tokens)

0 commit comments

Comments
 (0)