Skip to content

Commit 874e60d

Browse files
committed
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.
1 parent 20dedf5 commit 874e60d

File tree

2 files changed

+55
-8
lines changed

2 files changed

+55
-8
lines changed

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@
3838
)
3939
from opentelemetry.metrics import set_meter_provider
4040
from opentelemetry.sdk._events import EventLoggerProvider
41-
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
41+
from opentelemetry.sdk._logs import (
42+
LoggerProvider,
43+
LoggingHandler,
44+
LogRecordProcessor,
45+
)
4246
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor, LogExporter
4347
from opentelemetry.sdk.environment_variables import (
4448
_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED,
@@ -56,7 +60,7 @@
5660
PeriodicExportingMetricReader,
5761
)
5862
from opentelemetry.sdk.resources import Attributes, Resource
59-
from opentelemetry.sdk.trace import TracerProvider
63+
from opentelemetry.sdk.trace import SpanProcessor, TracerProvider
6064
from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter
6165
from opentelemetry.sdk.trace.id_generator import IdGenerator
6266
from opentelemetry.sdk.trace.sampling import Sampler
@@ -208,6 +212,7 @@ def _init_tracing(
208212
sampler: Sampler | None = None,
209213
resource: Resource | None = None,
210214
exporter_args_map: ExporterArgsMap | None = None,
215+
processor: Type[SpanProcessor] | None = None,
211216
):
212217
provider = TracerProvider(
213218
id_generator=id_generator,
@@ -217,10 +222,11 @@ def _init_tracing(
217222
set_tracer_provider(provider)
218223

219224
exporter_args_map = exporter_args_map or {}
225+
span_processor = processor or BatchSpanProcessor
220226
for _, exporter_class in exporters.items():
221227
exporter_args = exporter_args_map.get(exporter_class, {})
222228
provider.add_span_processor(
223-
BatchSpanProcessor(exporter_class(**exporter_args))
229+
span_processor(exporter_class(**exporter_args))
224230
)
225231

226232

@@ -254,15 +260,17 @@ def _init_logging(
254260
resource: Resource | None = None,
255261
setup_logging_handler: bool = True,
256262
exporter_args_map: ExporterArgsMap | None = None,
263+
processor: Type[LogRecordProcessor] | None = None,
257264
):
258265
provider = LoggerProvider(resource=resource)
259266
set_logger_provider(provider)
260267

261268
exporter_args_map = exporter_args_map or {}
269+
log_record_processor = processor or BatchLogRecordProcessor
262270
for _, exporter_class in exporters.items():
263271
exporter_args = exporter_args_map.get(exporter_class, {})
264272
provider.add_log_record_processor(
265-
BatchLogRecordProcessor(exporter_class(**exporter_args))
273+
log_record_processor(exporter_class(**exporter_args))
266274
)
267275

268276
event_logger_provider = EventLoggerProvider(logger_provider=provider)
@@ -416,6 +424,8 @@ def _initialize_components(
416424
id_generator: IdGenerator | None = None,
417425
setup_logging_handler: bool | None = None,
418426
exporter_args_map: ExporterArgsMap | None = None,
427+
span_processor: Type[SpanProcessor] | None = None,
428+
log_record_processor: Type[LogRecordProcessor] | None = None,
419429
):
420430
if trace_exporter_names is None:
421431
trace_exporter_names = []
@@ -451,6 +461,7 @@ def _initialize_components(
451461
sampler=sampler,
452462
resource=resource,
453463
exporter_args_map=exporter_args_map,
464+
processor=span_processor,
454465
)
455466
_init_metrics(
456467
metric_exporters, resource, exporter_args_map=exporter_args_map
@@ -469,6 +480,7 @@ def _initialize_components(
469480
resource,
470481
setup_logging_handler,
471482
exporter_args_map=exporter_args_map,
483+
processor=log_record_processor,
472484
)
473485

474486

opentelemetry-sdk/tests/test_configurator.py

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@
4747
)
4848
from opentelemetry.sdk._logs import LoggingHandler
4949
from opentelemetry.sdk._logs._internal.export import LogExporter
50-
from opentelemetry.sdk._logs.export import ConsoleLogExporter
50+
from opentelemetry.sdk._logs.export import (
51+
ConsoleLogExporter,
52+
SimpleLogRecordProcessor,
53+
)
5154
from opentelemetry.sdk.environment_variables import (
5255
OTEL_TRACES_SAMPLER,
5356
OTEL_TRACES_SAMPLER_ARG,
@@ -62,7 +65,10 @@
6265
)
6366
from opentelemetry.sdk.metrics.view import Aggregation
6467
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
65-
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
68+
from opentelemetry.sdk.trace.export import (
69+
ConsoleSpanExporter,
70+
SimpleSpanProcessor,
71+
)
6672
from opentelemetry.sdk.trace.id_generator import IdGenerator, RandomIdGenerator
6773
from opentelemetry.sdk.trace.sampling import (
6874
ALWAYS_ON,
@@ -396,6 +402,16 @@ def test_trace_init_exporter_uses_exporter_args_map(self):
396402
exporter = provider.processor.exporter
397403
self.assertEqual(exporter.compression, "gzip")
398404

405+
def test_trace_init_custom_span_processor(self):
406+
_init_tracing(
407+
{"otlp": OTLPSpanExporter},
408+
id_generator=RandomIdGenerator(),
409+
processor=SimpleSpanProcessor,
410+
)
411+
412+
provider = self.set_provider_mock.call_args[0][0]
413+
self.assertTrue(isinstance(provider.processor, SimpleSpanProcessor))
414+
399415
@patch.dict(environ, {OTEL_PYTHON_ID_GENERATOR: "custom_id_generator"})
400416
@patch("opentelemetry.sdk._configuration.IdGenerator", new=IdGenerator)
401417
@patch("opentelemetry.sdk._configuration.entry_points")
@@ -706,6 +722,17 @@ def test_logging_init_exporter_uses_exporter_args_map(self):
706722
provider = self.set_provider_mock.call_args[0][0]
707723
self.assertEqual(provider.processor.exporter.compression, "gzip")
708724

725+
def test_logging_init_custom_log_record_processor(self):
726+
with ResetGlobalLoggingState():
727+
resource = Resource.create({})
728+
_init_logging(
729+
{"otlp": DummyOTLPLogExporter},
730+
resource=resource,
731+
processor=SimpleLogRecordProcessor,
732+
)
733+
provider = self.set_provider_mock.call_args[0][0]
734+
self.assertIsInstance(provider.processor, SimpleLogRecordProcessor)
735+
709736
@patch.dict(
710737
environ,
711738
{"OTEL_RESOURCE_ATTRIBUTES": "service.name=otlp-service"},
@@ -742,7 +769,7 @@ def test_logging_init_disable_default(self, logging_mock, tracing_mock):
742769
_initialize_components(auto_instrumentation_version="auto-version")
743770
self.assertEqual(tracing_mock.call_count, 1)
744771
logging_mock.assert_called_once_with(
745-
mock.ANY, mock.ANY, False, exporter_args_map=None
772+
mock.ANY, mock.ANY, False, exporter_args_map=None, processor=None
746773
)
747774

748775
@patch.dict(
@@ -758,7 +785,11 @@ def test_logging_init_enable_env(self, logging_mock, tracing_mock):
758785
with self.assertLogs(level=WARNING):
759786
_initialize_components(auto_instrumentation_version="auto-version")
760787
logging_mock.assert_called_once_with(
761-
mock.ANY, mock.ANY, True, exporter_args_map=None
788+
mock.ANY,
789+
mock.ANY,
790+
True,
791+
exporter_args_map=None,
792+
processor=None,
762793
)
763794
self.assertEqual(tracing_mock.call_count, 1)
764795

@@ -843,6 +874,8 @@ def test_initialize_components_kwargs(
843874
"id_generator": "TEST_GENERATOR",
844875
"setup_logging_handler": True,
845876
"exporter_args_map": {1: {"compression": "gzip"}},
877+
"log_record_processor": SimpleLogRecordProcessor,
878+
"span_processor": SimpleSpanProcessor,
846879
}
847880
_initialize_components(**kwargs)
848881

@@ -877,6 +910,7 @@ def test_initialize_components_kwargs(
877910
sampler="TEST_SAMPLER",
878911
resource="TEST_RESOURCE",
879912
exporter_args_map={1: {"compression": "gzip"}},
913+
processor=SimpleSpanProcessor,
880914
)
881915
metrics_mock.assert_called_once_with(
882916
"TEST_METRICS_EXPORTERS_DICT",
@@ -888,6 +922,7 @@ def test_initialize_components_kwargs(
888922
"TEST_RESOURCE",
889923
True,
890924
exporter_args_map={1: {"compression": "gzip"}},
925+
processor=SimpleLogRecordProcessor,
891926
)
892927

893928
def test_basicConfig_works_with_otel_handler(self):

0 commit comments

Comments
 (0)