Skip to content

Commit 4acdc2b

Browse files
committed
Provide default agent configuration values
1 parent 80f64b7 commit 4acdc2b

File tree

3 files changed

+80
-105
lines changed

3 files changed

+80
-105
lines changed

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

Lines changed: 12 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,6 @@
4444
_CAPTURE_METRICS_ENV = "OTEL_INSTRUMENTATION_OPENAI_AGENTS_CAPTURE_METRICS"
4545

4646

47-
_AGENT_NAME_ENV = "OTEL_INSTRUMENTATION_OPENAI_AGENTS_AGENT_NAME"
48-
_AGENT_ID_ENV = "OTEL_INSTRUMENTATION_OPENAI_AGENTS_AGENT_ID"
49-
_AGENT_DESCRIPTION_ENV = "OTEL_INSTRUMENTATION_OPENAI_AGENTS_AGENT_DESCRIPTION"
50-
_BASE_URL_ENV = "OTEL_INSTRUMENTATION_OPENAI_AGENTS_BASE_URL"
51-
_SERVER_ADDRESS_ENV = "OTEL_INSTRUMENTATION_OPENAI_AGENTS_SERVER_ADDRESS"
52-
_SERVER_PORT_ENV = "OTEL_INSTRUMENTATION_OPENAI_AGENTS_SERVER_PORT"
53-
54-
5547
def _load_tracing_module(): # pragma: no cover - exercised via tests
5648
return importlib.import_module("agents.tracing")
5749

@@ -129,39 +121,6 @@ def _resolve_bool(value: Any, default: bool) -> bool:
129121
return default
130122

131123

132-
def _resolve_optional_str(value: Any, env_name: str) -> str | None:
133-
if isinstance(value, str):
134-
candidate = value.strip()
135-
if candidate:
136-
return candidate
137-
elif value is not None:
138-
candidate = str(value).strip()
139-
if candidate:
140-
return candidate
141-
env_val = os.getenv(env_name)
142-
if env_val and env_val.strip():
143-
return env_val.strip()
144-
return None
145-
146-
147-
def _resolve_optional_int(value: Any, env_name: str) -> int | None:
148-
if value is not None:
149-
try:
150-
return int(value)
151-
except (TypeError, ValueError):
152-
logger.debug(
153-
"Invalid integer override for %s: %r", env_name, value
154-
)
155-
return None
156-
env_val = os.getenv(env_name)
157-
if env_val and env_val.strip():
158-
try:
159-
return int(env_val)
160-
except ValueError:
161-
logger.debug("Invalid integer from env %s: %r", env_name, env_val)
162-
return None
163-
164-
165124
class OpenAIAgentsInstrumentor(BaseInstrumentor):
166125
"""Instrumentation that bridges OpenAI Agents tracing to OpenTelemetry."""
167126

@@ -198,20 +157,12 @@ def _instrument(self, **kwargs) -> None:
198157
metrics_override = os.getenv(_CAPTURE_METRICS_ENV)
199158
metrics_enabled = _resolve_bool(metrics_override, default=True)
200159

201-
agent_name = _resolve_optional_str(
202-
kwargs.get("agent_name"), _AGENT_NAME_ENV
203-
)
204-
agent_id = _resolve_optional_str(kwargs.get("agent_id"), _AGENT_ID_ENV)
205-
agent_description = _resolve_optional_str(
206-
kwargs.get("agent_description"), _AGENT_DESCRIPTION_ENV
207-
)
208-
base_url = _resolve_optional_str(kwargs.get("base_url"), _BASE_URL_ENV)
209-
server_address = _resolve_optional_str(
210-
kwargs.get("server_address"), _SERVER_ADDRESS_ENV
211-
)
212-
server_port = _resolve_optional_int(
213-
kwargs.get("server_port"), _SERVER_PORT_ENV
214-
)
160+
agent_name = kwargs.get("agent_name")
161+
agent_id = kwargs.get("agent_id")
162+
agent_description = kwargs.get("agent_description")
163+
base_url = kwargs.get("base_url")
164+
server_address = kwargs.get("server_address")
165+
server_port = kwargs.get("server_port")
215166

216167
processor = GenAISemanticProcessor(
217168
tracer=tracer,
@@ -226,6 +177,12 @@ def _instrument(self, **kwargs) -> None:
226177
base_url=base_url,
227178
server_address=server_address,
228179
server_port=server_port,
180+
agent_name_default="OpenAI Agent",
181+
agent_id_default="agent",
182+
agent_description_default="OpenAI Agents instrumentation",
183+
base_url_default="https://api.openai.com",
184+
server_address_default="api.openai.com",
185+
server_port_default=443,
229186
)
230187

