Skip to content

Commit cee365a

Browse files
jawoszekcopybara-github
authored andcommitted
feat(otel): Add GenAI Instrumentation if --otel_to_cloud is enabled
PiperOrigin-RevId: 808460137
1 parent 712da1b commit cee365a

File tree

3 files changed

+33
-22
lines changed

3 files changed

+33
-22
lines changed

pyproject.toml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,7 @@ extensions = [
151151
]
152152

153153
otel-gcp = [
154-
"opentelemetry-exporter-gcp-logging>=1.9.0a0, <2.0.0",
155-
"opentelemetry-exporter-gcp-monitoring>=1.9.0a0, <2.0.0",
156-
"opentelemetry-exporter-gcp-trace>=1.9.0, <2.0.0",
157-
"opentelemetry-resourcedetector-gcp>=1.9.0a0, <2.0.0",
154+
"opentelemetry-instrumentation-google-genai>=0.3b0, <1.0.0",
158155
]
159156

160157

src/google/adk/cli/adk_web_server.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,7 @@ def _setup_telemetry(
267267
# TODO - remove the condition and else branch here once
268268
# maybe_set_otel_providers is no longer experimental.
269269
if otel_to_cloud:
270-
_setup_telemetry_experimental(
271-
otel_to_cloud=otel_to_cloud, internal_exporters=internal_exporters
272-
)
270+
_setup_telemetry_experimental(internal_exporters=internal_exporters)
273271
else:
274272
# Old logic - to be removed when above leaves experimental.
275273
tracer_provider = TracerProvider()
@@ -279,7 +277,6 @@ def _setup_telemetry(
279277

280278

281279
def _setup_telemetry_experimental(
282-
otel_to_cloud: bool = False,
283280
internal_exporters: list[SpanProcessor] = None,
284281
):
285282
from ..telemetry.setup import maybe_set_otel_providers
@@ -293,25 +290,37 @@ def _setup_telemetry_experimental(
293290
# Register ADK-specific exporters in trace provider.
294291
otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters))
295292

296-
if otel_to_cloud:
297-
from ..telemetry.google_cloud import get_gcp_exporters
298-
from ..telemetry.google_cloud import get_gcp_resource
299-
300-
otel_hooks_to_add.append(
301-
get_gcp_exporters(
302-
# TODO - use trace_to_cloud here as well once otel_to_cloud is no
303-
# longer experimental.
304-
enable_cloud_tracing=True,
305-
enable_cloud_metrics=True,
306-
enable_cloud_logging=True,
307-
)
308-
)
309-
otel_resource = get_gcp_resource()
293+
from ..telemetry.google_cloud import get_gcp_exporters
294+
from ..telemetry.google_cloud import get_gcp_resource
295+
296+
otel_hooks_to_add.append(
297+
get_gcp_exporters(
298+
# TODO - use trace_to_cloud here as well once otel_to_cloud is no
299+
# longer experimental.
300+
enable_cloud_tracing=True,
301+
enable_cloud_metrics=True,
302+
enable_cloud_logging=True,
303+
)
304+
)
305+
otel_resource = get_gcp_resource()
310306

311307
maybe_set_otel_providers(
312308
otel_hooks_to_setup=otel_hooks_to_add, otel_resource=otel_resource
313309
)
314310

311+
# Set instrumentation to enable emitting OTel data from GenAISDK
312+
# Currently the instrumentation lib is in extras dependencies, make sure to
313+
# warn the user if it's not installed.
314+
try:
315+
from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor
316+
317+
GoogleGenAiSdkInstrumentor().instrument()
318+
except ImportError:
319+
logger.warning(
320+
"Unable to import GoogleGenAiSdkInstrumentor - some"
321+
" telemetry will be disabled. Make sure to install google-adk[otel-gcp]"
322+
)
323+
315324

316325
class AdkWebServer:
317326
"""Helper class for setting up and running the ADK web server on FastAPI.

src/google/adk/telemetry/setup.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
from dataclasses import field
1919
from typing import Optional
2020

21+
from opentelemetry import _events
2122
from opentelemetry import _logs
2223
from opentelemetry import metrics
2324
from opentelemetry import trace
25+
from opentelemetry.sdk._events import EventLoggerProvider
2426
from opentelemetry.sdk._logs import LoggerProvider
2527
from opentelemetry.sdk._logs import LogRecordProcessor
2628
from opentelemetry.sdk.metrics import MeterProvider
@@ -104,6 +106,9 @@ def maybe_set_otel_providers(
104106
for exporter in log_record_processors:
105107
new_logger_provider.add_log_record_processor(exporter)
106108
_logs.set_logger_provider(new_logger_provider)
109+
# Add event provider to logger provider to support gen_ai events.
110+
event_logger_provider = EventLoggerProvider(new_logger_provider)
111+
_events.set_event_logger_provider(event_logger_provider)
107112

108113

109114
def _get_otel_resource() -> Resource:

0 commit comments

Comments
 (0)