2323import os
2424from abc import ABC , abstractmethod
2525from os import environ
26- from typing import Callable , Sequence , Type , Union
26+ from typing import Any , Callable , Mapping , Sequence , Type , Union
2727
2828from typing_extensions import Literal
2929
9191
9292_logger = logging .getLogger (__name__ )
9393
94+ ExporterArgsMap = Mapping [
95+ Union [
96+ Type [SpanExporter ],
97+ Type [MetricExporter ],
98+ Type [MetricReader ],
99+ Type [LogExporter ],
100+ ],
101+ Mapping [str , Any ],
102+ ]
103+
94104
95105def _import_config_components (
96- selected_components : list [str ], entry_point_name : str
97- ) -> Sequence [tuple [str , object ]]:
106+ selected_components : Sequence [str ], entry_point_name : str
107+ ) -> list [tuple [str , Type ]]:
98108 component_implementations = []
99109
100110 for selected_component in selected_components :
@@ -179,7 +189,7 @@ def _get_exporter_entry_point(
179189
180190def _get_exporter_names (
181191 signal_type : Literal ["traces" , "metrics" , "logs" ],
182- ) -> Sequence [str ]:
192+ ) -> list [str ]:
183193 names = environ .get (_EXPORTER_ENV_BY_SIGNAL_TYPE .get (signal_type , "" ))
184194
185195 if not names or names .lower ().strip () == "none" :
@@ -196,6 +206,7 @@ def _init_tracing(
196206 id_generator : IdGenerator | None = None ,
197207 sampler : Sampler | None = None ,
198208 resource : Resource | None = None ,
209+ exporter_args_map : ExporterArgsMap | None = None ,
199210):
200211 provider = TracerProvider (
201212 id_generator = id_generator ,
@@ -204,8 +215,9 @@ def _init_tracing(
204215 )
205216 set_tracer_provider (provider )
206217
218+ exporter_args_map = exporter_args_map or {}
207219 for _ , exporter_class in exporters .items ():
208- exporter_args = {}
220+ exporter_args = exporter_args_map . get ( exporter_class , {})
209221 provider .add_span_processor (
210222 BatchSpanProcessor (exporter_class (** exporter_args ))
211223 )
@@ -216,12 +228,13 @@ def _init_metrics(
216228 str , Union [Type [MetricExporter ], Type [MetricReader ]]
217229 ],
218230 resource : Resource | None = None ,
231+ exporter_args_map : ExporterArgsMap | None = None ,
219232):
220233 metric_readers = []
221234
235+ exporter_args_map = exporter_args_map or {}
222236 for _ , exporter_or_reader_class in exporters_or_readers .items ():
223- exporter_args = {}
224-
237+ exporter_args = exporter_args_map .get (exporter_or_reader_class , {})
225238 if issubclass (exporter_or_reader_class , MetricReader ):
226239 metric_readers .append (exporter_or_reader_class (** exporter_args ))
227240 else :
@@ -239,12 +252,14 @@ def _init_logging(
239252 exporters : dict [str , Type [LogExporter ]],
240253 resource : Resource | None = None ,
241254 setup_logging_handler : bool = True ,
255+ exporter_args_map : ExporterArgsMap | None = None ,
242256):
243257 provider = LoggerProvider (resource = resource )
244258 set_logger_provider (provider )
245259
260+ exporter_args_map = exporter_args_map or {}
246261 for _ , exporter_class in exporters .items ():
247- exporter_args = {}
262+ exporter_args = exporter_args_map . get ( exporter_class , {})
248263 provider .add_log_record_processor (
249264 BatchLogRecordProcessor (exporter_class (** exporter_args ))
250265 )
@@ -331,22 +346,24 @@ def _import_exporters(
331346 return trace_exporters , metric_exporters , log_exporters
332347
333348
334- def _import_sampler_factory (sampler_name : str ) -> Callable [[str ], Sampler ]:
349+ def _import_sampler_factory (
350+ sampler_name : str ,
351+ ) -> Callable [[float | str | None ], Sampler ]:
335352 _ , sampler_impl = _import_config_components (
336353 [sampler_name .strip ()], _OTEL_SAMPLER_ENTRY_POINT_GROUP
337354 )[0 ]
338355 return sampler_impl
339356
340357
341- def _import_sampler (sampler_name : str ) -> Sampler | None :
358+ def _import_sampler (sampler_name : str | None ) -> Sampler | None :
342359 if not sampler_name :
343360 return None
344361 try :
345362 sampler_factory = _import_sampler_factory (sampler_name )
346363 arg = None
347364 if sampler_name in ("traceidratio" , "parentbased_traceidratio" ):
348365 try :
349- rate = float (os .getenv (OTEL_TRACES_SAMPLER_ARG ))
366+ rate = float (os .getenv (OTEL_TRACES_SAMPLER_ARG , "" ))
350367 except (ValueError , TypeError ):
351368 _logger .warning (
352369 "Could not convert TRACES_SAMPLER_ARG to float. Using default value 1.0."
@@ -391,6 +408,7 @@ def _initialize_components(
391408 resource_attributes : Attributes | None = None ,
392409 id_generator : IdGenerator | None = None ,
393410 setup_logging_handler : bool | None = None ,
411+ exporter_args_map : ExporterArgsMap | None = None ,
394412):
395413 if trace_exporter_names is None :
396414 trace_exporter_names = []
@@ -413,7 +431,7 @@ def _initialize_components(
413431 resource_attributes = {}
414432 # populate version if using auto-instrumentation
415433 if auto_instrumentation_version :
416- resource_attributes [ResourceAttributes .TELEMETRY_AUTO_VERSION ] = (
434+ resource_attributes [ResourceAttributes .TELEMETRY_AUTO_VERSION ] = ( # type: ignore[reportIndexIssue]
417435 auto_instrumentation_version
418436 )
419437 # if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name
@@ -425,8 +443,11 @@ def _initialize_components(
425443 id_generator = id_generator ,
426444 sampler = sampler ,
427445 resource = resource ,
446+ exporter_args_map = exporter_args_map ,
447+ )
448+ _init_metrics (
449+ metric_exporters , resource , exporter_args_map = exporter_args_map
428450 )
429- _init_metrics (metric_exporters , resource )
430451 if setup_logging_handler is None :
431452 setup_logging_handler = (
432453 os .getenv (
@@ -436,7 +457,12 @@ def _initialize_components(
436457 .lower ()
437458 == "true"
438459 )
439- _init_logging (log_exporters , resource , setup_logging_handler )
460+ _init_logging (
461+ log_exporters ,
462+ resource ,
463+ setup_logging_handler ,
464+ exporter_args_map = exporter_args_map ,
465+ )
440466
441467
442468class _BaseConfigurator (ABC ):
0 commit comments