Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Switch instrumentation to use util-genai instead of hand-rolled signals.
Stop capturing chat, embeddings, speech, and transcription spans — those are covered by the OpenAI instrumentation.
Remove handoff and guardrail spans (not yet defined in semantic convention and not implemented
by genai-util).
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,69 @@

from __future__ import annotations

from agents import Agent, Runner, function_tool
from agents import (
Agent,
RunConfig,
Runner,
function_tool,
)
from dotenv import load_dotenv

from opentelemetry import trace
from opentelemetry._logs import set_logger_provider
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import (
OTLPLogExporter,
)
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import (
OTLPMetricExporter,
)
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
OTLPSpanExporter,
)
from opentelemetry.instrumentation.genai.openai import OpenAIInstrumentor
from opentelemetry.instrumentation.genai.openai_agents import (
OpenAIAgentsInstrumentor,
)
from opentelemetry.metrics import set_meter_provider
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor


def configure_otel() -> None:
"""Configure the OpenTelemetry SDK for exporting spans."""
def configure_otel() -> tuple[TracerProvider, MeterProvider, LoggerProvider]:
"""Configure OpenTelemetry providers and install the instrumentor."""

provider = TracerProvider()
provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter()))
trace.set_tracer_provider(provider)
tracer_provider = TracerProvider()
tracer_provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter()))
trace.set_tracer_provider(tracer_provider)

OpenAIAgentsInstrumentor().instrument(tracer_provider=provider)
meter_provider = MeterProvider(
metric_readers=[
PeriodicExportingMetricReader(OTLPMetricExporter()),
],
)
set_meter_provider(meter_provider)

logger_provider = LoggerProvider()
logger_provider.add_log_record_processor(
BatchLogRecordProcessor(OTLPLogExporter())
)
set_logger_provider(logger_provider)

OpenAIInstrumentor().instrument(
tracer_provider=tracer_provider,
meter_provider=meter_provider,
logger_provider=logger_provider,
)
OpenAIAgentsInstrumentor().instrument(
tracer_provider=tracer_provider,
meter_provider=meter_provider,
logger_provider=logger_provider,
)
return tracer_provider, meter_provider, logger_provider


@function_tool
Expand All @@ -39,7 +80,7 @@ def get_weather(city: str) -> str:

def main() -> None:
load_dotenv()
configure_otel()
tracer_provider, meter_provider, logger_provider = configure_otel()
weather_specialist = Agent(
name="weather_specialist",
instructions=(
Expand All @@ -60,13 +101,22 @@ def main() -> None:
model="gpt-4o-mini",
)

result = Runner.run_sync(
triage_agent,
"I'm visiting Barcelona this weekend. How should I pack?",
)

print("Agent response:")
print(result.final_output)
try:
# ``RunConfig.workflow_name`` is the agents library's own knob for
# naming the workflow. The instrumentation reads it and emits the
# value as the ``gen_ai.workflow.name`` attribute on the workflow
# span — without it, the default "Agent workflow" is used.
result = Runner.run_sync(
triage_agent,
"I'm visiting Barcelona this weekend. How should I pack?",
run_config=RunConfig(workflow_name="weather-triage"),
)
print("Agent response:")
print(result.final_output)
finally:
tracer_provider.shutdown()
meter_provider.shutdown()
logger_provider.shutdown()


if __name__ == "__main__":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ python-dotenv~=1.0

opentelemetry-sdk~=1.42.0
opentelemetry-exporter-otlp-proto-grpc~=1.42.0
-e ../../../opentelemetry-instrumentation-genai-openai
-e ../..
Loading