Skip to content
Merged
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
Expand Up @@ -22,8 +22,7 @@

import google.genai

# NOTE: OpenTelemetry Python Logs and Events APIs are in beta
from opentelemetry import _events as otel_events
# NOTE: OpenTelemetry Python Logs API is in beta
from opentelemetry import _logs as otel_logs
from opentelemetry import metrics as otel_metrics
from opentelemetry import trace as otel_trace
Expand All @@ -40,7 +39,6 @@
GoogleGenAiSdkInstrumentor,
)
from opentelemetry.instrumentation.requests import RequestsInstrumentor
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.sdk.metrics import MeterProvider
Expand All @@ -56,12 +54,11 @@ def setup_otel_tracing():
)


def setup_otel_logs_and_events():
def setup_otel_logs():
otel_logs.set_logger_provider(LoggerProvider())
otel_logs.get_logger_provider().add_log_record_processor(
BatchLogRecordProcessor(OTLPLogExporter())
)
otel_events.set_event_logger_provider(EventLoggerProvider())


def setup_otel_metrics():
Expand All @@ -77,7 +74,7 @@ def setup_otel_metrics():

def setup_opentelemetry():
setup_otel_tracing()
setup_otel_logs_and_events()
setup_otel_logs()
setup_otel_metrics()


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ classifiers = [
"Programming Language :: Python :: 3.12"
]
dependencies = [
"opentelemetry-api >=1.37, <2",
"opentelemetry-api ~=1.37",
"opentelemetry-instrumentation >=0.52b1, <2",
"opentelemetry-semantic-conventions >=0.52b1, <2"
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

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

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

from openai import OpenAI

# NOTE: OpenTelemetry Python Logs and Events APIs are in beta
from opentelemetry import _events, _logs, metrics, trace
# NOTE: OpenTelemetry Python Logs API is in beta
from opentelemetry import _logs, metrics, trace
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import (
OTLPLogExporter,
)
Expand All @@ -15,7 +15,6 @@
OTLPSpanExporter,
)
from opentelemetry.instrumentation.openai_v2 import OpenAIInstrumentor
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.sdk.metrics import MeterProvider
Expand All @@ -29,12 +28,11 @@
BatchSpanProcessor(OTLPSpanExporter())
)

# configure logging and events
# configure logging
_logs.set_logger_provider(LoggerProvider())
_logs.get_logger_provider().add_log_record_processor(
BatchLogRecordProcessor(OTLPLogExporter())
)
_events.set_event_logger_provider(EventLoggerProvider())

