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
102102
103103_logger = logging .getLogger (__name__ )
104104
105+ ExporterArgsMap = Mapping [
106+ Union [
107+ Type [SpanExporter ],
108+ Type [MetricExporter ],
109+ Type [MetricReader ],
110+ Type [LogExporter ],
111+ ],
112+ Mapping [str , Any ],
113+ ]
114+
105115
106116def _import_config_components (
107- selected_components : list [str ], entry_point_name : str
108- ) -> Sequence [tuple [str , object ]]:
117+ selected_components : Sequence [str ], entry_point_name : str
118+ ) -> list [tuple [str , Type ]]:
109119 component_implementations = []
110120
111121 for selected_component in selected_components :
@@ -197,7 +207,7 @@ def _get_exporter_entry_point(
197207
198208def _get_exporter_names (
199209 signal_type : Literal ["traces" , "metrics" , "logs" ],
200- ) -> Sequence [str ]:
210+ ) -> list [str ]:
201211 names = environ .get (_EXPORTER_ENV_BY_SIGNAL_TYPE .get (signal_type , "" ))
202212
203213 if not names or names .lower ().strip () == "none" :
@@ -214,6 +224,7 @@ def _init_tracing(
214224 id_generator : IdGenerator | None = None ,
215225 sampler : Sampler | None = None ,
216226 resource : Resource | None = None ,
227+ exporter_args_map : ExporterArgsMap | None = None ,
217228):
218229 provider = TracerProvider (
219230 id_generator = id_generator ,
@@ -222,8 +233,9 @@ def _init_tracing(
222233 )
223234 set_tracer_provider (provider )
224235
236+ exporter_args_map = exporter_args_map or {}
225237 for _ , exporter_class in exporters .items ():
226- exporter_args = {}
238+ exporter_args = exporter_args_map . get ( exporter_class , {})
227239 provider .add_span_processor (
228240 BatchSpanProcessor (exporter_class (** exporter_args ))
229241 )
@@ -234,12 +246,13 @@ def _init_metrics(
234246 str , Union [Type [MetricExporter ], Type [MetricReader ]]
235247 ],
236248 resource : Resource | None = None ,
249+ exporter_args_map : ExporterArgsMap | None = None ,
237250):
238251 metric_readers = []
239252
253+ exporter_args_map = exporter_args_map or {}
240254 for _ , exporter_or_reader_class in exporters_or_readers .items ():
241- exporter_args = {}
242-
255+ exporter_args = exporter_args_map .get (exporter_or_reader_class , {})
243256 if issubclass (exporter_or_reader_class , MetricReader ):
244257 metric_readers .append (exporter_or_reader_class (** exporter_args ))
245258 else :
@@ -257,12 +270,14 @@ def _init_logging(
257270 exporters : dict [str , Type [LogExporter ]],
258271 resource : Resource | None = None ,
259272 setup_logging_handler : bool = True ,
273+ exporter_args_map : ExporterArgsMap | None = None ,
260274):
261275 provider = LoggerProvider (resource = resource )
262276 set_logger_provider (provider )
263277
278+ exporter_args_map = exporter_args_map or {}
264279 for _ , exporter_class in exporters .items ():
265- exporter_args = {}
280+ exporter_args = exporter_args_map . get ( exporter_class , {})
266281 provider .add_log_record_processor (
267282 BatchLogRecordProcessor (exporter_class (** exporter_args ))
268283 )
@@ -357,22 +372,24 @@ def _import_exporters(
357372 return trace_exporters , metric_exporters , log_exporters
358373
359374
360- def _import_sampler_factory (sampler_name : str ) -> Callable [[str ], Sampler ]:
375+ def _import_sampler_factory (
376+ sampler_name : str ,
377+ ) -> Callable [[float | str | None ], Sampler ]:
361378 _ , sampler_impl = _import_config_components (
362379 [sampler_name .strip ()], _OTEL_SAMPLER_ENTRY_POINT_GROUP
363380 )[0 ]
364381 return sampler_impl
365382
366383
367- def _import_sampler (sampler_name : str ) -> Sampler | None :
384+ def _import_sampler (sampler_name : str | None ) -> Sampler | None :
368385 if not sampler_name :
369386 return None
370387 try :
371388 sampler_factory = _import_sampler_factory (sampler_name )
372389 arg = None
373390 if sampler_name in ("traceidratio" , "parentbased_traceidratio" ):
374391 try :
375- rate = float (os .getenv (OTEL_TRACES_SAMPLER_ARG ))
392+ rate = float (os .getenv (OTEL_TRACES_SAMPLER_ARG , "" ))
376393 except (ValueError , TypeError ):
377394 _logger .warning (
378395 "Could not convert TRACES_SAMPLER_ARG to float. Using default value 1.0."
@@ -417,6 +434,7 @@ def _initialize_components(
417434 resource_attributes : Attributes | None = None ,
418435 id_generator : IdGenerator | None = None ,
419436 setup_logging_handler : bool | None = None ,
437+ exporter_args_map : ExporterArgsMap | None = None ,
420438):
421439 if trace_exporter_names is None :
422440 trace_exporter_names = []
@@ -439,7 +457,7 @@ def _initialize_components(
439457 resource_attributes = {}
440458 # populate version if using auto-instrumentation
441459 if auto_instrumentation_version :
442- resource_attributes [ResourceAttributes .TELEMETRY_AUTO_VERSION ] = (
460+ resource_attributes [ResourceAttributes .TELEMETRY_AUTO_VERSION ] = ( # type: ignore[reportIndexIssue]
443461 auto_instrumentation_version
444462 )
445463 # if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name
@@ -451,8 +469,11 @@ def _initialize_components(
451469 id_generator = id_generator ,
452470 sampler = sampler ,
453471 resource = resource ,
472+ exporter_args_map = exporter_args_map ,
473+ )
474+ _init_metrics (
475+ metric_exporters , resource , exporter_args_map = exporter_args_map
454476 )
455- _init_metrics (metric_exporters , resource )
456477 if setup_logging_handler is None :
457478 setup_logging_handler = (
458479 os .getenv (
@@ -462,7 +483,12 @@ def _initialize_components(
462483 .lower ()
463484 == "true"
464485 )
465- _init_logging (log_exporters , resource , setup_logging_handler )
486+ _init_logging (
487+ log_exporters ,
488+ resource ,
489+ setup_logging_handler ,
490+ exporter_args_map = exporter_args_map ,
491+ )
466492
467493
468494class _BaseConfigurator (ABC ):
0 commit comments