Skip to content

Commit c9c4ab4

Browse files
committed
distro: enable log events by default
Change the semantics of _OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED to only affect the setup of the OTel handler to the python logging module.
1 parent 9227a8a commit c9c4ab4

File tree

1 file changed

+73
-2
lines changed

1 file changed

+73
-2
lines changed

src/elasticotel/distro/__init__.py

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414
# See the License for the specific language governing permissions and
1515
# limitations under the License.
1616

17+
import logging
1718
import os
1819
from logging import getLogger
1920

21+
from opentelemetry._logs import set_logger_provider
22+
from opentelemetry._events import set_event_logger_provider
2023
from opentelemetry.environment_variables import (
2124
OTEL_LOGS_EXPORTER,
2225
OTEL_METRICS_EXPORTER,
@@ -28,12 +31,28 @@
2831
_DEFAULT_CONFIG as SYSTEM_METRICS_DEFAULT_CONFIG,
2932
SystemMetricsInstrumentor,
3033
)
31-
from opentelemetry.sdk._configuration import _OTelSDKConfigurator
34+
from opentelemetry.semconv.resource import ResourceAttributes
35+
from opentelemetry.sdk._configuration import (
36+
_OTelSDKConfigurator,
37+
_import_exporters,
38+
_get_exporter_names,
39+
_get_sampler,
40+
_import_sampler,
41+
_get_id_generator,
42+
_import_id_generator,
43+
_init_tracing,
44+
_init_metrics,
45+
)
46+
from opentelemetry.sdk._events import EventLoggerProvider
47+
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
48+
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
3249
from opentelemetry.sdk.environment_variables import (
3350
OTEL_METRICS_EXEMPLAR_FILTER,
3451
OTEL_EXPERIMENTAL_RESOURCE_DETECTORS,
3552
OTEL_EXPORTER_OTLP_PROTOCOL,
53+
_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED,
3654
)
55+
from opentelemetry.sdk.resources import Resource
3756
from opentelemetry.util._importlib_metadata import EntryPoint
3857

3958
from elasticotel.distro.environment_variables import ELASTIC_OTEL_SYSTEM_METRICS_ENABLED
@@ -43,7 +62,59 @@
4362

4463

4564
class ElasticOpenTelemetryConfigurator(_OTelSDKConfigurator):
46-
pass
65+
def _configure(self, **kwargs):
66+
"""This is overriden to enable the log machinery (and thus log events) without
67+
attaching the OTel handler to the Python logging module.
68+
69+
This code is a simplified version of _initialize_components plus the changes
70+
required to have log events enabled out of the box"""
71+
span_exporters, metric_exporters, log_exporters = _import_exporters(
72+
_get_exporter_names("traces"),
73+
_get_exporter_names("metrics"),
74+
_get_exporter_names("logs"),
75+
)
76+
sampler_name = _get_sampler()
77+
sampler = _import_sampler(sampler_name)
78+
id_generator_name = _get_id_generator()
79+
id_generator = _import_id_generator(id_generator_name)
80+
81+
resource_attributes = {}
82+
# populate version if using auto-instrumentation
83+
auto_instrumentation_version = kwargs.get("auto_instrumentation_version")
84+
if auto_instrumentation_version:
85+
resource_attributes[ResourceAttributes.TELEMETRY_AUTO_VERSION] = auto_instrumentation_version
86+
# if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name
87+
# from the env variable else defaults to "unknown_service"
88+
resource = Resource.create(resource_attributes)
89+
90+
_init_tracing(
91+
exporters=span_exporters,
92+
id_generator=id_generator,
93+
sampler=sampler,
94+
resource=resource,
95+
)
96+
_init_metrics(metric_exporters, resource)
97+
98+
# from here we change the semantics of _OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED from
99+
# controlling all the logging support to just the logging handler. So we can use log events without
100+
# exporting all the logs to OTLP
101+
logger_provider = LoggerProvider(resource=resource)
102+
set_logger_provider(logger_provider)
103+
104+
for _, exporter_class in log_exporters.items():
105+
exporter_args = {}
106+
logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter_class(**exporter_args)))
107+
108+
setup_logging_handler = (
109+
os.getenv(_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, "false").strip().lower() == "true"
110+
)
111+
if setup_logging_handler:
112+
handler = LoggingHandler(level=logging.NOTSET, logger_provider=logger_provider)
113+
logging.getLogger().addHandler(handler)
114+
115+
# now setup the event logger
116+
event_logger_provider = EventLoggerProvider(logger_provider=logger_provider)
117+
set_event_logger_provider(event_logger_provider)
47118

48119

49120
class ElasticOpenTelemetryDistro(BaseDistro):

0 commit comments

Comments
 (0)