diff --git a/CHANGELOG.md b/CHANGELOG.md index ebf81ae5b4..95d22a4600 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ 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 diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/pyproject.toml b/instrumentation-genai/opentelemetry-instrumentation-vertexai/pyproject.toml index fba9c63667..ae7ee29073 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-vertexai/pyproject.toml +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/pyproject.toml @@ -24,7 +24,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", ] dependencies = [ - "opentelemetry-api ~= 1.28", + "opentelemetry-api >= 1.37", "opentelemetry-instrumentation ~= 0.58b0", # TODO https://github.com/open-telemetry/opentelemetry-python-contrib/issues/3786: restrict # version after the first release diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/__init__.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/__init__.py index 98e2ed57ed..960e35ae46 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/__init__.py +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/__init__.py @@ -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, @@ -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, @@ -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, @@ -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, diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/events.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/events.py index 990af83eaf..75969d1687 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/events.py +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/events.py @@ -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 @@ -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 """ @@ -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, }, @@ -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 """ @@ -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, }, @@ -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 """ @@ -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, }, @@ -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 """ @@ -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, }, @@ -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 """ @@ -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, }, diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/patch.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/patch.py index e7e6621d73..e11ea6e8b6 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/patch.py +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/patch.py @@ -28,7 +28,7 @@ overload, ) -from opentelemetry._events import Event, EventLogger +from opentelemetry._logs import Logger, LogRecord from opentelemetry.instrumentation._semconv import ( _StabilityMode, ) @@ -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 @@ -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, @@ -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], @@ -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 @@ -227,8 +227,8 @@ 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 ( @@ -236,7 +236,7 @@ def handle_response( 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, @@ -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 @@ -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 diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/utils.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/utils.py index 9a9dd9c2d4..860018f908 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/utils.py +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/src/opentelemetry/instrumentation/vertexai/utils.py @@ -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, ) @@ -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( @@ -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 diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/conftest.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/conftest.py index 349bf17820..3815e20dac 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/conftest.py +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/conftest.py @@ -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, @@ -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") @@ -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 @@ -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, ) @@ -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 @@ -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, ) @@ -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 @@ -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, ) @@ -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 @@ -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, ) @@ -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 @@ -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, ) diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_chat_completions.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_chat_completions.py index 81d8f08ba9..61bbc0775a 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_chat_completions.py +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_chat_completions.py @@ -69,10 +69,8 @@ def test_generate_content( assert user_log.trace_id == span_context.trace_id assert user_log.span_id == span_context.span_id assert user_log.trace_flags == span_context.trace_flags - assert user_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.user.message", - } + assert user_log.attributes == {"gen_ai.system": "vertex_ai"} + assert user_log.event_name == "gen_ai.user.message" assert user_log.body == { "content": [{"text": "Say this is a test"}], "role": "user", @@ -81,10 +79,8 @@ def test_generate_content( assert choice_log.trace_id == span_context.trace_id assert choice_log.span_id == span_context.span_id assert choice_log.trace_flags == span_context.trace_flags - assert choice_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.choice", - } + assert choice_log.attributes == {"gen_ai.system": "vertex_ai"} + assert choice_log.event_name == "gen_ai.choice" assert choice_log.body == { "finish_reason": "stop", "index": 0, @@ -130,16 +126,12 @@ def test_generate_content_without_events( # Emits user and choice event without body.content assert len(logs) == 2 user_log, choice_log = [log_data.log_record for log_data in logs] - assert user_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.user.message", - } + assert user_log.attributes == {"gen_ai.system": "vertex_ai"} + assert user_log.event_name == "gen_ai.user.message" assert user_log.body == {"role": "user"} - assert choice_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.choice", - } + assert choice_log.attributes == {"gen_ai.system": "vertex_ai"} + assert choice_log.event_name == "gen_ai.choice" assert choice_log.body == { "finish_reason": "stop", "index": 0, @@ -275,8 +267,8 @@ def test_generate_content_invalid_role( log = logs[0].log_record assert log.attributes == { "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.user.message", } + assert log.event_name == "gen_ai.user.message" assert log.body == { "content": [{"text": "Say this is a test"}], "role": "invalid_role", @@ -409,47 +401,37 @@ def generate_content_all_input_events( log_data.log_record for log_data in logs ] - assert system_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.system.message", - } + assert system_log.attributes == {"gen_ai.system": "vertex_ai"} + assert system_log.event_name == "gen_ai.system.message" assert system_log.body == { "content": [{"text": "You are a clever language model"}], # The API only allows user and model, so system instruction is considered a user role "role": "user", } - assert user_log1.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.user.message", - } + assert user_log1.attributes == {"gen_ai.system": "vertex_ai"} + assert user_log1.event_name == "gen_ai.user.message" assert user_log1.body == { "content": [{"text": "My name is OpenTelemetry"}], "role": "user", } - assert assistant_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.assistant.message", - } + assert assistant_log.attributes == {"gen_ai.system": "vertex_ai"} + assert assistant_log.event_name == "gen_ai.assistant.message" assert assistant_log.body == { "content": [{"text": "Hello OpenTelemetry!"}], "role": "model", } - assert user_log2.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.user.message", - } + assert user_log2.attributes == {"gen_ai.system": "vertex_ai"} + assert user_log2.event_name == "gen_ai.user.message" assert user_log2.body == { "content": [{"text": "Address me by name and say this is a test"}], "role": "user", } - assert choice_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.choice", - } + assert choice_log.attributes == {"gen_ai.system": "vertex_ai"} + assert choice_log.event_name == "gen_ai.choice" assert choice_log.body == { "finish_reason": "stop", "index": 0, diff --git a/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_function_calling.py b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_function_calling.py index 681f778df1..88762d6100 100644 --- a/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_function_calling.py +++ b/instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/test_function_calling.py @@ -42,10 +42,8 @@ def test_function_call_choice( logs = log_exporter.get_finished_logs() assert len(logs) == 2 user_log, choice_log = [log_data.log_record for log_data in logs] - assert user_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.user.message", - } + assert user_log.attributes == {"gen_ai.system": "vertex_ai"} + assert user_log.event_name == "gen_ai.user.message" assert user_log.body == { "content": [ {"text": "Get weather details in New Delhi and San Francisco?"} @@ -53,10 +51,8 @@ def test_function_call_choice( "role": "user", } - assert choice_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.choice", - } + assert choice_log.attributes == {"gen_ai.system": "vertex_ai"} + assert choice_log.event_name == "gen_ai.choice" assert choice_log.body == { "finish_reason": "stop", "index": 0, @@ -110,18 +106,14 @@ def test_function_call_choice_no_content( logs = log_exporter.get_finished_logs() assert len(logs) == 2 user_log, choice_log = [log_data.log_record for log_data in logs] - assert user_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.user.message", - } + assert user_log.attributes == {"gen_ai.system": "vertex_ai"} + assert user_log.event_name == "gen_ai.user.message" assert user_log.body == { "role": "user", } - assert choice_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.choice", - } + assert choice_log.attributes == {"gen_ai.system": "vertex_ai"} + assert choice_log.event_name == "gen_ai.choice" assert choice_log.body == { "finish_reason": "stop", "index": 0, @@ -171,10 +163,8 @@ def test_tool_events( user_log, assistant_log, tool_log1, tool_log2, choice_log = [ log_data.log_record for log_data in logs ] - assert user_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.user.message", - } + assert user_log.attributes == {"gen_ai.system": "vertex_ai"} + assert user_log.event_name == "gen_ai.user.message" assert user_log.body == { "content": [ {"text": "Get weather details in New Delhi and San Francisco?"} @@ -182,10 +172,8 @@ def test_tool_events( "role": "user", } - assert assistant_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.assistant.message", - } + assert assistant_log.attributes == {"gen_ai.system": "vertex_ai"} + assert assistant_log.event_name == "gen_ai.assistant.message" assert assistant_log.body == { "role": "model", "content": [ @@ -204,10 +192,8 @@ def test_tool_events( ], } - assert tool_log1.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.tool.message", - } + assert tool_log1.attributes == {"gen_ai.system": "vertex_ai"} + assert tool_log1.event_name == "gen_ai.tool.message" assert tool_log1.body == { "role": "user", @@ -215,20 +201,16 @@ def test_tool_events( "content": {"content": '{"temperature": 35, "unit": "C"}'}, } - assert tool_log2.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.tool.message", - } + assert tool_log2.attributes == {"gen_ai.system": "vertex_ai"} + assert tool_log2.event_name == "gen_ai.tool.message" assert tool_log2.body == { "role": "user", "id": "get_current_weather_1", "content": {"content": '{"temperature": 25, "unit": "C"}'}, } - assert choice_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.choice", - } + assert choice_log.attributes == {"gen_ai.system": "vertex_ai"} + assert choice_log.event_name == "gen_ai.choice" assert choice_log.body == { "finish_reason": "stop", "index": 0, @@ -273,40 +255,34 @@ def test_tool_events_no_content( user_log, assistant_log, tool_log1, tool_log2, choice_log = [ log_data.log_record for log_data in logs ] - assert user_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.user.message", - } + assert user_log.attributes == {"gen_ai.system": "vertex_ai"} + assert user_log.event_name == "gen_ai.user.message" assert user_log.body == {"role": "user"} - assert assistant_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.assistant.message", - } + assert assistant_log.attributes == {"gen_ai.system": "vertex_ai"} + assert assistant_log.event_name == "gen_ai.assistant.message" assert assistant_log.body == {"role": "model"} assert tool_log1.attributes == { "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.tool.message", } + assert tool_log1.event_name == "gen_ai.tool.message" assert tool_log1.body == { "role": "user", "id": "get_current_weather_0", } + assert tool_log1.event_name == "gen_ai.tool.message" + + assert tool_log2.attributes == {"gen_ai.system": "vertex_ai"} - assert tool_log2.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.tool.message", - } assert tool_log2.body == { "role": "user", "id": "get_current_weather_1", } + assert tool_log2.event_name == "gen_ai.tool.message" - assert choice_log.attributes == { - "gen_ai.system": "vertex_ai", - "event.name": "gen_ai.choice", - } + assert choice_log.attributes == {"gen_ai.system": "vertex_ai"} + assert choice_log.event_name == "gen_ai.choice" assert choice_log.body == { "finish_reason": "stop", "index": 0,