Skip to content

Commit 5515e61

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 aca812a commit 5515e61

File tree

1 file changed

+72
-2
lines changed

1 file changed

+72
-2
lines changed

src/elasticotel/distro/__init__.py

Lines changed: 72 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_METRICS_EXPORTER,
2225
OTEL_TRACES_EXPORTER,
@@ -27,11 +30,27 @@
2730
_DEFAULT_CONFIG as SYSTEM_METRICS_DEFAULT_CONFIG,
2831
SystemMetricsInstrumentor,
2932
)
30-
from opentelemetry.sdk._configuration import _OTelSDKConfigurator
33+
from opentelemetry.semconv.resource import ResourceAttributes
34+
from opentelemetry.sdk._configuration import (
35+
_OTelSDKConfigurator,
36+
_import_exporters,
37+
_get_exporter_names,
38+
_get_sampler,
39+
_import_sampler,
40+
_get_id_generator,
41+
_import_id_generator,
42+
_init_tracing,
43+
_init_metrics,
44+
)
45+
from opentelemetry.sdk._events import EventLoggerProvider
46+
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
47+
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
3148
from opentelemetry.sdk.environment_variables import (
3249
OTEL_EXPERIMENTAL_RESOURCE_DETECTORS,
3350
OTEL_EXPORTER_OTLP_PROTOCOL,
51+
_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED,
3452
)
53+
from opentelemetry.sdk.resources import Resource
3554
from pkg_resources import EntryPoint
3655

3756
from elasticotel.distro.environment_variables import ELASTIC_OTEL_SYSTEM_METRICS_ENABLED
@@ -41,7 +60,58 @@
4160

4261

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

46116

47117
class ElasticOpenTelemetryDistro(BaseDistro):

0 commit comments

Comments
 (0)