feat(otel): Add GenAI Instrumentation if --otel_to_cloud is enabled

PiperOrigin-RevId: 808460137
This commit is contained in:
Kacper Jawoszek
2025-09-18 01:33:13 -07:00
committed by Copybara-Service
parent 712da1bd36
commit cee365a13d
3 changed files with 32 additions and 21 deletions
+1 -4
View File
@@ -151,10 +151,7 @@ extensions = [
]
otel-gcp = [
"opentelemetry-exporter-gcp-logging>=1.9.0a0, <2.0.0",
"opentelemetry-exporter-gcp-monitoring>=1.9.0a0, <2.0.0",
"opentelemetry-exporter-gcp-trace>=1.9.0, <2.0.0",
"opentelemetry-resourcedetector-gcp>=1.9.0a0, <2.0.0",
"opentelemetry-instrumentation-google-genai>=0.3b0, <1.0.0",
]
+26 -17
View File
@@ -267,9 +267,7 @@ def _setup_telemetry(
# TODO - remove the condition and else branch here once
# maybe_set_otel_providers is no longer experimental.
if otel_to_cloud:
_setup_telemetry_experimental(
otel_to_cloud=otel_to_cloud, internal_exporters=internal_exporters
)
_setup_telemetry_experimental(internal_exporters=internal_exporters)
else:
# Old logic - to be removed when above leaves experimental.
tracer_provider = TracerProvider()
@@ -279,7 +277,6 @@ def _setup_telemetry(
def _setup_telemetry_experimental(
otel_to_cloud: bool = False,
internal_exporters: list[SpanProcessor] = None,
):
from ..telemetry.setup import maybe_set_otel_providers
@@ -293,25 +290,37 @@ def _setup_telemetry_experimental(
# Register ADK-specific exporters in trace provider.
otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters))
if otel_to_cloud:
from ..telemetry.google_cloud import get_gcp_exporters
from ..telemetry.google_cloud import get_gcp_resource
from ..telemetry.google_cloud import get_gcp_exporters
from ..telemetry.google_cloud import get_gcp_resource
otel_hooks_to_add.append(
get_gcp_exporters(
# TODO - use trace_to_cloud here as well once otel_to_cloud is no
# longer experimental.
enable_cloud_tracing=True,
enable_cloud_metrics=True,
enable_cloud_logging=True,
)
)
otel_resource = get_gcp_resource()
otel_hooks_to_add.append(
get_gcp_exporters(
# TODO - use trace_to_cloud here as well once otel_to_cloud is no
# longer experimental.
enable_cloud_tracing=True,
enable_cloud_metrics=True,
enable_cloud_logging=True,
)
)
otel_resource = get_gcp_resource()
maybe_set_otel_providers(
otel_hooks_to_setup=otel_hooks_to_add, otel_resource=otel_resource
)
# Set instrumentation to enable emitting OTel data from GenAISDK
# Currently the instrumentation lib is in extras dependencies, make sure to
# warn the user if it's not installed.
try:
from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor
GoogleGenAiSdkInstrumentor().instrument()
except ImportError:
logger.warning(
"Unable to import GoogleGenAiSdkInstrumentor - some"
" telemetry will be disabled. Make sure to install google-adk[otel-gcp]"
)
class AdkWebServer:
"""Helper class for setting up and running the ADK web server on FastAPI.
+5
View File
@@ -18,9 +18,11 @@ from dataclasses import dataclass
from dataclasses import field
from typing import Optional
from opentelemetry import _events
from opentelemetry import _logs
from opentelemetry import metrics
from opentelemetry import trace
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs import LogRecordProcessor
from opentelemetry.sdk.metrics import MeterProvider
@@ -104,6 +106,9 @@ def maybe_set_otel_providers(
for exporter in log_record_processors:
new_logger_provider.add_log_record_processor(exporter)
_logs.set_logger_provider(new_logger_provider)
# Add event provider to logger provider to support gen_ai events.
event_logger_provider = EventLoggerProvider(new_logger_provider)
_events.set_event_logger_provider(event_logger_provider)
def _get_otel_resource() -> Resource: