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
9494
9595_logger = logging .getLogger (__name__ )
9696
97+ ExporterArgsMap = Mapping [
98+ Union [
99+ Type [SpanExporter ],
100+ Type [MetricExporter ],
101+ Type [MetricReader ],
102+ Type [LogExporter ],
103+ ],
104+ Mapping [str , Any ],
105+ ]
106+
97107
98108def _import_config_components (
99- selected_components : list [str ], entry_point_name : str
100- ) -> Sequence [tuple [str , object ]]:
109+ selected_components : Sequence [str ], entry_point_name : str
110+ ) -> list [tuple [str , Type ]]:
101111 component_implementations = []
102112
103113 for selected_component in selected_components :
@@ -182,7 +192,7 @@ def _get_exporter_entry_point(
182192
183193def _get_exporter_names (
184194 signal_type : Literal ["traces" , "metrics" , "logs" ],
185- ) -> Sequence [str ]:
195+ ) -> list [str ]:
186196 names = environ .get (_EXPORTER_ENV_BY_SIGNAL_TYPE .get (signal_type , "" ))
187197
188198 if not names or names .lower ().strip () == "none" :
@@ -199,6 +209,7 @@ def _init_tracing(
199209 id_generator : IdGenerator | None = None ,
200210 sampler : Sampler | None = None ,
201211 resource : Resource | None = None ,
212+ exporter_args_map : ExporterArgsMap | None = None ,
202213):
203214 provider = TracerProvider (
204215 id_generator = id_generator ,
@@ -207,8 +218,9 @@ def _init_tracing(
207218 )
208219 set_tracer_provider (provider )
209220
221+ exporter_args_map = exporter_args_map or {}
210222 for _ , exporter_class in exporters .items ():
211- exporter_args = {}
223+ exporter_args = exporter_args_map . get ( exporter_class , {})
212224 provider .add_span_processor (
213225 BatchSpanProcessor (exporter_class (** exporter_args ))
214226 )
@@ -219,12 +231,13 @@ def _init_metrics(
219231 str , Union [Type [MetricExporter ], Type [MetricReader ]]
220232 ],
221233 resource : Resource | None = None ,
234+ exporter_args_map : ExporterArgsMap | None = None ,
222235):
223236 metric_readers = []
224237
238+ exporter_args_map = exporter_args_map or {}
225239 for _ , exporter_or_reader_class in exporters_or_readers .items ():
226- exporter_args = {}
227-
240+ exporter_args = exporter_args_map .get (exporter_or_reader_class , {})
228241 if issubclass (exporter_or_reader_class , MetricReader ):
229242 metric_readers .append (exporter_or_reader_class (** exporter_args ))
230243 else :
@@ -242,12 +255,14 @@ def _init_logging(
242255 exporters : dict [str , Type [LogRecordExporter ]],
243256 resource : Resource | None = None ,
244257 setup_logging_handler : bool = True ,
258+ exporter_args_map : ExporterArgsMap | None = None ,
245259):
246260 provider = LoggerProvider (resource = resource )
247261 set_logger_provider (provider )
248262
263+ exporter_args_map = exporter_args_map or {}
249264 for _ , exporter_class in exporters .items ():
250- exporter_args = {}
265+ exporter_args = exporter_args_map . get ( exporter_class , {})
251266 provider .add_log_record_processor (
252267 BatchLogRecordProcessor (exporter_class (** exporter_args ))
253268 )
@@ -334,22 +349,24 @@ def _import_exporters(
334349 return trace_exporters , metric_exporters , log_exporters
335350
336351
337- def _import_sampler_factory (sampler_name : str ) -> Callable [[str ], Sampler ]:
352+ def _import_sampler_factory (
353+ sampler_name : str ,
354+ ) -> Callable [[float | str | None ], Sampler ]:
338355 _ , sampler_impl = _import_config_components (
339356 [sampler_name .strip ()], _OTEL_SAMPLER_ENTRY_POINT_GROUP
340357 )[0 ]
341358 return sampler_impl
342359
343360
344- def _import_sampler (sampler_name : str ) -> Sampler | None :
361+ def _import_sampler (sampler_name : str | None ) -> Sampler | None :
345362 if not sampler_name :
346363 return None
347364 try :
348365 sampler_factory = _import_sampler_factory (sampler_name )
349366 arg = None
350367 if sampler_name in ("traceidratio" , "parentbased_traceidratio" ):
351368 try :
352- rate = float (os .getenv (OTEL_TRACES_SAMPLER_ARG ))
369+ rate = float (os .getenv (OTEL_TRACES_SAMPLER_ARG , "" ))
353370 except (ValueError , TypeError ):
354371 _logger .warning (
355372 "Could not convert TRACES_SAMPLER_ARG to float. Using default value 1.0."
@@ -394,6 +411,7 @@ def _initialize_components(
394411 resource_attributes : Attributes | None = None ,
395412 id_generator : IdGenerator | None = None ,
396413 setup_logging_handler : bool | None = None ,
414+ exporter_args_map : ExporterArgsMap | None = None ,
397415):
398416 if trace_exporter_names is None :
399417 trace_exporter_names = []
@@ -416,7 +434,7 @@ def _initialize_components(
416434 resource_attributes = {}
417435 # populate version if using auto-instrumentation
418436 if auto_instrumentation_version :
419- resource_attributes [ResourceAttributes .TELEMETRY_AUTO_VERSION ] = (
437+ resource_attributes [ResourceAttributes .TELEMETRY_AUTO_VERSION ] = ( # type: ignore[reportIndexIssue]
420438 auto_instrumentation_version
421439 )
422440 # if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name
@@ -428,8 +446,11 @@ def _initialize_components(
428446 id_generator = id_generator ,
429447 sampler = sampler ,
430448 resource = resource ,
449+ exporter_args_map = exporter_args_map ,
450+ )
451+ _init_metrics (
452+ metric_exporters , resource , exporter_args_map = exporter_args_map
431453 )
432- _init_metrics (metric_exporters , resource )
433454 if setup_logging_handler is None :
434455 setup_logging_handler = (
435456 os .getenv (
@@ -439,7 +460,12 @@ def _initialize_components(
439460 .lower ()
440461 == "true"
441462 )
442- _init_logging (log_exporters , resource , setup_logging_handler )
463+ _init_logging (
464+ log_exporters ,
465+ resource ,
466+ setup_logging_handler ,
467+ exporter_args_map = exporter_args_map ,
468+ )
443469
444470
445471class _BaseConfigurator (ABC ):
0 commit comments