5252 OTEL_EXPORTER_OTLP_METRICS_PROTOCOL ,
5353 OTEL_EXPORTER_OTLP_PROTOCOL ,
5454 OTEL_EXPORTER_OTLP_TRACES_PROTOCOL ,
55+ OTEL_PYTHON_TRACER_CONFIGURATOR ,
5556 OTEL_TRACES_SAMPLER ,
5657 OTEL_TRACES_SAMPLER_ARG ,
5758)
6263 PeriodicExportingMetricReader ,
6364)
6465from opentelemetry .sdk .resources import Attributes , Resource
65- from opentelemetry .sdk .trace import SpanProcessor , TracerProvider
66+ from opentelemetry .sdk .trace import (
67+ SpanProcessor ,
68+ TracerProvider ,
69+ _TracerConfiguratorT ,
70+ )
6671from opentelemetry .sdk .trace .export import BatchSpanProcessor , SpanExporter
6772from opentelemetry .sdk .trace .id_generator import IdGenerator
6873from opentelemetry .sdk .trace .sampling import Sampler
@@ -162,6 +167,10 @@ def _get_id_generator() -> str:
162167 return environ .get (OTEL_PYTHON_ID_GENERATOR , _DEFAULT_ID_GENERATOR )
163168
164169
170+ def _get_tracer_configurator () -> str | None :
171+ return environ .get (OTEL_PYTHON_TRACER_CONFIGURATOR , None )
172+
173+
165174def _get_exporter_entry_point (
166175 exporter_name : str , signal_type : Literal ["traces" , "metrics" , "logs" ]
167176):
@@ -228,11 +237,13 @@ def _init_tracing(
228237 exporter_args_map : ExporterArgsMap | None = None ,
229238 span_processors : Sequence [SpanProcessor ] | None = None ,
230239 export_span_processor : _ConfigurationExporterSpanProcessorT | None = None ,
240+ tracer_configurator : _TracerConfiguratorT | None = None ,
231241):
232242 provider = TracerProvider (
233243 id_generator = id_generator ,
234244 sampler = sampler ,
235245 resource = resource ,
246+ _tracer_configurator = tracer_configurator ,
236247 )
237248 set_tracer_provider (provider )
238249
@@ -348,6 +359,27 @@ def overwritten_config_fn(*args, **kwargs):
348359 logging .basicConfig = wrapper (logging .basicConfig )
349360
350361
362+ def _import_tracer_configurator (
363+ tracer_configurator_name : str | None ,
364+ ) -> _TracerConfiguratorT | None :
365+ if not tracer_configurator_name :
366+ return None
367+
368+ try :
369+ _ , tracer_configurator_impl = _import_config_components (
370+ [tracer_configurator_name .strip ()],
371+ "_opentelemetry_tracer_configurator" ,
372+ )[0 ]
373+ except Exception as exc : # pylint: disable=broad-exception-caught
374+ _logger .warning (
375+ "Using default tracer configurator. Failed to load tracer configurator, %s: %s" ,
376+ tracer_configurator_name ,
377+ exc ,
378+ )
379+ return None
380+ return tracer_configurator_impl
381+
382+
351383def _import_exporters (
352384 trace_exporter_names : Sequence [str ],
353385 metric_exporter_names : Sequence [str ],
@@ -467,6 +499,7 @@ def _initialize_components(
467499 log_record_processors : Sequence [LogRecordProcessor ] | None = None ,
468500 export_log_record_processor : _ConfigurationExporterLogRecordProcessorT
469501 | None = None ,
502+ tracer_configurator : _TracerConfiguratorT | None = None ,
470503):
471504 # pylint: disable=too-many-locals
472505 if trace_exporter_names is None :
@@ -493,6 +526,12 @@ def _initialize_components(
493526 resource_attributes [ResourceAttributes .TELEMETRY_AUTO_VERSION ] = ( # type: ignore[reportIndexIssue]
494527 auto_instrumentation_version
495528 )
529+ if tracer_configurator is None :
530+ tracer_configurator_name = _get_tracer_configurator ()
531+ tracer_configurator = _import_tracer_configurator (
532+ tracer_configurator_name
533+ )
534+
496535 # if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name
497536 # from the env variable else defaults to "unknown_service"
498537 resource = Resource .create (resource_attributes )
@@ -505,6 +544,7 @@ def _initialize_components(
505544 exporter_args_map = exporter_args_map ,
506545 span_processors = span_processors ,
507546 export_span_processor = export_span_processor ,
547+ tracer_configurator = tracer_configurator ,
508548 )
509549 _init_metrics (
510550 metric_exporters , resource , exporter_args_map = exporter_args_map
0 commit comments