Skip to content

Commit c197328

Browse files
authored
Merge branch 'main' into feat/arangodb-instrumentor
2 parents 3b74aca + 050d582 commit c197328

File tree

14 files changed

+60
-84
lines changed

14 files changed

+60
-84
lines changed

instrumentation-genai/opentelemetry-instrumentation-google-genai/examples/manual/main.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@
2222

2323
import google.genai
2424

25-
# NOTE: OpenTelemetry Python Logs and Events APIs are in beta
26-
from opentelemetry import _events as otel_events
25+
# NOTE: OpenTelemetry Python Logs API is in beta
2726
from opentelemetry import _logs as otel_logs
2827
from opentelemetry import metrics as otel_metrics
2928
from opentelemetry import trace as otel_trace
@@ -40,7 +39,6 @@
4039
GoogleGenAiSdkInstrumentor,
4140
)
4241
from opentelemetry.instrumentation.requests import RequestsInstrumentor
43-
from opentelemetry.sdk._events import EventLoggerProvider
4442
from opentelemetry.sdk._logs import LoggerProvider
4543
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
4644
from opentelemetry.sdk.metrics import MeterProvider
@@ -56,12 +54,11 @@ def setup_otel_tracing():
5654
)
5755

5856

59-
def setup_otel_logs_and_events():
57+
def setup_otel_logs():
6058
otel_logs.set_logger_provider(LoggerProvider())
6159
otel_logs.get_logger_provider().add_log_record_processor(
6260
BatchLogRecordProcessor(OTLPLogExporter())
6361
)
64-
otel_events.set_event_logger_provider(EventLoggerProvider())
6562

6663

6764
def setup_otel_metrics():
@@ -77,7 +74,7 @@ def setup_otel_metrics():
7774

7875
def setup_opentelemetry():
7976
setup_otel_tracing()
80-
setup_otel_logs_and_events()
77+
setup_otel_logs()
8178
setup_otel_metrics()
8279

8380

instrumentation-genai/opentelemetry-instrumentation-google-genai/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ classifiers = [
3737
"Programming Language :: Python :: 3.12"
3838
]
3939
dependencies = [
40-
"opentelemetry-api >=1.37, <2",
40+
"opentelemetry-api ~=1.37",
4141
"opentelemetry-instrumentation >=0.52b1, <2",
4242
"opentelemetry-semantic-conventions >=0.52b1, <2"
4343
]

