Skip to content

Commit 40ae8be

Browse files
authored
distro: enable log events by default (#154)
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 936b752 commit 40ae8be

File tree

1 file changed

+74
-4
lines changed

1 file changed

+74
-4
lines changed

src/elasticotel/distro/__init__.py

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

17+
import logging
1718
import os
18-
from logging import getLogger
1919

20+
from opentelemetry._logs import set_logger_provider
21+
from opentelemetry._events import set_event_logger_provider
2022
from opentelemetry.environment_variables import (
2123
OTEL_LOGS_EXPORTER,
2224
OTEL_METRICS_EXPORTER,
@@ -28,22 +30,90 @@
2830
_DEFAULT_CONFIG as SYSTEM_METRICS_DEFAULT_CONFIG,
2931
SystemMetricsInstrumentor,
3032
)
31-
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
3248
from opentelemetry.sdk.environment_variables import (
3349
OTEL_METRICS_EXEMPLAR_FILTER,
3450
OTEL_EXPERIMENTAL_RESOURCE_DETECTORS,
3551
OTEL_EXPORTER_OTLP_PROTOCOL,
52+
_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED,
3653
)
54+
from opentelemetry.sdk.resources import Resource
3755
from opentelemetry.util._importlib_metadata import EntryPoint
3856

3957
from elasticotel.distro.environment_variables import ELASTIC_OTEL_SYSTEM_METRICS_ENABLED
4058

4159

42-
logger = getLogger(__name__)
60+
logger = logging.getLogger(__name__)
4361

4462

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

48118

49119
class ElasticOpenTelemetryDistro(BaseDistro):

0 commit comments

Comments
 (0)