From 1aa2ac3c860bfff89d26e48e6b51329fa430563f Mon Sep 17 00:00:00 2001 From: tammy-baylis-swi Date: Thu, 4 Apr 2024 15:44:02 -0700 Subject: [PATCH 1/2] PoC: logging handler based on log_correlation --- solarwinds_apm/apm_config.py | 3 +++ solarwinds_apm/apm_logging.py | 21 ++++++++++++++++----- solarwinds_apm/configurator.py | 3 +++ solarwinds_apm/distro.py | 3 +++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/solarwinds_apm/apm_config.py b/solarwinds_apm/apm_config.py index 67754c8a..e7cd0bb7 100644 --- a/solarwinds_apm/apm_config.py +++ b/solarwinds_apm/apm_config.py @@ -33,9 +33,12 @@ INTL_SWO_SUPPORT_EMAIL, INTL_SWO_TRACECONTEXT_PROPAGATOR, ) +from solarwinds_apm.apm_logging import _stream_handler from solarwinds_apm.certs.ao_issuer_ca import get_public_cert logger = logging.getLogger(__name__) +if not logger.hasHandlers(): + logger.addHandler(_stream_handler) class OboeTracingMode: diff --git a/solarwinds_apm/apm_logging.py b/solarwinds_apm/apm_logging.py index 4c084990..3b6823a9 100644 --- a/solarwinds_apm/apm_logging.py +++ b/solarwinds_apm/apm_logging.py @@ -38,6 +38,10 @@ import os from logging.handlers import RotatingFileHandler +from opentelemetry.instrumentation.logging.environment_variables import ( + OTEL_PYTHON_LOG_CORRELATION, +) + class ApmLoggingType: """Mapping of supported solarwinds_apm library log types""" @@ -142,6 +146,9 @@ def _get_logger(): - When _get_logger is invoked, SW_APM_DEBUG_LEVEL is checked and the logging level will be set to the value provided by the variable. If an invalid value has been provided, the logging level will not be changed. (2) By invoking set_sw_log_level + + Special case: if the environment variable OTEL_PYTHON_LOG_CORRELATION is set, then APM Python + will not set up its own stream handling. """ # create base logger for solarwinds_apm package @@ -163,11 +170,15 @@ def _get_logger(): _logger.setLevel(ApmLoggingLevel.logging_map[log_level]) - if log_level != ApmLoggingLevel.debug_levels["OBOE_DEBUG_DISABLE"]: - _logger.addHandler(_stream_handler) - else: - _logger.propagate = False - _logger.addHandler(logging.NullHandler()) + upstream_log_correlation = ( + os.environ.get(OTEL_PYTHON_LOG_CORRELATION, "false").lower() == "true" + ) + if not upstream_log_correlation: + if log_level != ApmLoggingLevel.debug_levels["OBOE_DEBUG_DISABLE"]: + _logger.addHandler(_stream_handler) + else: + _logger.propagate = False + _logger.addHandler(logging.NullHandler()) return _logger diff --git a/solarwinds_apm/configurator.py b/solarwinds_apm/configurator.py index ecfd8451..c843c2e6 100644 --- a/solarwinds_apm/configurator.py +++ b/solarwinds_apm/configurator.py @@ -54,6 +54,7 @@ INTL_SWO_SUPPORT_EMAIL, ) from solarwinds_apm.apm_fwkv_manager import SolarWindsFrameworkKvManager +from solarwinds_apm.apm_logging import _stream_handler from solarwinds_apm.apm_oboe_codes import OboeReporterCode from solarwinds_apm.apm_txname_manager import SolarWindsTxnNameManager from solarwinds_apm.response_propagator import ( @@ -73,6 +74,8 @@ solarwinds_apm_logger = apm_logging.logger logger = logging.getLogger(__name__) +if not logger.hasHandlers(): + logger.addHandler(_stream_handler) class SolarWindsConfigurator(_OTelSDKConfigurator): diff --git a/solarwinds_apm/distro.py b/solarwinds_apm/distro.py index 80e521de..ff538dea 100644 --- a/solarwinds_apm/distro.py +++ b/solarwinds_apm/distro.py @@ -33,6 +33,7 @@ INTL_SWO_DEFAULT_PROPAGATORS, INTL_SWO_DEFAULT_TRACES_EXPORTER, ) +from solarwinds_apm.apm_logging import _stream_handler from solarwinds_apm.version import __version__ as apm_version _EXPORTER_BY_OTLP_PROTOCOL = { @@ -41,6 +42,8 @@ } logger = logging.getLogger(__name__) +if not logger.hasHandlers(): + logger.addHandler(_stream_handler) class SolarWindsDistro(BaseDistro): From 99181aa13572168bc7cb36e8cca7f532e0e3560d Mon Sep 17 00:00:00 2001 From: tammy-baylis-swi Date: Tue, 9 Apr 2024 15:58:42 -0700 Subject: [PATCH 2/2] Add comments --- solarwinds_apm/apm_config.py | 1 + solarwinds_apm/configurator.py | 1 + solarwinds_apm/distro.py | 1 + 3 files changed, 3 insertions(+) diff --git a/solarwinds_apm/apm_config.py b/solarwinds_apm/apm_config.py index e7cd0bb7..731f90ca 100644 --- a/solarwinds_apm/apm_config.py +++ b/solarwinds_apm/apm_config.py @@ -37,6 +37,7 @@ from solarwinds_apm.certs.ao_issuer_ca import get_public_cert logger = logging.getLogger(__name__) +# This startup component must always log if not logger.hasHandlers(): logger.addHandler(_stream_handler) diff --git a/solarwinds_apm/configurator.py b/solarwinds_apm/configurator.py index c843c2e6..163f0360 100644 --- a/solarwinds_apm/configurator.py +++ b/solarwinds_apm/configurator.py @@ -74,6 +74,7 @@ solarwinds_apm_logger = apm_logging.logger logger = logging.getLogger(__name__) +# This startup component must always log if not logger.hasHandlers(): logger.addHandler(_stream_handler) diff --git a/solarwinds_apm/distro.py b/solarwinds_apm/distro.py index ff538dea..20877b4b 100644 --- a/solarwinds_apm/distro.py +++ b/solarwinds_apm/distro.py @@ -42,6 +42,7 @@ } logger = logging.getLogger(__name__) +# This startup component must always log if not logger.hasHandlers(): logger.addHandler(_stream_handler)