1414
1515import contextlib
1616import dataclasses
17- from typing import Callable , Iterator , Mapping
17+ import os
18+ from typing import Any , Callable , Iterator , Mapping
1819
1920from google .rpc import code_pb2
2021from opentelemetry .exporter .cloud_trace import CloudTraceSpanExporter
2122from opentelemetry .propagators .cloud_trace_propagator import (
2223 CloudTraceFormatPropagator ,
2324)
25+ from opentelemetry .resourcedetector .gcp_resource_detector ._detector import (
26+ GoogleCloudResourceDetector ,
27+ )
2428from opentelemetry .sdk .trace import TracerProvider
2529from opentelemetry .sdk .trace .export import BatchSpanProcessor
2630from opentelemetry .sdk .trace .sampling import ALWAYS_ON
@@ -44,17 +48,24 @@ class Response:
4448
4549
4650@contextlib .contextmanager
47- def _tracer_setup () -> Iterator [Tracer ]:
51+ def _tracer_setup (
52+ tracer_provider_config : Mapping [str , Any ] = {},
53+ exporter_config : Mapping [str , Any ] = {},
54+ ) -> Iterator [Tracer ]:
4855 """\
4956 Context manager with common setup for tracing endpoints
5057
5158 Yields a tracer (from a fresh SDK with new exporter) then finally flushes
5259 spans created during the test after.
5360 """
5461
55- tracer_provider = TracerProvider (sampler = ALWAYS_ON )
62+ tracer_provider = TracerProvider (
63+ sampler = ALWAYS_ON , ** tracer_provider_config
64+ )
5665 tracer_provider .add_span_processor (
57- BatchSpanProcessor (CloudTraceSpanExporter (project_id = PROJECT_ID ))
66+ BatchSpanProcessor (
67+ CloudTraceSpanExporter (project_id = PROJECT_ID , ** exporter_config )
68+ )
5869 )
5970 tracer = tracer_provider .get_tracer (INSTRUMENTING_MODULE_NAME )
6071
@@ -124,6 +135,33 @@ def basic_propagator(request: Request) -> Response:
124135 return Response (status_code = code_pb2 .OK , headers = {TRACE_ID : trace_id })
125136
126137
138+ def detect_resource (request : Request ) -> Response :
139+ """Create a trace with GCP resource detector"""
140+
141+ # Temporarily skip if on Cloud Run until it is implemented
142+ if "K_CONFIGURATION" in os .environ :
143+ return Response (
144+ status_code = code_pb2 .UNIMPLEMENTED ,
145+ data = b"Resource detection not yet implemented on Cloud Run" ,
146+ )
147+
148+ with _tracer_setup (
149+ tracer_provider_config = {
150+ "resource" : GoogleCloudResourceDetector (
151+ raise_on_error = True
152+ ).detect ()
153+ },
154+ exporter_config = {"resource_regex" : r".*" },
155+ ) as tracer :
156+ with tracer .start_span (
157+ "resourceDetectionTrace" ,
158+ attributes = {TEST_ID : request .test_id },
159+ ) as span :
160+ trace_id = format_trace_id (span .get_span_context ().trace_id )
161+
162+ return Response (status_code = code_pb2 .OK , headers = {TRACE_ID : trace_id })
163+
164+
127165def not_implemented_handler (_ : Request ) -> Response :
128166 return Response (status_code = str (code_pb2 .UNIMPLEMENTED ))
129167
@@ -133,4 +171,5 @@ def not_implemented_handler(_: Request) -> Response:
133171 "/basicTrace" : basic_trace ,
134172 "/complexTrace" : complex_trace ,
135173 "/basicPropagator" : basic_propagator ,
174+ "/detectResource" : detect_resource ,
136175}
0 commit comments