|
14 | 14 | # See the License for the specific language governing permissions and
|
15 | 15 | # limitations under the License.
|
16 | 16 |
|
| 17 | +import logging |
17 | 18 | import os
|
18 |
| -from logging import getLogger |
19 | 19 |
|
| 20 | +from opentelemetry._logs import set_logger_provider |
| 21 | +from opentelemetry._events import set_event_logger_provider |
20 | 22 | from opentelemetry.environment_variables import (
|
21 | 23 | OTEL_LOGS_EXPORTER,
|
22 | 24 | OTEL_METRICS_EXPORTER,
|
|
28 | 30 | _DEFAULT_CONFIG as SYSTEM_METRICS_DEFAULT_CONFIG,
|
29 | 31 | SystemMetricsInstrumentor,
|
30 | 32 | )
|
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 |
32 | 48 | from opentelemetry.sdk.environment_variables import (
|
33 | 49 | OTEL_METRICS_EXEMPLAR_FILTER,
|
34 | 50 | OTEL_EXPERIMENTAL_RESOURCE_DETECTORS,
|
35 | 51 | OTEL_EXPORTER_OTLP_PROTOCOL,
|
| 52 | + _OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, |
36 | 53 | )
|
| 54 | +from opentelemetry.sdk.resources import Resource |
37 | 55 | from opentelemetry.util._importlib_metadata import EntryPoint
|
38 | 56 |
|
39 | 57 | from elasticotel.distro.environment_variables import ELASTIC_OTEL_SYSTEM_METRICS_ENABLED
|
40 | 58 |
|
41 | 59 |
|
42 |
| -logger = getLogger(__name__) |
| 60 | +logger = logging.getLogger(__name__) |
43 | 61 |
|
44 | 62 |
|
45 | 63 | 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) |
47 | 117 |
|
48 | 118 |
|
49 | 119 | class ElasticOpenTelemetryDistro(BaseDistro):
|
|
0 commit comments