Skip to content

Commit 3fe2490

Browse files
authored
opentelemetry-sdk: make it possible to customize processors configuration (open-telemetry#4806)
* opentelemetry-sdk: make it possible to customize processors configuration Make it easier for distributions to override the processors set up by the sdk configurator by specifying a span processor and a log record processor. * Add changelog * Fixes * Please typechecking * Fix naming * Span processors should be added once * Use typing protocol for exporter processor types * Rename types
1 parent 80b3078 commit 3fe2490

3 files changed

Lines changed: 148 additions & 31 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2626
([#4798](https://github.com/open-telemetry/opentelemetry-python/pull/4798))
2727
- Silence events API warnings for internal users
2828
([#4847](https://github.com/open-telemetry/opentelemetry-python/pull/4847))
29+
- opentelemetry-sdk: make it possible to override the default processors in the SDK configurator
30+
([#4806](https://github.com/open-telemetry/opentelemetry-python/pull/4806))
2931
- Prevent possible endless recursion from happening in `SimpleLogRecordProcessor.on_emit`,
3032
([#4799](https://github.com/open-telemetry/opentelemetry-python/pull/4799)) and ([#4867](https://github.com/open-telemetry/opentelemetry-python/pull/4867)).
3133
- Make ConcurrentMultiSpanProcessor fork safe

opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import warnings
2626
from abc import ABC, abstractmethod
2727
from 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

3030
from typing_extensions import Literal
3131

@@ -37,7 +37,11 @@
3737
OTEL_TRACES_EXPORTER,
3838
)
3939
from 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+
)
4145
from opentelemetry.sdk._logs.export import (
4246
BatchLogRecordProcessor,
4347
LogRecordExporter,
@@ -58,7 +62,7 @@
5862
PeriodicExportingMetricReader,
5963
)
6064
from opentelemetry.sdk.resources import Attributes, Resource
61-
from opentelemetry.sdk.trace import TracerProvider
65+
from opentelemetry.sdk.trace import SpanProcessor, TracerProvider
6266
from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter
6367
from opentelemetry.sdk.trace.id_generator import IdGenerator
6468
from opentelemetry.sdk.trace.sampling import Sampler
@@ -105,6 +109,18 @@
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+
108124
def _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

Comments
 (0)