Skip to content

Commit 117c08d

Browse files
author
Nagkumar Arkalgud
committed
Update to include content optionally
1 parent ede7f2a commit 117c08d

File tree

1 file changed

+80
-9
lines changed
  • instrumentation-genai/opentelemetry-instrumentation-openai-agents/src/opentelemetry/instrumentation/openai_agents

1 file changed

+80
-9
lines changed

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

Lines changed: 80 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,11 @@ def __init__(
202202
include_sensitive_data: bool = True,
203203
base_url: Optional[str] = None,
204204
emit_legacy: bool = True,
205+
agent_name: Optional[str] = None,
206+
agent_id: Optional[str] = None,
207+
agent_description: Optional[str] = None,
208+
server_address: Optional[str] = None,
209+
server_port: Optional[int] = None,
205210
):
206211
"""Initialize processor with metrics support.
207212
@@ -212,13 +217,42 @@ def __init__(
212217
include_sensitive_data: Include model/tool IO when True
213218
base_url: API endpoint for server.address/port
214219
emit_legacy: Also emit deprecated attribute names
220+
agent_name: Name of the agent (can be overridden by env var)
221+
agent_id: ID of the agent (can be overridden by env var)
222+
agent_description: Description of the agent (can be overridden by env var)
223+
server_address: Server address (can be overridden by env var or base_url)
224+
server_port: Server port (can be overridden by env var or base_url)
215225
"""
216226
self._tracer = tracer
217227
self._event_logger = event_logger
218228
self.system_name = normalize_provider(system_name) or system_name
219229
self.include_sensitive_data = include_sensitive_data
220230
self.base_url = base_url
221231
self.emit_legacy = emit_legacy
232+
233+
# Agent information - prefer environment variables, then init parameters
234+
self.agent_name = os.getenv("OTEL_GENAI_AGENT_NAME", agent_name)
235+
self.agent_id = os.getenv("OTEL_GENAI_AGENT_ID", agent_id)
236+
self.agent_description = os.getenv("OTEL_GENAI_AGENT_DESCRIPTION", agent_description)
237+
238+
# Server information - prefer environment variables, then init parameters, then base_url
239+
self.server_address = os.getenv("OTEL_GENAI_SERVER_ADDRESS", server_address)
240+
self.server_port = os.getenv("OTEL_GENAI_SERVER_PORT")
241+
if self.server_port:
242+
try:
243+
self.server_port = int(self.server_port)
244+
except ValueError:
245+
self.server_port = None
246+
else:
247+
self.server_port = server_port
248+
249+
# If server info not provided, try to extract from base_url
250+
if (not self.server_address or not self.server_port) and base_url:
251+
server_attrs = _infer_server_attributes(base_url)
252+
if not self.server_address:
253+
self.server_address = server_attrs.get("server.address")
254+
if not self.server_port:
255+
self.server_port = server_attrs.get("server.port")
222256

