Skip to content

Prototype passing a Customizer Class to the Configurator #4469

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions opentelemetry-sdk/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ classifiers = [
"Typing :: Typed",
]
dependencies = [
"opentelemetry-api == 1.31.0.dev",
"opentelemetry-semantic-conventions == 0.52b0.dev",
"opentelemetry-api == 1.30.0",
"opentelemetry-semantic-conventions == 0.51b0",
"typing-extensions >= 3.7.4",
]

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from abc import ABC, abstractmethod
from opentelemetry.sdk._logs.export import LogExporter
from opentelemetry.sdk.metrics.export import (
MetricExporter,
)
from typing import Type
from opentelemetry.sdk.trace.export import SpanExporter


# Class which can be used to customize the configurator.
class _BaseConfiguratorCustomizer(ABC):
@abstractmethod
def init_log_exporter(
self, log_exporter: Type[LogExporter]
) -> LogExporter:
pass

@abstractmethod
def init_metric_exporter(
self,
metric_exporter: Type[MetricExporter],
) -> MetricExporter:
pass

@abstractmethod
def init_span_exporter(
self,
span_exporter: Type[SpanExporter],
) -> SpanExporter:
pass

@abstractmethod
def init_resource(self):
pass
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
OTEL_TRACES_EXPORTER,
)
from opentelemetry.metrics import set_meter_provider
from opentelemetry.sdk._config_customizer import _BaseConfiguratorCustomizer
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor, LogExporter
Expand Down Expand Up @@ -196,6 +197,7 @@ def _init_tracing(
id_generator: IdGenerator | None = None,
sampler: Sampler | None = None,
resource: Resource | None = None,
customizer: _BaseConfiguratorCustomizer | None = None,
):
provider = TracerProvider(
id_generator=id_generator,
Expand All @@ -205,17 +207,19 @@ def _init_tracing(
set_tracer_provider(provider)

for _, exporter_class in exporters.items():
exporter_args = {}
provider.add_span_processor(
BatchSpanProcessor(exporter_class(**exporter_args))
)
if customizer:
exporter = customizer.init_span_exporter(exporter_class)
else:
exporter = exporter_class()
provider.add_span_processor(BatchSpanProcessor(exporter))


def _init_metrics(
exporters_or_readers: dict[
str, Union[Type[MetricExporter], Type[MetricReader]]
],
resource: Resource | None = None,
customizer: _BaseConfiguratorCustomizer | None = None,
):
metric_readers = []

Expand All @@ -225,11 +229,13 @@ def _init_metrics(
if issubclass(exporter_or_reader_class, MetricReader):
metric_readers.append(exporter_or_reader_class(**exporter_args))
else:
metric_readers.append(
PeriodicExportingMetricReader(
exporter_or_reader_class(**exporter_args)
if customizer:
exporter = customizer.init_metric_exporter(
exporter_or_reader_class
)
)
else:
exporter = exporter_or_reader_class()
metric_readers.append(PeriodicExportingMetricReader(exporter))

provider = MeterProvider(resource=resource, metric_readers=metric_readers)
set_meter_provider(provider)
Expand All @@ -239,15 +245,17 @@ def _init_logging(
exporters: dict[str, Type[LogExporter]],
resource: Resource | None = None,
setup_logging_handler: bool = True,
customizer: _BaseConfiguratorCustomizer | None = None,
):
provider = LoggerProvider(resource=resource)
set_logger_provider(provider)

for _, exporter_class in exporters.items():
exporter_args = {}
provider.add_log_record_processor(
BatchLogRecordProcessor(exporter_class(**exporter_args))
)
if customizer:
exporter = customizer.init_log_exporter(exporter_class)
else:
exporter = exporter_class()
provider.add_log_record_processor(BatchLogRecordProcessor(exporter))

event_logger_provider = EventLoggerProvider(logger_provider=provider)
set_event_logger_provider(event_logger_provider)
Expand Down Expand Up @@ -370,6 +378,7 @@ def _initialize_components(
resource_attributes: Attributes | None = None,
id_generator: IdGenerator | None = None,
setup_logging_handler: bool | None = None,
customizer: _BaseConfiguratorCustomizer | None = None,
):
if trace_exporter_names is None:
trace_exporter_names = []
Expand Down Expand Up @@ -397,15 +406,19 @@ def _initialize_components(
)
# if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name
# from the env variable else defaults to "unknown_service"
resource = Resource.create(resource_attributes)
if customizer:
resource = customizer.init_resource()
else:
resource = Resource.create(resource_attributes)

_init_tracing(
exporters=span_exporters,
id_generator=id_generator,
sampler=sampler,
resource=resource,
customizer=customizer,
)
_init_metrics(metric_exporters, resource)
_init_metrics(metric_exporters, resource, customizer)
if setup_logging_handler is None:
setup_logging_handler = (
os.getenv(
Expand All @@ -415,7 +428,9 @@ def _initialize_components(
.lower()
== "true"
)
_init_logging(log_exporters, resource, setup_logging_handler)
_init_logging(
log_exporters, resource, setup_logging_handler, customizer=customizer
)


class _BaseConfigurator(ABC):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.

__version__ = "1.31.0.dev"
__version__ = "1.30.0"