-
Notifications
You must be signed in to change notification settings - Fork 931
openai-agents-v2: use genai-utils for env var constant, histogram factories, and meter_provider #4456
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
openai-agents-v2: use genai-utils for env var constant, histogram factories, and meter_provider #4456
Changes from all commits
24fc1b0
2cd9fd4
10387f2
e30436e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -24,8 +24,6 @@ | |
| from typing import TYPE_CHECKING, Any, Dict, Iterator, Optional, Sequence | ||
| from urllib.parse import urlparse | ||
|
|
||
| from opentelemetry.util.genai.utils import gen_ai_json_dumps | ||
|
|
||
| try: | ||
| from agents.tracing import Span, Trace, TracingProcessor | ||
| from agents.tracing.span_data import ( | ||
|
|
@@ -55,7 +53,7 @@ | |
| ) # type: ignore[assignment] | ||
|
|
||
| from opentelemetry.context import attach, detach | ||
| from opentelemetry.metrics import Histogram, get_meter | ||
| from opentelemetry.metrics import MeterProvider, get_meter | ||
| from opentelemetry.semconv._incubating.attributes import ( | ||
| gen_ai_attributes as GenAIAttributes, | ||
| ) | ||
|
|
@@ -70,8 +68,15 @@ | |
| Tracer, | ||
| set_span_in_context, | ||
| ) | ||
| from opentelemetry.util.genai.instruments import ( | ||
| create_duration_histogram, | ||
| create_token_histogram, | ||
| ) | ||
| from opentelemetry.util.genai.utils import gen_ai_json_dumps | ||
| from opentelemetry.util.types import AttributeValue | ||
|
|
||
| from .version import __version__ | ||
|
|
||
| # Import all semantic convention constants | ||
| # ---- GenAI semantic convention helpers (embedded from constants.py) ---- | ||
|
|
||
|
|
@@ -439,6 +444,7 @@ def __init__( | |
| agent_description: Optional[str] = None, | ||
| server_address: Optional[str] = None, | ||
| server_port: Optional[int] = None, | ||
| meter_provider: Optional[MeterProvider] = None, | ||
| metrics_enabled: bool = True, | ||
| agent_name_default: Optional[str] = None, | ||
| agent_id_default: Optional[str] = None, | ||
|
|
@@ -459,6 +465,7 @@ def __init__( | |
| agent_description: Description of the agent (can be overridden by env var) | ||
| server_address: Server address (can be overridden by env var or base_url) | ||
| server_port: Server port (can be overridden by env var or base_url) | ||
| meter_provider: Optional MeterProvider for metrics | ||
| """ | ||
| self._tracer = tracer | ||
| self.system_name = normalize_provider(system_name) or system_name | ||
|
|
@@ -515,10 +522,10 @@ def __init__( | |
| # Metrics configuration | ||
| self._metrics_enabled = metrics_enabled | ||
| self._meter = None | ||
| self._duration_histogram: Optional[Histogram] = None | ||
| self._token_usage_histogram: Optional[Histogram] = None | ||
| self._duration_histogram: Optional[object] = None | ||
| self._token_usage_histogram: Optional[object] = None | ||
| if self._metrics_enabled: | ||
| self._init_metrics() | ||
| self._init_metrics(meter_provider) | ||
|
|
||
| def _get_server_attributes(self) -> dict[str, Any]: | ||
| """Get server attributes from configured values.""" | ||
|
|
@@ -529,25 +536,15 @@ def _get_server_attributes(self) -> dict[str, Any]: | |
| attrs[ServerAttributes.SERVER_PORT] = self.server_port | ||
| return attrs | ||
|
|
||
| def _init_metrics(self): | ||
| def _init_metrics(self, meter_provider: Optional[MeterProvider] = None): | ||
| """Initialize metric instruments.""" | ||
| self._meter = get_meter( | ||
| "opentelemetry.instrumentation.openai_agents", "0.1.0" | ||
| ) | ||
|
|
||
| # Operation duration histogram | ||
| self._duration_histogram = self._meter.create_histogram( | ||
| name="gen_ai.client.operation.duration", | ||
| description="GenAI operation duration", | ||
| unit="s", | ||
| ) | ||
|
|
||
| # Token usage histogram | ||
| self._token_usage_histogram = self._meter.create_histogram( | ||
| name="gen_ai.client.token.usage", | ||
| description="Number of input and output tokens used", | ||
| unit="{token}", | ||
| "opentelemetry.instrumentation.openai_agents", | ||
| __version__, | ||
| meter_provider, | ||
| ) | ||
|
Comment on lines
541
to
545
|
||
| self._duration_histogram = create_duration_histogram(self._meter) | ||
| self._token_usage_histogram = create_token_histogram(self._meter) | ||
|
|
||
| def _record_metrics( | ||
| self, span: Span[Any], attributes: dict[str, AttributeValue] | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
_duration_histogramand_token_usage_histogramwere widened fromOptional[Histogram]toOptional[object], which loses type safety even thoughcreate_duration_histogram/create_token_histogramreturnHistogram. Consider importingHistogramand keeping these attributes typed asOptional[Histogram](or a more specific protocol) so static checkers can validate.record()usage.