diff --git a/tests/unit/vertex_adk/test_agent_engine_templates_adk.py b/tests/unit/vertex_adk/test_agent_engine_templates_adk.py index 2b0f06cece..b4f41aeb3d 100644 --- a/tests/unit/vertex_adk/test_agent_engine_templates_adk.py +++ b/tests/unit/vertex_adk/test_agent_engine_templates_adk.py @@ -18,6 +18,7 @@ import os import cloudpickle import sys +import re from unittest import mock from typing import Optional @@ -769,8 +770,17 @@ def test_tracing_setup( otlp_span_exporter_mock.assert_called_once_with( session=mock.ANY, endpoint="https://telemetry.googleapis.com/v1/traces", + headers=mock.ANY, ) + user_agent = otlp_span_exporter_mock.call_args.kwargs["headers"]["User-Agent"] + assert ( + re.fullmatch( + r"Vertex-Agent-Engine\/[\d\.]+ OTel-OTLP-Exporter-Python\/[\d\.]+", + user_agent, + ) + is not None + ) assert ( trace_provider_mock.call_args.kwargs["resource"].attributes == expected_attributes diff --git a/tests/unit/vertex_adk/test_reasoning_engine_templates_adk.py b/tests/unit/vertex_adk/test_reasoning_engine_templates_adk.py index add706859a..e06be088a9 100644 --- a/tests/unit/vertex_adk/test_reasoning_engine_templates_adk.py +++ b/tests/unit/vertex_adk/test_reasoning_engine_templates_adk.py @@ -17,6 +17,7 @@ import importlib import json import os +import re from unittest import mock from typing import Optional @@ -723,8 +724,17 @@ def test_tracing_setup( otlp_span_exporter_mock.assert_called_once_with( session=mock.ANY, endpoint="https://telemetry.googleapis.com/v1/traces", + headers=mock.ANY, ) + user_agent = otlp_span_exporter_mock.call_args.kwargs["headers"]["User-Agent"] + assert ( + re.fullmatch( + r"Vertex-Agent-Engine\/[\d\.]+ OTel-OTLP-Exporter-Python\/[\d\.]+", + user_agent, + ) + is not None + ) assert ( trace_provider_mock.call_args.kwargs["resource"].attributes == expected_attributes diff --git a/vertexai/agent_engines/templates/adk.py b/vertexai/agent_engines/templates/adk.py index 0276b4f434..7e21e6c680 100644 --- a/vertexai/agent_engines/templates/adk.py +++ b/vertexai/agent_engines/templates/adk.py @@ -357,8 +357,10 @@ def _detect_cloud_resource_id(project_id: str) -> Optional[str]: if enable_tracing: try: + import opentelemetry.exporter.otlp.proto.http.version import opentelemetry.exporter.otlp.proto.http.trace_exporter import google.auth.transport.requests + from google.cloud.aiplatform import version as aip_version except (ImportError, AttributeError): return _warn_missing_dependency( "opentelemetry-exporter-otlp-proto-http", needed_for_tracing=True @@ -367,12 +369,17 @@ def _detect_cloud_resource_id(project_id: str) -> Optional[str]: import google.auth credentials, _ = google.auth.default() + vertex_sdk_version = aip_version.__version__ + otlp_http_version = opentelemetry.exporter.otlp.proto.http.version.__version__ + user_agent = f"Vertex-Agent-Engine/{vertex_sdk_version} OTel-OTLP-Exporter-Python/{otlp_http_version}" + span_exporter = ( opentelemetry.exporter.otlp.proto.http.trace_exporter.OTLPSpanExporter( session=google.auth.transport.requests.AuthorizedSession( credentials=credentials ), endpoint="https://telemetry.googleapis.com/v1/traces", + headers={"User-Agent": user_agent}, ) ) span_processor = opentelemetry.sdk.trace.export.BatchSpanProcessor( diff --git a/vertexai/preview/reasoning_engines/templates/adk.py b/vertexai/preview/reasoning_engines/templates/adk.py index 9d29b71cea..a3220228ac 100644 --- a/vertexai/preview/reasoning_engines/templates/adk.py +++ b/vertexai/preview/reasoning_engines/templates/adk.py @@ -359,8 +359,10 @@ def _detect_cloud_resource_id(project_id: str) -> Optional[str]: if enable_tracing: try: + import opentelemetry.exporter.otlp.proto.http.version import opentelemetry.exporter.otlp.proto.http.trace_exporter import google.auth.transport.requests + from google.cloud.aiplatform import version as aip_version except (ImportError, AttributeError): return _warn_missing_dependency( "opentelemetry-exporter-otlp-proto-http", needed_for_tracing=True @@ -369,12 +371,17 @@ def _detect_cloud_resource_id(project_id: str) -> Optional[str]: import google.auth credentials, _ = google.auth.default() + vertex_sdk_version = aip_version.__version__ + otlp_http_version = opentelemetry.exporter.otlp.proto.http.version.__version__ + user_agent = f"Vertex-Agent-Engine/{vertex_sdk_version} OTel-OTLP-Exporter-Python/{otlp_http_version}" + span_exporter = ( opentelemetry.exporter.otlp.proto.http.trace_exporter.OTLPSpanExporter( session=google.auth.transport.requests.AuthorizedSession( credentials=credentials ), endpoint="https://telemetry.googleapis.com/v1/traces", + headers={"User-Agent": user_agent}, ) ) span_processor = opentelemetry.sdk.trace.export.BatchSpanProcessor(