2525import warnings
2626from abc import ABC , abstractmethod
2727from os import environ
28- from typing import Any , Callable , Mapping , Sequence , Type , Union
28+ from typing import Any , Callable , Mapping , Protocol , Sequence , Type , Union
2929
3030from typing_extensions import Literal
3131
3737 OTEL_TRACES_EXPORTER ,
3838)
3939from opentelemetry .metrics import set_meter_provider
40- from opentelemetry .sdk ._logs import LoggerProvider , LoggingHandler
40+ from opentelemetry .sdk ._logs import (
41+ LoggerProvider ,
42+ LoggingHandler ,
43+ LogRecordProcessor ,
44+ )
4145from opentelemetry .sdk ._logs .export import (
4246 BatchLogRecordProcessor ,
4347 LogRecordExporter ,
5862 PeriodicExportingMetricReader ,
5963)
6064from opentelemetry .sdk .resources import Attributes , Resource
61- from opentelemetry .sdk .trace import TracerProvider
65+ from opentelemetry .sdk .trace import SpanProcessor , TracerProvider
6266from opentelemetry .sdk .trace .export import BatchSpanProcessor , SpanExporter
6367from opentelemetry .sdk .trace .id_generator import IdGenerator
6468from opentelemetry .sdk .trace .sampling import Sampler
105109]
106110
107111
112+ class _ConfigurationExporterSpanProcessorT (Protocol ):
113+ def __call__ (
114+ self , span_exporter : SpanExporter , * args , ** kwargs
115+ ) -> SpanProcessor : ...
116+
117+
118+ class _ConfigurationExporterLogRecordProcessorT (Protocol ):
119+ def __call__ (
120+ self , exporter : LogRecordExporter , * args , ** kwargs
121+ ) -> LogRecordProcessor : ...
122+
123+
108124def _import_config_components (
109125 selected_components : Sequence [str ], entry_point_name : str
110126) -> list [tuple [str , Type ]]:
@@ -210,6 +226,8 @@ def _init_tracing(
210226 sampler : Sampler | None = None ,
211227 resource : Resource | None = None ,
212228 exporter_args_map : ExporterArgsMap | None = None ,
229+ span_processors : Sequence [SpanProcessor ] | None = None ,
230+ export_span_processor : _ConfigurationExporterSpanProcessorT | None = None ,
213231):
214232 provider = TracerProvider (
215233 id_generator = id_generator ,
@@ -219,10 +237,16 @@ def _init_tracing(
219237 set_tracer_provider (provider )
220238
221239 exporter_args_map = exporter_args_map or {}
240+ export_processor = export_span_processor or BatchSpanProcessor
241+
242+ span_processors = span_processors or []
243+ for span_processor in span_processors :
244+ provider .add_span_processor (span_processor )
245+
222246 for _ , exporter_class in exporters .items ():
223247 exporter_args = exporter_args_map .get (exporter_class , {})
224248 provider .add_span_processor (
225- BatchSpanProcessor (exporter_class (** exporter_args ))
249+ export_processor (exporter_class (** exporter_args ))
226250 )
227251
228252
@@ -256,15 +280,24 @@ def _init_logging(
256280 resource : Resource | None = None ,
257281 setup_logging_handler : bool = True ,
258282 exporter_args_map : ExporterArgsMap | None = None ,
283+ log_record_processors : Sequence [LogRecordProcessor ] | None = None ,
284+ export_log_record_processor : _ConfigurationExporterLogRecordProcessorT
285+ | None = None ,
259286):
260287 provider = LoggerProvider (resource = resource )
261288 set_logger_provider (provider )
262289
263290 exporter_args_map = exporter_args_map or {}
291+ export_processor = export_log_record_processor or BatchLogRecordProcessor
292+
293+ log_record_processors = log_record_processors or []
294+ for log_record_processor in log_record_processors :
295+ provider .add_log_record_processor (log_record_processor )
296+
264297 for _ , exporter_class in exporters .items ():
265298 exporter_args = exporter_args_map .get (exporter_class , {})
266299 provider .add_log_record_processor (
267- BatchLogRecordProcessor (exporter_class (** exporter_args ))
300+ export_processor (exporter_class (** exporter_args ))
268301 )
269302
270303 # silence warnings from internal users until we drop the deprecated Events API
@@ -429,7 +462,13 @@ def _initialize_components(
429462 id_generator : IdGenerator | None = None ,
430463 setup_logging_handler : bool | None = None ,
431464 exporter_args_map : ExporterArgsMap | None = None ,
465+ span_processors : Sequence [SpanProcessor ] | None = None ,
466+ export_span_processor : _ConfigurationExporterSpanProcessorT | None = None ,
467+ log_record_processors : Sequence [LogRecordProcessor ] | None = None ,
468+ export_log_record_processor : _ConfigurationExporterLogRecordProcessorT
469+ | None = None ,
432470):
471+ # pylint: disable=too-many-locals
433472 if trace_exporter_names is None :
434473 trace_exporter_names = []
435474 if metric_exporter_names is None :
@@ -464,6 +503,8 @@ def _initialize_components(
464503 sampler = sampler ,
465504 resource = resource ,
466505 exporter_args_map = exporter_args_map ,
506+ span_processors = span_processors ,
507+ export_span_processor = export_span_processor ,
467508 )
468509 _init_metrics (
469510 metric_exporters , resource , exporter_args_map = exporter_args_map
@@ -482,6 +523,8 @@ def _initialize_components(
482523 resource ,
483524 setup_logging_handler ,
484525 exporter_args_map = exporter_args_map ,
526+ log_record_processors = log_record_processors ,
527+ export_log_record_processor = export_log_record_processor ,
485528 )
486529
487530
0 commit comments