223257
# Span tracking
224258
self._root_spans: dict[str, OtelSpan] = {}
@@ -246,6 +280,15 @@ def __init__(
246280
if self._metrics_enabled:
247281
self._init_metrics()
248282

283+
def _get_server_attributes(self) -> dict[str, Any]:
284+
"""Get server attributes from configured values."""
285+
attrs = {}
286+
if self.server_address:
287+
attrs["server.address"] = self.server_address
288+
if self.server_port:
289+
attrs["server.port"] = self.server_port
290+
return attrs
291+
249292
def _init_metrics(self):
250293
"""Initialize metric instruments."""
251294
self._meter = get_meter(
@@ -402,7 +445,15 @@ def on_trace_start(self, trace: Trace) -> None:
402445
}
403446
if self.emit_legacy:
404447
attributes[GEN_AI_SYSTEM_LEGACY] = self.system_name
405-
attributes.update(_infer_server_attributes(self.base_url))
448+
449+
# Add configured agent and server attributes
450+
if self.agent_name:
451+
attributes[GEN_AI_AGENT_NAME] = self.agent_name
452+
if self.agent_id:
453+
attributes[GEN_AI_AGENT_ID] = self.agent_id
454+
if self.agent_description:
455+
attributes[GEN_AI_AGENT_DESCRIPTION] = self.agent_description
456+
attributes.update(self._get_server_attributes())
406457

407458
otel_span = self._tracer.start_span(
408459
name=trace.name,
@@ -433,9 +484,12 @@ def on_span_start(self, span: Span[Any]) -> None:
433484
# Get operation details for span naming
434485
operation_name = self._get_operation_name(span.span_data)
435486
model = getattr(span.span_data, 'model', None)
436-
agent_name = getattr(span.span_data, 'name', None) if isinstance(
437-
span.span_data, AgentSpanData
438-
) else None
487+
488+
# Use configured agent name or get from span data
489+
agent_name = self.agent_name
490+
if not agent_name and isinstance(span.span_data, AgentSpanData):
491+
agent_name = getattr(span.span_data, 'name', None)
492+
439493
tool_name = getattr(span.span_data, 'name', None) if isinstance(
440494
span.span_data, FunctionSpanData
441495
) else None
@@ -449,7 +503,15 @@ def on_span_start(self, span: Span[Any]) -> None:
449503
}
450504
if self.emit_legacy:
451505
attributes[GEN_AI_SYSTEM_LEGACY] = self.system_name
452-
attributes.update(_infer_server_attributes(self.base_url))
506+
507+
# Add configured agent and server attributes
508+
if self.agent_name:
509+
attributes[GEN_AI_AGENT_NAME] = self.agent_name
510+
if self.agent_id:
511+
attributes[GEN_AI_AGENT_ID] = self.agent_id
512+
if self.agent_description:
513+
attributes[GEN_AI_AGENT_DESCRIPTION] = self.agent_description
514+
attributes.update(self._get_server_attributes())
453515

454516
otel_span = self._tracer.start_span(
455517
name=span_name,
@@ -578,8 +640,16 @@ def _extract_genai_attributes(
578640
if self.emit_legacy:
579641
yield GEN_AI_SYSTEM_LEGACY, self.system_name
580642

643+
# Add configured agent attributes (always include when set)
644+
if self.agent_name:
645+
yield GEN_AI_AGENT_NAME, self.agent_name
646+
if self.agent_id:
647+
yield GEN_AI_AGENT_ID, self.agent_id
648+
if self.agent_description:
649+
yield GEN_AI_AGENT_DESCRIPTION, self.agent_description
650+
581651
# Server attributes
582-
for key, value in _infer_server_attributes(self.base_url).items():
652+
for key, value in self._get_server_attributes().items():
583653
yield key, value
584654

585655
# Process different span types
@@ -682,11 +752,12 @@ def _get_attributes_from_agent_span_data(
682752
"""Extract attributes from agent span."""
683753
yield GEN_AI_OPERATION_NAME, GenAIOperationName.INVOKE_AGENT
684754

685-
if span_data.name:
755+
# Use span data values only if not configured globally
756+
if not self.agent_name and span_data.name:
686757
yield GEN_AI_AGENT_NAME, span_data.name
687-
if hasattr(span_data, 'agent_id') and span_data.agent_id:
758+
if not self.agent_id and hasattr(span_data, 'agent_id') and span_data.agent_id:
688759
yield GEN_AI_AGENT_ID, span_data.agent_id
689-
if hasattr(span_data, 'description') and span_data.description:
760+
if not self.agent_description and hasattr(span_data, 'description') and span_data.description:
690761
yield GEN_AI_AGENT_DESCRIPTION, span_data.description
691762
if hasattr(span_data, 'conversation_id') and span_data.conversation_id:
692763
yield GEN_AI_CONVERSATION_ID, span_data.conversation_id

0 commit comments

Comments
 (0)