Skip to content

Commit b3cc03a

Browse files
committed
Allow overriding OpenAI agent name via environment variable
1 parent c032131 commit b3cc03a

File tree

3 files changed

+54
-6
lines changed

3 files changed

+54
-6
lines changed

instrumentation-genai/opentelemetry-instrumentation-openai-agents/src/opentelemetry/instrumentation/openai_agents/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from __future__ import annotations
1818

1919
import importlib
20+
import os
2021
from typing import TYPE_CHECKING, Any, Collection, Protocol
2122

2223
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
@@ -97,8 +98,15 @@ def _instrument(self, **kwargs) -> None:
9798
)
9899

99100
system = _resolve_system(kwargs.get("system"))
101+
agent_name_override = kwargs.get("agent_name") or os.getenv(
102+
"OTEL_GENAI_AGENT_NAME"
103+
)
100104

101-
processor = _OpenAIAgentsSpanProcessor(tracer=tracer, system=system)
105+
processor = _OpenAIAgentsSpanProcessor(
106+
tracer=tracer,
107+
system=system,
108+
agent_name_override=agent_name_override,
109+
)
102110

103111
tracing = _load_tracing_module()
104112
provider = tracing.get_trace_provider()

instrumentation-genai/opentelemetry-instrumentation-openai-agents/src/opentelemetry/instrumentation/openai_agents/span_processor.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,20 @@ class _SpanContext:
134134
class _OpenAIAgentsSpanProcessor(TracingProcessor):
135135
"""Convert OpenAI Agents traces into OpenTelemetry spans."""
136136

137-
def __init__(self, tracer: Tracer, system: str) -> None:
137+
def __init__(
138+
self,
139+
tracer: Tracer,
140+
system: str,
141+
agent_name_override: str | None = None,
142+
) -> None:
138143
self._tracer = tracer
139144
self._system = system
145+
self._agent_name_override = (
146+
agent_name_override.strip()
147+
if isinstance(agent_name_override, str)
148+
and agent_name_override.strip()
149+
else None
150+
)
140151
self._root_spans: dict[str, Span] = {}
141152
self._spans: dict[str, _SpanContext] = {}
142153
self._lock = RLock()
@@ -308,7 +319,7 @@ def _attributes_from_agent(self, span_data: Any) -> dict[str, Any]:
308319
GenAI.GenAiOperationNameValues.INVOKE_AGENT.value
309320
)
310321

311-
name = getattr(span_data, "name", None)
322+
name = self._agent_name_override or getattr(span_data, "name", None)
312323
if name:
313324
attributes[GenAI.GEN_AI_AGENT_NAME] = name
314325
output_type = getattr(span_data, "output_type", None)
@@ -325,7 +336,7 @@ def _attributes_from_agent_creation(
325336
GenAI.GenAiOperationNameValues.CREATE_AGENT.value
326337
)
327338

328-
name = getattr(span_data, "name", None)
339+
name = self._agent_name_override or getattr(span_data, "name", None)
329340
if name:
330341
attributes[GenAI.GEN_AI_AGENT_NAME] = name
331342
description = getattr(span_data, "description", None)

instrumentation-genai/opentelemetry-instrumentation-openai-agents/tests/test_tracer.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@
4545
from opentelemetry.trace import SpanKind # noqa: E402
4646

4747

48-
def _instrument_with_provider():
48+
def _instrument_with_provider(**instrument_kwargs):
4949
set_trace_processors([])
5050
provider = TracerProvider()
5151
exporter = InMemorySpanExporter()
5252
provider.add_span_processor(SimpleSpanProcessor(exporter))
5353

5454
instrumentor = OpenAIAgentsInstrumentor()
55-
instrumentor.instrument(tracer_provider=provider)
55+
instrumentor.instrument(tracer_provider=provider, **instrument_kwargs)
5656

5757
return instrumentor, exporter
5858

@@ -158,3 +158,32 @@ def test_agent_create_span_records_attributes():
158158
finally:
159159
instrumentor.uninstrument()
160160
exporter.clear()
161+
162+
163+
def test_agent_name_override_applied_to_agent_spans():
164+
instrumentor, exporter = _instrument_with_provider(
165+
agent_name="Travel Concierge"
166+
)
167+
168+
try:
169+
with trace("workflow"):
170+
with agent_span(operation="invoke", name="support_bot"):
171+
pass
172+
173+
spans = exporter.get_finished_spans()
174+
agent_span_record = next(
175+
span
176+
for span in spans
177+
if span.attributes[GenAI.GEN_AI_OPERATION_NAME]
178+
== GenAI.GenAiOperationNameValues.INVOKE_AGENT.value
179+
)
180+
181+
assert agent_span_record.kind is SpanKind.CLIENT
182+
assert agent_span_record.name == "invoke_agent Travel Concierge"
183+
assert (
184+
agent_span_record.attributes[GenAI.GEN_AI_AGENT_NAME]
185+
== "Travel Concierge"
186+
)
187+
finally:
188+
instrumentor.uninstrument()
189+
exporter.clear()

0 commit comments

Comments
 (0)