231188
tracing = _load_tracing_module()

instrumentation-genai/opentelemetry-instrumentation-openai-agents-v2/src/opentelemetry/instrumentation/openai_agents/genai_semantic_processor.py

Lines changed: 58 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,12 @@ def __init__(
270270
server_address: Optional[str] = None,
271271
server_port: Optional[int] = None,
272272
metrics_enabled: bool = True,
273+
agent_name_default: Optional[str] = None,
274+
agent_id_default: Optional[str] = None,
275+
agent_description_default: Optional[str] = None,
276+
base_url_default: Optional[str] = None,
277+
server_address_default: Optional[str] = None,
278+
server_port_default: Optional[int] = None,
273279
):
274280
"""Initialize processor with metrics support.
275281
@@ -291,22 +297,31 @@ def __init__(
291297
self.include_sensitive_data = include_sensitive_data and (
292298
content_mode.capture_in_span or content_mode.capture_in_event
293299
)
294-
self.base_url = base_url
300+
effective_base_url = base_url or base_url_default
301+
self.base_url = effective_base_url
295302
# Legacy emission removed; parameter retained for compatibility but unused
296303
self.emit_legacy = False
297304

298305
# Agent information - prefer explicit overrides; otherwise defer to span data
299306
self.agent_name = agent_name
300307
self.agent_id = agent_id
301308
self.agent_description = agent_description
309+
self._agent_name_default = agent_name_default
310+
self._agent_id_default = agent_id_default
311+
self._agent_description_default = agent_description_default
302312

303313
# Server information - use init parameters, then base_url inference
304-
self.server_address = server_address
305-
self.server_port = server_port
314+
self.server_address = server_address or server_address_default
315+
resolved_port = (
316+
server_port if server_port is not None else server_port_default
317+
)
318+
self.server_port = resolved_port
306319

307320
# If server info not provided, try to extract from base_url
308-
if (not self.server_address or not self.server_port) and base_url:
309-
server_attrs = _infer_server_attributes(base_url)
321+
if (
322+
not self.server_address or not self.server_port
323+
) and effective_base_url:
324+
server_attrs = _infer_server_attributes(effective_base_url)
310325
if not self.server_address:
311326
self.server_address = server_attrs.get("server.address")
312327
if not self.server_port:
@@ -1139,6 +1154,8 @@ def on_span_start(self, span: Span[Any]) -> None:
11391154
agent_name = self.agent_name
11401155
if not agent_name and _is_instance_of(span.span_data, AgentSpanData):
11411156
agent_name = getattr(span.span_data, "name", None)
1157+
if not agent_name:
1158+
agent_name = self._agent_name_default
11421159

11431160
tool_name = (
11441161
getattr(span.span_data, "name", None)
@@ -1157,12 +1174,17 @@ def on_span_start(self, span: Span[Any]) -> None:
11571174
# Legacy emission removed
11581175

11591176
# Add configured agent and server attributes
1160-
if self.agent_name:
1161-
attributes[GEN_AI_AGENT_NAME] = self.agent_name
1162-
if self.agent_id:
1163-
attributes[GEN_AI_AGENT_ID] = self.agent_id
1164-
if self.agent_description:
1165-
attributes[GEN_AI_AGENT_DESCRIPTION] = self.agent_description
1177+
agent_name_override = self.agent_name or self._agent_name_default
1178+
agent_id_override = self.agent_id or self._agent_id_default
1179+
agent_desc_override = (
1180+
self.agent_description or self._agent_description_default
1181+
)
1182+
if agent_name_override:
1183+
attributes[GEN_AI_AGENT_NAME] = agent_name_override
1184+
if agent_id_override:
1185+
attributes[GEN_AI_AGENT_ID] = agent_id_override
1186+
if agent_desc_override:
1187+
attributes[GEN_AI_AGENT_DESCRIPTION] = agent_desc_override
11661188
attributes.update(self._get_server_attributes())
11671189

11681190
otel_span = self._tracer.start_span(
@@ -1328,12 +1350,17 @@ def _extract_genai_attributes(
13281350
# Legacy emission removed
13291351

13301352
# Add configured agent attributes (always include when set)
1331-
if self.agent_name:
1332-
yield GEN_AI_AGENT_NAME, self.agent_name
1333-
if self.agent_id:
1334-
yield GEN_AI_AGENT_ID, self.agent_id
1335-
if self.agent_description:
1336-
yield GEN_AI_AGENT_DESCRIPTION, self.agent_description
1353+
agent_name_override = self.agent_name or self._agent_name_default
1354+
agent_id_override = self.agent_id or self._agent_id_default
1355+
agent_desc_override = (
1356+
self.agent_description or self._agent_description_default
1357+
)
1358+
if agent_name_override:
1359+
yield GEN_AI_AGENT_NAME, agent_name_override
1360+
if agent_id_override:
1361+
yield GEN_AI_AGENT_ID, agent_id_override
1362+
if agent_desc_override:
1363+
yield GEN_AI_AGENT_DESCRIPTION, agent_desc_override
13371364

13381365
# Server attributes
13391366
for key, value in self._get_server_attributes().items():
@@ -1493,16 +1520,26 @@ def _get_attributes_from_agent_span_data(
14931520
"""Extract attributes from agent span."""
14941521
yield GEN_AI_OPERATION_NAME, self._get_operation_name(span_data)
14951522

1496-
name = self.agent_name or getattr(span_data, "name", None)
1523+
name = (
1524+
self.agent_name
1525+
or getattr(span_data, "name", None)
1526+
or self._agent_name_default
1527+
)
14971528
if name:
14981529
yield GEN_AI_AGENT_NAME, name
14991530

1500-
agent_id = self.agent_id or getattr(span_data, "agent_id", None)
1531+
agent_id = (
1532+
self.agent_id
1533+
or getattr(span_data, "agent_id", None)
1534+
or self._agent_id_default
1535+
)
15011536
if agent_id:
15021537
yield GEN_AI_AGENT_ID, agent_id
15031538

1504-
description = self.agent_description or getattr(
1505-
span_data, "description", None
1539+
description = (
1540+
self.agent_description
1541+
or getattr(span_data, "description", None)
1542+
or self._agent_description_default
15061543
)
15071544
if description:
15081545
yield GEN_AI_AGENT_DESCRIPTION, description

instrumentation-genai/opentelemetry-instrumentation-openai-agents-v2/tests/test_z_instrumentor_behaviors.py

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -44,43 +44,24 @@ def test_instrumentation_dependencies_exposed():
4444
assert instrumentor.instrumentation_dependencies() == _instruments
4545

4646

47-
def test_env_fallback_configuration(monkeypatch):
47+
def test_default_agent_configuration():
4848
set_trace_processors([])
4949
provider = TracerProvider()
5050
instrumentor = OpenAIAgentsInstrumentor()
5151

52-
monkeypatch.setenv(
53-
"OTEL_INSTRUMENTATION_OPENAI_AGENTS_AGENT_NAME", "EnvAgent"
54-
)
55-
monkeypatch.setenv(
56-
"OTEL_INSTRUMENTATION_OPENAI_AGENTS_AGENT_ID", "agent-env"
57-
)
58-
monkeypatch.setenv(
59-
"OTEL_INSTRUMENTATION_OPENAI_AGENTS_AGENT_DESCRIPTION",
60-
"Env provided description",
61-
)
62-
monkeypatch.setenv(
63-
"OTEL_INSTRUMENTATION_OPENAI_AGENTS_BASE_URL",
64-
"https://env.example.com",
65-
)
66-
monkeypatch.setenv(
67-
"OTEL_INSTRUMENTATION_OPENAI_AGENTS_SERVER_ADDRESS", "env.example.com"
68-
)
69-
monkeypatch.setenv(
70-
"OTEL_INSTRUMENTATION_OPENAI_AGENTS_SERVER_PORT",
71-
"8080",
72-
)
73-
7452
try:
7553
instrumentor.instrument(tracer_provider=provider)
7654
processor = instrumentor._processor
7755
assert processor is not None
78-
assert processor.agent_name == "EnvAgent"
79-
assert processor.agent_id == "agent-env"
80-
assert processor.agent_description == "Env provided description"
81-
assert processor.base_url == "https://env.example.com"
82-
assert processor.server_address == "env.example.com"
83-
assert processor.server_port == 8080
56+
assert getattr(processor, "_agent_name_default") == "OpenAI Agent"
57+
assert getattr(processor, "_agent_id_default") == "agent"
58+
assert (
59+
getattr(processor, "_agent_description_default")
60+
== "OpenAI Agents instrumentation"
61+
)
62+
assert processor.base_url == "https://api.openai.com"
63+
assert processor.server_address == "api.openai.com"
64+
assert processor.server_port == 443
8465
finally:
8566
instrumentor.uninstrument()
8667
set_trace_processors([])

0 commit comments

Comments
 (0)