instrumentation-genai/opentelemetry-instrumentation-openai-v2/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
- Record prompt and completion events regardless of span sampling decision.
1111
([#3226](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3226))
12+
- Migrate off the deprecated events API to use the logs API
13+
([#3625](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3628))
1214

1315
## Version 2.1b0 (2025-01-18)
1416

instrumentation-genai/opentelemetry-instrumentation-openai-v2/examples/manual/main.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
from openai import OpenAI
55

6-
# NOTE: OpenTelemetry Python Logs and Events APIs are in beta
7-
from opentelemetry import _events, _logs, metrics, trace
6+
# NOTE: OpenTelemetry Python Logs API is in beta
7+
from opentelemetry import _logs, metrics, trace
88
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import (
99
OTLPLogExporter,
1010
)
@@ -15,7 +15,6 @@
1515
OTLPSpanExporter,
1616
)
1717
from opentelemetry.instrumentation.openai_v2 import OpenAIInstrumentor
18-
from opentelemetry.sdk._events import EventLoggerProvider
1918
from opentelemetry.sdk._logs import LoggerProvider
2019
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
2120
from opentelemetry.sdk.metrics import MeterProvider
@@ -29,12 +28,11 @@
2928
BatchSpanProcessor(OTLPSpanExporter())
3029
)
3130

32-
# configure logging and events
31+
# configure logging
3332
_logs.set_logger_provider(LoggerProvider())
3433
_logs.get_logger_provider().add_log_record_processor(
3534
BatchLogRecordProcessor(OTLPLogExporter())
3635
)
37-
_events.set_event_logger_provider(EventLoggerProvider())
3836

3937
# configure metrics
4038
metrics.set_meter_provider(

instrumentation-genai/opentelemetry-instrumentation-openai-v2/pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ classifiers = [
2525
"Programming Language :: Python :: 3.13",
2626
]
2727
dependencies = [
28-
"opentelemetry-api ~= 1.30",
29-
"opentelemetry-instrumentation ~= 0.51b0",
30-
"opentelemetry-semantic-conventions ~= 0.51b0"
28+
"opentelemetry-api ~= 1.37",
29+
"opentelemetry-instrumentation ~= 0.58b0",
30+
"opentelemetry-semantic-conventions ~= 0.58b0"
3131
]
3232

3333
[project.optional-dependencies]

instrumentation-genai/opentelemetry-instrumentation-openai-v2/src/opentelemetry/instrumentation/openai_v2/__init__.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444

4545
from wrapt import wrap_function_wrapper
4646

47-
from opentelemetry._events import get_event_logger
47+
from opentelemetry._logs import get_logger
4848
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
4949
from opentelemetry.instrumentation.openai_v2.package import _instruments
5050
from opentelemetry.instrumentation.openai_v2.utils import is_content_enabled
@@ -73,12 +73,12 @@ def _instrument(self, **kwargs):
7373
tracer_provider,
7474
schema_url=Schemas.V1_28_0.value,
7575
)
76-
event_logger_provider = kwargs.get("event_logger_provider")
77-
event_logger = get_event_logger(
76+
logger_provider = kwargs.get("logger_provider")
77+
logger = get_logger(
7878
__name__,
7979
"",
8080
schema_url=Schemas.V1_28_0.value,
81-
event_logger_provider=event_logger_provider,
81+
logger_provider=logger_provider,
8282
)
8383
meter_provider = kwargs.get("meter_provider")
8484
self._meter = get_meter(
@@ -94,15 +94,15 @@ def _instrument(self, **kwargs):
9494
module="openai.resources.chat.completions",
9595
name="Completions.create",
9696
wrapper=chat_completions_create(
97-
tracer, event_logger, instruments, is_content_enabled()
97+
tracer, logger, instruments, is_content_enabled()
9898
),
9999
)
100100

101101
wrap_function_wrapper(
102102
module="openai.resources.chat.completions",
103103
name="AsyncCompletions.create",
104104
wrapper=async_chat_completions_create(
105-
tracer, event_logger, instruments, is_content_enabled()
105+
tracer, logger, instruments, is_content_enabled()
106106
),
107107
)
108108

instrumentation-genai/opentelemetry-instrumentation-openai-v2/src/opentelemetry/instrumentation/openai_v2/patch.py

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@
1818

1919
from openai import Stream
2020

21-
from opentelemetry._events import Event, EventLogger
21+
from opentelemetry._logs import Logger, LogRecord
22+
from opentelemetry.context import get_current
2223
from opentelemetry.semconv._incubating.attributes import (
2324
gen_ai_attributes as GenAIAttributes,
2425
)
2526
from opentelemetry.semconv._incubating.attributes import (
2627
server_attributes as ServerAttributes,
2728
)
2829
from opentelemetry.trace import Span, SpanKind, Tracer
30+
from opentelemetry.trace.propagation import set_span_in_context
2931

3032
from .instruments import Instruments
3133
from .utils import (
@@ -40,7 +42,7 @@
4042

4143
def chat_completions_create(
4244
tracer: Tracer,
43-
event_logger: EventLogger,
45+
logger: Logger,
4446
instruments: Instruments,
4547
capture_content: bool,
4648
):
@@ -57,24 +59,22 @@ def traced_method(wrapped, instance, args, kwargs):
5759
end_on_exit=False,
5860
) as span:
5961
for message in kwargs.get("messages", []):
60-
event_logger.emit(message_to_event(message, capture_content))
62+
logger.emit(message_to_event(message, capture_content))
6163

6264
start = default_timer()
6365
result = None
6466
error_type = None
6567
try:
6668
result = wrapped(*args, **kwargs)
6769
if is_streaming(kwargs):
68-
return StreamWrapper(
69-
result, span, event_logger, capture_content
70-
)
70+
return StreamWrapper(result, span, logger, capture_content)
7171

7272
if span.is_recording():
7373
_set_response_attributes(
74-
span, result, event_logger, capture_content
74+
span, result, logger, capture_content
7575
)
7676
for choice in getattr(result, "choices", []):
77-
event_logger.emit(choice_to_event(choice, capture_content))
77+
logger.emit(choice_to_event(choice, capture_content))
7878

7979
span.end()
8080
return result
@@ -98,7 +98,7 @@ def traced_method(wrapped, instance, args, kwargs):
9898

9999
def async_chat_completions_create(
100100
tracer: Tracer,
101-
event_logger: EventLogger,
101+
logger: Logger,
102102
instruments: Instruments,
103103
capture_content: bool,
104104
):
@@ -115,24 +115,22 @@ async def traced_method(wrapped, instance, args, kwargs):
115115
end_on_exit=False,
116116
) as span:
117117
for message in kwargs.get("messages", []):
118-
event_logger.emit(message_to_event(message, capture_content))
118+
logger.emit(message_to_event(message, capture_content))
119119

120120
start = default_timer()
121121
result = None
122122
error_type = None
123123
try:
124124
result = await wrapped(*args, **kwargs)
125125
if is_streaming(kwargs):
126-
return StreamWrapper(
127-
result, span, event_logger, capture_content
128-
)
126+
return StreamWrapper(result, span, logger, capture_content)
129127

130128
if span.is_recording():
131129
_set_response_attributes(
132-
span, result, event_logger, capture_content
130+
span, result, logger, capture_content
133131
)
134132
for choice in getattr(result, "choices", []):
135-
event_logger.emit(choice_to_event(choice, capture_content))
133+
logger.emit(choice_to_event(choice, capture_content))
136134

137135
span.end()
138136
return result
@@ -221,7 +219,7 @@ def _record_metrics(
221219

222220

223221
def _set_response_attributes(
224-
span, result, event_logger: EventLogger, capture_content: bool
222+
span, result, logger: Logger, capture_content: bool
225223
):
226224
set_span_attribute(
227225
span, GenAIAttributes.GEN_AI_RESPONSE_MODEL, result.model
@@ -311,7 +309,7 @@ def __init__(
311309
self,
312310
stream: Stream,
313311
span: Span,
314-
event_logger: EventLogger,
312+
logger: Logger,
315313
capture_content: bool,
316314
):
317315
self.stream = stream
@@ -320,7 +318,7 @@ def __init__(
320318
self._span_started = False
321319
self.capture_content = capture_content
322320

323-
self.event_logger = event_logger
321+
self.logger = logger
324322
self.setup()
325323

326324
def setup(self):
@@ -396,17 +394,13 @@ def cleanup(self):
396394
event_attributes = {
397395
GenAIAttributes.GEN_AI_SYSTEM: GenAIAttributes.GenAiSystemValues.OPENAI.value
398396
}
399-
400-
# this span is not current, so we need to manually set the context on event
401-
span_ctx = self.span.get_span_context()
402-
self.event_logger.emit(
403-
Event(
404-
name="gen_ai.choice",
397+
context = set_span_in_context(self.span, get_current())
398+
self.logger.emit(
399+
LogRecord(
400+
event_name="gen_ai.choice",
405401
attributes=event_attributes,
406402
body=body,
407-
trace_id=span_ctx.trace_id,
408-
span_id=span_ctx.span_id,
409-
trace_flags=span_ctx.trace_flags,
403+
context=context,
410404
)
411405
)
412406

instrumentation-genai/opentelemetry-instrumentation-openai-v2/src/opentelemetry/instrumentation/openai_v2/utils.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from httpx import URL
2020
from openai import NOT_GIVEN
2121

22-
from opentelemetry._events import Event
22+
from opentelemetry._logs import LogRecord
2323
from opentelemetry.semconv._incubating.attributes import (
2424
gen_ai_attributes as GenAIAttributes,
2525
)
@@ -123,8 +123,8 @@ def message_to_event(message, capture_content):
123123
if tool_call_id:
124124
body["id"] = tool_call_id
125125

126-
return Event(
127-
name=f"gen_ai.{role}.message",
126+
return LogRecord(
127+
event_name=f"gen_ai.{role}.message",
128128
attributes=attributes,
129129
body=body if body else None,
130130
)
@@ -156,8 +156,8 @@ def choice_to_event(choice, capture_content):
156156
message["content"] = content
157157
body["message"] = message
158158

159-
return Event(
160-
name="gen_ai.choice",
159+
return LogRecord(
160+
event_name="gen_ai.choice",
161161
attributes=attributes,
162162
body=body,
163163
)

0 commit comments

Comments
 (0)