1616
1717from dataclasses import dataclass
1818from dataclasses import field
19+ import os
1920from typing import Optional
2021
2122from opentelemetry import _events
2526from opentelemetry .sdk ._events import EventLoggerProvider
2627from opentelemetry .sdk ._logs import LoggerProvider
2728from opentelemetry .sdk ._logs import LogRecordProcessor
29+ from opentelemetry .sdk ._logs .export import BatchLogRecordProcessor
30+ import opentelemetry .sdk .environment_variables as otel_env
2831from opentelemetry .sdk .metrics import MeterProvider
2932from opentelemetry .sdk .metrics .export import MetricReader
33+ from opentelemetry .sdk .metrics .export import PeriodicExportingMetricReader
3034from opentelemetry .sdk .resources import OTELResourceDetector
3135from opentelemetry .sdk .resources import Resource
3236from opentelemetry .sdk .trace import SpanProcessor
3337from opentelemetry .sdk .trace import TracerProvider
38+ from opentelemetry .sdk .trace .export import BatchSpanProcessor
3439
3540from ..utils .feature_decorator import experimental
3641
@@ -50,6 +55,14 @@ def maybe_set_otel_providers(
5055 """Sets up OTel providers if hooks for a given telemetry type were
5156 passed.
5257
58+ Additionally adds generic OTLP exporters based on following env variables:
59+ OTEL_EXPORTER_OTLP_ENDPOINT
60+ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
61+ OTEL_EXPORTER_OTLP_METRICS_ENDPOINT
62+ OTEL_EXPORTER_OTLP_LOGS_ENDPOINT
63+ See https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/
64+ for how they are used.
65+
5366 If a provider for a specific telemetry type was already globally set -
5467 this function will not override it or register more exporters.
5568
@@ -65,6 +78,9 @@ def maybe_set_otel_providers(
6578 if otel_resource is None :
6679 otel_resource = _get_otel_resource ()
6780
81+ # Add generic OTel exporters based on OTel env variables.
82+ otel_hooks_to_setup .append (_get_otel_exporters ())
83+
6884 span_processors = []
6985 metric_readers = []
7086 log_record_processors = []
@@ -115,3 +131,47 @@ def _get_otel_resource() -> Resource:
115131 # The OTELResourceDetector populates resource labels from
116132 # environment variables like OTEL_SERVICE_NAME and OTEL_RESOURCE_ATTRIBUTES.
117133 return OTELResourceDetector ().detect ()
134+
135+
136+ def _get_otel_exporters () -> OTelHooks :
137+ span_processors = []
138+ if os .getenv (otel_env .OTEL_EXPORTER_OTLP_ENDPOINT ) or os .getenv (
139+ otel_env .OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
140+ ):
141+ span_processors .append (_get_otel_span_exporter ())
142+
143+ metric_readers = []
144+ if os .getenv (otel_env .OTEL_EXPORTER_OTLP_ENDPOINT ) or os .getenv (
145+ otel_env .OTEL_EXPORTER_OTLP_METRICS_ENDPOINT
146+ ):
147+ metric_readers .append (_get_otel_metrics_exporter ())
148+
149+ log_record_processors = []
150+ if os .getenv (otel_env .OTEL_EXPORTER_OTLP_ENDPOINT ) or os .getenv (
151+ otel_env .OTEL_EXPORTER_OTLP_LOGS_ENDPOINT
152+ ):
153+ log_record_processors .append (_get_otel_logs_exporter ())
154+
155+ return OTelHooks (
156+ span_processors = span_processors ,
157+ metric_readers = metric_readers ,
158+ log_record_processors = log_record_processors ,
159+ )
160+
161+
162+ def _get_otel_span_exporter () -> SpanProcessor :
163+ from opentelemetry .exporter .otlp .proto .http .trace_exporter import OTLPSpanExporter
164+
165+ return BatchSpanProcessor (OTLPSpanExporter ())
166+
167+
168+ def _get_otel_metrics_exporter () -> MetricReader :
169+ from opentelemetry .exporter .otlp .proto .http .metric_exporter import OTLPMetricExporter
170+
171+ return PeriodicExportingMetricReader (OTLPMetricExporter ())
172+
173+
174+ def _get_otel_logs_exporter () -> LogRecordProcessor :
175+ from opentelemetry .exporter .otlp .proto .http ._log_exporter import OTLPLogExporter
176+
177+ return BatchLogRecordProcessor (OTLPLogExporter ())
0 commit comments