From 82db4adcf5900bd9bb38f1d7a6949e0cc09a05cd Mon Sep 17 00:00:00 2001 From: A Vertex SDK engineer Date: Fri, 13 Feb 2026 07:32:44 -0800 Subject: [PATCH] feat: Update the ADK template to export logs directly to Cloud Logging when OTEL_SEMCONV_STABILITY_OPT_IN is set to "gen_ai_latest_experimental". PiperOrigin-RevId: 869724527 --- vertexai/agent_engines/templates/adk.py | 37 ++++++++++++++----- .../reasoning_engines/templates/adk.py | 37 ++++++++++++++----- 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/vertexai/agent_engines/templates/adk.py b/vertexai/agent_engines/templates/adk.py index a22e512ca2..3cb2e0bceb 100644 --- a/vertexai/agent_engines/templates/adk.py +++ b/vertexai/agent_engines/templates/adk.py @@ -454,17 +454,36 @@ def force_flush( return True logger_provider = opentelemetry.sdk._logs.LoggerProvider(resource=resource) - logger_provider.add_log_record_processor( - _SimpleLogRecordProcessor( - opentelemetry.exporter.cloud_logging.CloudLoggingExporter( - project_id=project_id, - default_log_name=os.getenv( - "GCP_DEFAULT_LOG_NAME", "adk-on-agent-engine" + # Use the legacy log processor when experimental semconv is enabled. + # Exporting JSON logs to stdout is bugged; Agent Engine fails to + # correctly parse the `gen_ai.client.inference.operation.details` + # messages. + # TODO: b/480102541 - Unify both branches once the regression is fixed. + if "gen_ai_latest_experimental" in os.getenv( + "OTEL_SEMCONV_STABILITY_OPT_IN", "" + ).split(","): + logger_provider.add_log_record_processor( + opentelemetry.sdk._logs.export.BatchLogRecordProcessor( + opentelemetry.exporter.cloud_logging.CloudLoggingExporter( + project_id=project_id, + default_log_name=os.getenv( + "GCP_DEFAULT_LOG_NAME", "adk-on-agent-engine" + ), ), - structured_json_file=sys.stdout, - ), + ) + ) + else: + logger_provider.add_log_record_processor( + _SimpleLogRecordProcessor( + opentelemetry.exporter.cloud_logging.CloudLoggingExporter( + project_id=project_id, + default_log_name=os.getenv( + "GCP_DEFAULT_LOG_NAME", "adk-on-agent-engine" + ), + structured_json_file=sys.stdout, + ), + ) ) - ) event_logger_provider = opentelemetry.sdk._events.EventLoggerProvider( logger_provider=logger_provider ) diff --git a/vertexai/preview/reasoning_engines/templates/adk.py b/vertexai/preview/reasoning_engines/templates/adk.py index bf4cf42e92..1e55bf40f7 100644 --- a/vertexai/preview/reasoning_engines/templates/adk.py +++ b/vertexai/preview/reasoning_engines/templates/adk.py @@ -456,17 +456,36 @@ def force_flush( return True logger_provider = opentelemetry.sdk._logs.LoggerProvider(resource=resource) - logger_provider.add_log_record_processor( - _SimpleLogRecordProcessor( - opentelemetry.exporter.cloud_logging.CloudLoggingExporter( - project_id=project_id, - default_log_name=os.getenv( - "GCP_DEFAULT_LOG_NAME", "adk-on-agent-engine" + # Use the legacy log processor when experimental semconv is enabled. + # Exporting JSON logs to stdout is bugged; Agent Engine fails to + # correctly parse the `gen_ai.client.inference.operation.details` + # messages. + # TODO: b/480102541 - Unify both branches once the regression is fixed. + if "gen_ai_latest_experimental" in os.getenv( + "OTEL_SEMCONV_STABILITY_OPT_IN", "" + ).split(","): + logger_provider.add_log_record_processor( + opentelemetry.sdk._logs.export.BatchLogRecordProcessor( + opentelemetry.exporter.cloud_logging.CloudLoggingExporter( + project_id=project_id, + default_log_name=os.getenv( + "GCP_DEFAULT_LOG_NAME", "adk-on-agent-engine" + ), ), - structured_json_file=sys.stdout, - ), + ) + ) + else: + logger_provider.add_log_record_processor( + _SimpleLogRecordProcessor( + opentelemetry.exporter.cloud_logging.CloudLoggingExporter( + project_id=project_id, + default_log_name=os.getenv( + "GCP_DEFAULT_LOG_NAME", "adk-on-agent-engine" + ), + structured_json_file=sys.stdout, + ), + ) ) - ) event_logger_provider = opentelemetry.sdk._events.EventLoggerProvider( logger_provider=logger_provider )