Skip to content
Merged
Show file tree
Hide file tree
Changes from 13 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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `opentelemetry-instrumentation-dbapi`: fix crash retrieving libpq version when enabling commenter with psycopg
([#3796](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3796))

- `opentelemetry-instrumentation-vertexai`: migrate off the deprecated events API to use the logs API
([#3625](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3626))

### Added
- `opentelemetry-instrumentation`: botocore: Add support for AWS Secrets Manager semantic convention attribute
([#3765](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3765))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ classifiers = [
"Programming Language :: Python :: 3.12",
]
dependencies = [
"opentelemetry-api ~= 1.28",
"opentelemetry-api >= 1.37.0",
"opentelemetry-instrumentation ~= 0.58b0",
# TODO https://github.com/open-telemetry/opentelemetry-python-contrib/issues/3786: restrict
# version after the first release
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
wrap_function_wrapper, # type: ignore[reportUnknownVariableType]
)

from opentelemetry._events import get_event_logger
from opentelemetry._logs import get_logger
from opentelemetry.instrumentation._semconv import (
_OpenTelemetrySemanticConventionStability,
_OpenTelemetryStabilitySignalType,
Expand Down Expand Up @@ -128,12 +128,12 @@ def _instrument(self, **kwargs: Any):
tracer_provider,
schema_url=schema,
)
event_logger_provider = kwargs.get("event_logger_provider")
event_logger = get_event_logger(
logger_provider = kwargs.get("logger_provider")
logger = get_logger(
__name__,
"",
logger_provider=logger_provider,
schema_url=schema,
event_logger_provider=event_logger_provider,
)
sem_conv_opt_in_mode = _OpenTelemetrySemanticConventionStability._get_opentelemetry_stability_opt_in_mode(
_OpenTelemetryStabilitySignalType.GEN_AI,
Expand All @@ -142,7 +142,7 @@ def _instrument(self, **kwargs: Any):
# Type checker now knows sem_conv_opt_in_mode is a Literal[_StabilityMode.DEFAULT]
method_wrappers = MethodWrappers(
tracer,
event_logger,
logger,
is_content_enabled(sem_conv_opt_in_mode),
sem_conv_opt_in_mode,
completion_hook,
Expand All @@ -151,7 +151,7 @@ def _instrument(self, **kwargs: Any):
# Type checker now knows it's the other literal
method_wrappers = MethodWrappers(
tracer,
event_logger,
logger,
is_content_enabled(sem_conv_opt_in_mode),
sem_conv_opt_in_mode,
completion_hook,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
from dataclasses import asdict, dataclass
from typing import Any, Iterable, Literal

from opentelemetry._events import Event
from opentelemetry._logs import LogRecord
from opentelemetry.semconv._incubating.attributes import gen_ai_attributes
from opentelemetry.util.types import AnyValue

Expand All @@ -36,7 +36,7 @@ def user_event(
*,
role: str = "user",
content: AnyValue = None,
) -> Event:
) -> LogRecord:
"""Creates a User event
https://github.com/open-telemetry/semantic-conventions/blob/v1.28.0/docs/gen-ai/gen-ai-events.md#user-event
"""
Expand All @@ -45,8 +45,8 @@ def user_event(
}
if content is not None:
body["content"] = content
return Event(
name="gen_ai.user.message",
return LogRecord(
event_name="gen_ai.user.message",
attributes={
gen_ai_attributes.GEN_AI_SYSTEM: gen_ai_attributes.GenAiSystemValues.VERTEX_AI.value,
},
Expand All @@ -58,7 +58,7 @@ def assistant_event(
*,
role: str = "assistant",
content: AnyValue = None,
) -> Event:
) -> LogRecord:
"""Creates an Assistant event
https://github.com/open-telemetry/semantic-conventions/blob/v1.28.0/docs/gen-ai/gen-ai-events.md#assistant-event
"""
Expand All @@ -67,8 +67,8 @@ def assistant_event(
}
if content is not None:
body["content"] = content
return Event(
name="gen_ai.assistant.message",
return LogRecord(
event_name="gen_ai.assistant.message",
attributes={
gen_ai_attributes.GEN_AI_SYSTEM: gen_ai_attributes.GenAiSystemValues.VERTEX_AI.value,
},
Expand All @@ -80,7 +80,7 @@ def system_event(
*,
role: str = "system",
content: AnyValue = None,
) -> Event:
) -> LogRecord:
"""Creates a System event
https://github.com/open-telemetry/semantic-conventions/blob/v1.28.0/docs/gen-ai/gen-ai-events.md#system-event
"""
Expand All @@ -89,8 +89,8 @@ def system_event(
}
if content is not None:
body["content"] = content
return Event(
name="gen_ai.system.message",
return LogRecord(
event_name="gen_ai.system.message",
attributes={
gen_ai_attributes.GEN_AI_SYSTEM: gen_ai_attributes.GenAiSystemValues.VERTEX_AI.value,
},
Expand All @@ -103,7 +103,7 @@ def tool_event(
role: str | None,
id_: str,
content: AnyValue = None,
) -> Event:
) -> LogRecord:
"""Creates a Tool message event
https://github.com/open-telemetry/semantic-conventions/blob/v1.28.0/docs/gen-ai/gen-ai-events.md#event-gen_aitoolmessage
"""
Expand All @@ -116,8 +116,8 @@ def tool_event(
}
if content is not None:
body["content"] = content
return Event(
name="gen_ai.tool.message",
return LogRecord(
event_name="gen_ai.tool.message",
attributes={
gen_ai_attributes.GEN_AI_SYSTEM: gen_ai_attributes.GenAiSystemValues.VERTEX_AI.value,
},
Expand Down Expand Up @@ -158,7 +158,7 @@ def choice_event(
index: int,
message: ChoiceMessage,
tool_calls: Iterable[ChoiceToolCall] = (),
) -> Event:
) -> LogRecord:
"""Creates a choice event, which describes the Gen AI response message.
https://github.com/open-telemetry/semantic-conventions/blob/v1.28.0/docs/gen-ai/gen-ai-events.md#event-gen_aichoice
"""
Expand All @@ -174,8 +174,8 @@ def choice_event(
if tool_calls_list:
body["tool_calls"] = tool_calls_list

return Event(
name="gen_ai.choice",
return LogRecord(
event_name="gen_ai.choice",
attributes={
gen_ai_attributes.GEN_AI_SYSTEM: gen_ai_attributes.GenAiSystemValues.VERTEX_AI.value,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
overload,
)

from opentelemetry._events import Event, EventLogger
from opentelemetry._logs import Logger, LogRecord
from opentelemetry.instrumentation._semconv import (
_StabilityMode,
)
Expand Down Expand Up @@ -116,7 +116,7 @@ class MethodWrappers:
def __init__(
self,
tracer: Tracer,
event_logger: EventLogger,
logger: Logger,
capture_content: ContentCapturingMode,
sem_conv_opt_in_mode: Literal[
_StabilityMode.GEN_AI_LATEST_EXPERIMENTAL
Expand All @@ -128,7 +128,7 @@ def __init__(
def __init__(
self,
tracer: Tracer,
event_logger: EventLogger,
logger: Logger,
capture_content: bool,
sem_conv_opt_in_mode: Literal[_StabilityMode.DEFAULT],
completion_hook: CompletionHook,
Expand All @@ -137,7 +137,7 @@ def __init__(
def __init__(
self,
tracer: Tracer,
event_logger: EventLogger,
logger: Logger,
capture_content: Union[bool, ContentCapturingMode],
sem_conv_opt_in_mode: Union[
Literal[_StabilityMode.DEFAULT],
Expand All @@ -146,7 +146,7 @@ def __init__(
completion_hook: CompletionHook,
) -> None:
self.tracer = tracer
self.event_logger = event_logger
self.logger = logger
self.capture_content = capture_content
self.sem_conv_opt_in_mode = sem_conv_opt_in_mode
self.completion_hook = completion_hook
Expand Down Expand Up @@ -227,16 +227,16 @@ def handle_response(
for k, v in content_attributes.items()
}
)
event = Event(
name="gen_ai.client.inference.operation.details",
event = LogRecord(
event_name="gen_ai.client.inference.operation.details",
)
event.attributes = attributes
if capture_content in (
ContentCapturingMode.SPAN_AND_EVENT,
ContentCapturingMode.EVENT_ONLY,
):
event.attributes |= content_attributes
self.event_logger.emit(event)
self.logger.emit(event)
self.completion_hook.on_completion(
inputs=inputs,
outputs=outputs,
Expand Down Expand Up @@ -273,7 +273,7 @@ def _with_default_instrumentation(
for event in request_to_events(
params=params, capture_content=capture_content
):
self.event_logger.emit(event)
self.logger.emit(event)

# TODO: set error.type attribute
# https://github.com/open-telemetry/semantic-conventions/blob/main/docs/gen-ai/gen-ai-spans.md
Expand All @@ -294,7 +294,7 @@ def handle_response(
for event in response_to_events(
response=response, capture_content=capture_content
):
self.event_logger.emit(event)
self.logger.emit(event)

yield handle_response

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

from google.protobuf import json_format

from opentelemetry._events import Event
from opentelemetry._logs import LogRecord
from opentelemetry.instrumentation._semconv import (
_StabilityMode,
)
Expand Down Expand Up @@ -256,7 +256,7 @@ def get_span_name(span_attributes: Mapping[str, AttributeValue]) -> str:

def request_to_events(
*, params: GenerateContentParams, capture_content: bool
) -> Iterable[Event]:
) -> Iterable[LogRecord]:
# System message
if params.system_instruction:
request_content = _parts_to_any_value(
Expand Down Expand Up @@ -348,7 +348,7 @@ def response_to_events(
response: prediction_service.GenerateContentResponse
| prediction_service_v1beta1.GenerateContentResponse,
capture_content: bool,
) -> Iterable[Event]:
) -> Iterable[LogRecord]:
for candidate in response.candidates:
tool_calls = _extract_tool_calls(
candidate=candidate, capture_content=capture_content
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
from opentelemetry.instrumentation.vertexai.utils import (
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT,
)
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import (
InMemoryLogExporter,
Expand Down Expand Up @@ -84,13 +83,12 @@ def fixture_tracer_provider(span_exporter):
return provider


@pytest.fixture(scope="function", name="event_logger_provider")
def fixture_event_logger_provider(log_exporter):
@pytest.fixture(scope="function", name="logger_provider")
def fixture_logger_provider(log_exporter):
provider = LoggerProvider()
provider.add_log_record_processor(SimpleLogRecordProcessor(log_exporter))
event_logger_provider = EventLoggerProvider(provider)

return event_logger_provider
return provider


@pytest.fixture(scope="function", name="meter_provider")
Expand All @@ -117,7 +115,7 @@ def vertexai_init(vcr: VCR) -> None:

@pytest.fixture(scope="function")
def instrument_no_content(
tracer_provider, event_logger_provider, meter_provider, request
tracer_provider, logger_provider, meter_provider, request
):
# Reset global state..
_OpenTelemetrySemanticConventionStability._initialized = False
Expand All @@ -129,7 +127,7 @@ def instrument_no_content(
instrumentor = VertexAIInstrumentor()
instrumentor.instrument(
tracer_provider=tracer_provider,
event_logger_provider=event_logger_provider,
logger_provider=logger_provider,
meter_provider=meter_provider,
)

Expand All @@ -141,7 +139,7 @@ def instrument_no_content(

@pytest.fixture(scope="function")
def instrument_no_content_with_experimental_semconvs(
tracer_provider, event_logger_provider, meter_provider, request
tracer_provider, logger_provider, meter_provider, request
):
# Reset global state..
_OpenTelemetrySemanticConventionStability._initialized = False
Expand All @@ -155,7 +153,7 @@ def instrument_no_content_with_experimental_semconvs(
instrumentor = VertexAIInstrumentor()
instrumentor.instrument(
tracer_provider=tracer_provider,
event_logger_provider=event_logger_provider,
logger_provider=logger_provider,
meter_provider=meter_provider,
)

Expand All @@ -167,7 +165,7 @@ def instrument_no_content_with_experimental_semconvs(

@pytest.fixture(scope="function")
def instrument_with_experimental_semconvs(
tracer_provider, event_logger_provider, meter_provider
tracer_provider, logger_provider, meter_provider
):
# Reset global state..
_OpenTelemetrySemanticConventionStability._initialized = False
Expand All @@ -180,7 +178,7 @@ def instrument_with_experimental_semconvs(
instrumentor = VertexAIInstrumentor()
instrumentor.instrument(
tracer_provider=tracer_provider,
event_logger_provider=event_logger_provider,
logger_provider=logger_provider,
meter_provider=meter_provider,
)

Expand All @@ -192,7 +190,7 @@ def instrument_with_experimental_semconvs(

@pytest.fixture(scope="function")
def instrument_with_upload_hook(
tracer_provider, event_logger_provider, meter_provider
tracer_provider, logger_provider, meter_provider
):
# Reset global state..
_OpenTelemetrySemanticConventionStability._initialized = False
Expand All @@ -207,7 +205,7 @@ def instrument_with_upload_hook(
instrumentor = VertexAIInstrumentor()
instrumentor.instrument(
tracer_provider=tracer_provider,
event_logger_provider=event_logger_provider,
logger_provider=logger_provider,
meter_provider=meter_provider,
)

Expand All @@ -221,7 +219,7 @@ def instrument_with_upload_hook(

@pytest.fixture(scope="function")
def instrument_with_content(
tracer_provider, event_logger_provider, meter_provider, request
tracer_provider, logger_provider, meter_provider, request
):
# Reset global state..
_OpenTelemetrySemanticConventionStability._initialized = False
Expand All @@ -232,7 +230,7 @@ def instrument_with_content(
instrumentor = VertexAIInstrumentor()
instrumentor.instrument(
tracer_provider=tracer_provider,
event_logger_provider=event_logger_provider,
logger_provider=logger_provider,
meter_provider=meter_provider,
)

Expand Down
Loading