4141from opentelemetry import trace
4242from opentelemetry .sdk .trace import export as export_lib
4343from opentelemetry .sdk .trace import ReadableSpan
44+ from opentelemetry .sdk .trace import SpanProcessor
4445from opentelemetry .sdk .trace import TracerProvider
4546from pydantic import Field
4647from pydantic import ValidationError
@@ -257,6 +258,59 @@ class ListMetricsInfoResponse(common.BaseModel):
257258 metrics_info : list [MetricInfo ]
258259
259260
261+ def _setup_telemetry (
262+ otel_to_cloud : bool = False ,
263+ internal_exporters : Optional [list [SpanProcessor ]] = None ,
264+ ):
265+ # TODO - remove the condition and else branch here once
266+ # maybe_set_otel_providers is no longer experimental.
267+ if otel_to_cloud :
268+ _setup_telemetry_experimental (
269+ otel_to_cloud = otel_to_cloud , internal_exporters = internal_exporters
270+ )
271+ else :
272+ # Old logic - to be removed when above leaves experimental.
273+ tracer_provider = TracerProvider ()
274+ for exporter in internal_exporters :
275+ tracer_provider .add_span_processor (exporter )
276+ trace .set_tracer_provider (tracer_provider = tracer_provider )
277+
278+
279+ def _setup_telemetry_experimental (
280+ otel_to_cloud : bool = False ,
281+ internal_exporters : list [SpanProcessor ] = None ,
282+ ):
283+ from ..telemetry .setup import maybe_set_otel_providers
284+
285+ otel_hooks_to_add = []
286+ otel_resource = None
287+
288+ if internal_exporters :
289+ from ..telemetry .setup import OTelHooks
290+
291+ # Register ADK-specific exporters in trace provider.
292+ otel_hooks_to_add .append (OTelHooks (span_processors = internal_exporters ))
293+
294+ if otel_to_cloud :
295+ from ..telemetry .google_cloud import get_gcp_exporters
296+ from ..telemetry .google_cloud import get_gcp_resource
297+
298+ otel_hooks_to_add .append (
299+ get_gcp_exporters (
300+ # TODO - use trace_to_cloud here as well once otel_to_cloud is no
301+ # longer experimental.
302+ enable_cloud_tracing = True ,
303+ enable_cloud_metrics = True ,
304+ enable_cloud_logging = True ,
305+ )
306+ )
307+ otel_resource = get_gcp_resource ()
308+
309+ maybe_set_otel_providers (
310+ otel_hooks_to_setup = otel_hooks_to_add , otel_resource = otel_resource
311+ )
312+
313+
260314class AdkWebServer :
261315 """Helper class for setting up and running the ADK web server on FastAPI.
262316
@@ -355,6 +409,7 @@ def get_fast_api_app(
355409 [Observer , "AdkWebServer" ], None
356410 ] = lambda o , s : None ,
357411 register_processors : Callable [[TracerProvider ], None ] = lambda o : None ,
412+ otel_to_cloud : bool = False ,
358413 ):
359414 """Creates a FastAPI app for the ADK web server.
360415
@@ -371,6 +426,8 @@ def get_fast_api_app(
371426 tear_down_observer: Callback for cleaning up the file system observer.
372427 register_processors: Callback for additional Span processors to be added
373428 to the TracerProvider.
429+ otel_to_cloud: EXPERIMENTAL. Whether to enable Cloud Trace,
430+ Cloud Monitoring and Cloud Logging integrations.
374431
375432 Returns:
376433 A FastAPI app instance.
@@ -395,17 +452,20 @@ async def internal_lifespan(app: FastAPI):
395452 # Create tasks for all runner closures to run concurrently
396453 await cleanup .close_runners (list (self .runner_dict .values ()))
397454
398- # Set up tracing in the FastAPI server.
399- provider = TracerProvider ()
400- provider .add_span_processor (
401- export_lib .SimpleSpanProcessor (ApiServerSpanExporter (trace_dict ))
402- )
403455 memory_exporter = InMemoryExporter (session_trace_dict )
404- provider .add_span_processor (export_lib .SimpleSpanProcessor (memory_exporter ))
405456
406- register_processors (provider )
457+ _setup_telemetry (
458+ otel_to_cloud = otel_to_cloud ,
459+ internal_exporters = [
460+ export_lib .SimpleSpanProcessor (ApiServerSpanExporter (trace_dict )),
461+ export_lib .SimpleSpanProcessor (memory_exporter ),
462+ ],
463+ )
407464
408- trace .set_tracer_provider (provider )
465+ # TODO - register_processors to be removed once --otel_to_cloud is no
466+ # longer experimental.
467+ tracer_provider = trace .get_tracer_provider ()
468+ register_processors (tracer_provider )
409469
410470 # Run the FastAPI server.
411471 app = FastAPI (lifespan = internal_lifespan )
0 commit comments