# configure metrics
metrics.set_meter_provider(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ classifiers = [
"Programming Language :: Python :: 3.13",
]
dependencies = [
"opentelemetry-api ~= 1.30",
"opentelemetry-instrumentation ~= 0.51b0",
"opentelemetry-semantic-conventions ~= 0.51b0"
"opentelemetry-api ~= 1.37",
"opentelemetry-instrumentation ~= 0.58b0",
"opentelemetry-semantic-conventions ~= 0.58b0"
]

[project.optional-dependencies]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@

from wrapt import wrap_function_wrapper

from opentelemetry._events import get_event_logger
from opentelemetry._logs import get_logger
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.instrumentation.openai_v2.package import _instruments
from opentelemetry.instrumentation.openai_v2.utils import is_content_enabled
Expand Down Expand Up @@ -73,12 +73,12 @@ def _instrument(self, **kwargs):
tracer_provider,
schema_url=Schemas.V1_28_0.value,
)
event_logger_provider = kwargs.get("event_logger_provider")
event_logger = get_event_logger(
logger_provider = kwargs.get("logger_provider")
logger = get_logger(
__name__,
"",
schema_url=Schemas.V1_28_0.value,
event_logger_provider=event_logger_provider,
logger_provider=logger_provider,
)
meter_provider = kwargs.get("meter_provider")
self._meter = get_meter(
Expand All @@ -94,15 +94,15 @@ def _instrument(self, **kwargs):
module="openai.resources.chat.completions",
name="Completions.create",
wrapper=chat_completions_create(
tracer, event_logger, instruments, is_content_enabled()
tracer, logger, instruments, is_content_enabled()
),
)

wrap_function_wrapper(
module="openai.resources.chat.completions",
name="AsyncCompletions.create",
wrapper=async_chat_completions_create(
tracer, event_logger, instruments, is_content_enabled()
tracer, logger, instruments, is_content_enabled()
),
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@

from openai import Stream

from opentelemetry._events import Event, EventLogger
from opentelemetry._logs import Logger, LogRecord
from opentelemetry.context import get_current
from opentelemetry.semconv._incubating.attributes import (
gen_ai_attributes as GenAIAttributes,
)
from opentelemetry.semconv._incubating.attributes import (
server_attributes as ServerAttributes,
)
from opentelemetry.trace import Span, SpanKind, Tracer
from opentelemetry.trace.propagation import set_span_in_context

from .instruments import Instruments
from .utils import (
Expand All @@ -40,7 +42,7 @@

def chat_completions_create(
tracer: Tracer,
event_logger: EventLogger,
logger: Logger,
instruments: Instruments,
capture_content: bool,
):
Expand All @@ -57,24 +59,22 @@ def traced_method(wrapped, instance, args, kwargs):
end_on_exit=False,
) as span:
for message in kwargs.get("messages", []):
event_logger.emit(message_to_event(message, capture_content))
logger.emit(message_to_event(message, capture_content))

start = default_timer()
result = None
error_type = None
try:
result = wrapped(*args, **kwargs)
if is_streaming(kwargs):
return StreamWrapper(
result, span, event_logger, capture_content
)
return StreamWrapper(result, span, logger, capture_content)

if span.is_recording():
_set_response_attributes(
span, result, event_logger, capture_content
span, result, logger, capture_content
)
for choice in getattr(result, "choices", []):
event_logger.emit(choice_to_event(choice, capture_content))
logger.emit(choice_to_event(choice, capture_content))

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

def async_chat_completions_create(
tracer: Tracer,
event_logger: EventLogger,
logger: Logger,
instruments: Instruments,
capture_content: bool,
):
Expand All @@ -115,24 +115,22 @@ async def traced_method(wrapped, instance, args, kwargs):
end_on_exit=False,
) as span:
for message in kwargs.get("messages", []):
event_logger.emit(message_to_event(message, capture_content))
logger.emit(message_to_event(message, capture_content))

start = default_timer()
result = None
error_type = None
try:
result = await wrapped(*args, **kwargs)
if is_streaming(kwargs):
return StreamWrapper(
result, span, event_logger, capture_content
)
return StreamWrapper(result, span, logger, capture_content)

if span.is_recording():
_set_response_attributes(
span, result, event_logger, capture_content
span, result, logger, capture_content
)
for choice in getattr(result, "choices", []):
event_logger.emit(choice_to_event(choice, capture_content))
logger.emit(choice_to_event(choice, capture_content))

span.end()
return result
Expand Down Expand Up @@ -221,7 +219,7 @@ def _record_metrics(


def _set_response_attributes(
span, result, event_logger: EventLogger, capture_content: bool
span, result, logger: Logger, capture_content: bool
):
set_span_attribute(
span, GenAIAttributes.GEN_AI_RESPONSE_MODEL, result.model
Expand Down Expand Up @@ -311,7 +309,7 @@ def __init__(
self,
stream: Stream,
span: Span,
event_logger: EventLogger,
logger: Logger,
capture_content: bool,
):
self.stream = stream
Expand All @@ -320,7 +318,7 @@ def __init__(
self._span_started = False
self.capture_content = capture_content

self.event_logger = event_logger
self.logger = logger
self.setup()

def setup(self):
Expand Down Expand Up @@ -396,17 +394,13 @@ def cleanup(self):
event_attributes = {
GenAIAttributes.GEN_AI_SYSTEM: GenAIAttributes.GenAiSystemValues.OPENAI.value
}

# this span is not current, so we need to manually set the context on event
span_ctx = self.span.get_span_context()
self.event_logger.emit(
Event(
name="gen_ai.choice",
context = set_span_in_context(self.span, get_current())
self.logger.emit(
LogRecord(
event_name="gen_ai.choice",
attributes=event_attributes,
body=body,
trace_id=span_ctx.trace_id,
span_id=span_ctx.span_id,
trace_flags=span_ctx.trace_flags,
context=context,
)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from httpx import URL
from openai import NOT_GIVEN

from opentelemetry._events import Event
from opentelemetry._logs import LogRecord
from opentelemetry.semconv._incubating.attributes import (
gen_ai_attributes as GenAIAttributes,
)
Expand Down Expand Up @@ -123,8 +123,8 @@ def message_to_event(message, capture_content):
if tool_call_id:
body["id"] = tool_call_id

return Event(
name=f"gen_ai.{role}.message",
return LogRecord(
event_name=f"gen_ai.{role}.message",
attributes=attributes,
body=body if body else None,
)
Expand Down Expand Up @@ -156,8 +156,8 @@ def choice_to_event(choice, capture_content):
message["content"] = content
body["message"] = message

return Event(
name="gen_ai.choice",
return LogRecord(
event_name="gen_ai.choice",
attributes=attributes,
body=body,
)
Expand Down
Loading