diff options
Diffstat (limited to '.venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils')
-rw-r--r-- | .venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils/__init__.py | 65 | ||||
-rw-r--r-- | .venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils/configurations.py | 178 |
2 files changed, 243 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils/__init__.py b/.venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils/__init__.py new file mode 100644 index 00000000..1de00af4 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils/__init__.py @@ -0,0 +1,65 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License in the project root for +# license information. +# -------------------------------------------------------------------------- + +import logging +import platform +from os import environ +from pathlib import Path + +from azure.monitor.opentelemetry.exporter._connection_string_parser import ( # pylint: disable=import-error,no-name-in-module + ConnectionStringParser, +) +from azure.monitor.opentelemetry.exporter._utils import ( # pylint: disable=import-error,no-name-in-module + _is_on_app_service, +) +from azure.monitor.opentelemetry._constants import ( + _LOG_PATH_LINUX, + _LOG_PATH_WINDOWS, +) + + +logger = logging.getLogger(__name__) + + +# --------------------Diagnostic/status logging------------------------------ + +# TODO: Add environment variable to enabled diagnostics off of App Service +_IS_DIAGNOSTICS_ENABLED = _is_on_app_service() +_CUSTOMER_IKEY_ENV_VAR = None + + +# pylint: disable=global-statement +def _get_customer_ikey_from_env_var(): + global _CUSTOMER_IKEY_ENV_VAR + if not _CUSTOMER_IKEY_ENV_VAR: + _CUSTOMER_IKEY_ENV_VAR = "unknown" + try: + _CUSTOMER_IKEY_ENV_VAR = ConnectionStringParser().instrumentation_key + except ValueError as e: + logger.error("Failed to parse Instrumentation Key: %s", e) # pylint: disable=C + return _CUSTOMER_IKEY_ENV_VAR + + +def _get_log_path(status_log_path=False): + system = platform.system() + if system == "Linux": + return _LOG_PATH_LINUX + if system == "Windows": + log_path = str(Path.home()) + _LOG_PATH_WINDOWS + if status_log_path: + return log_path + "\\status" + return log_path + return None + + +def _env_var_or_default(var_name, default_val=""): + try: + return environ[var_name] + except KeyError: + return default_val + + +_EXTENSION_VERSION = _env_var_or_default("ApplicationInsightsAgent_EXTENSION_VERSION", "disabled") diff --git a/.venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils/configurations.py b/.venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils/configurations.py new file mode 100644 index 00000000..ff1d38aa --- /dev/null +++ b/.venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils/configurations.py @@ -0,0 +1,178 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License in the project root for +# license information. +# -------------------------------------------------------------------------- + +from logging import getLogger +from os import environ +from typing import Dict + +from opentelemetry.environment_variables import ( + OTEL_LOGS_EXPORTER, + OTEL_METRICS_EXPORTER, + OTEL_TRACES_EXPORTER, +) +from opentelemetry.instrumentation.environment_variables import ( + OTEL_PYTHON_DISABLED_INSTRUMENTATIONS, +) +from opentelemetry.sdk.environment_variables import ( + OTEL_EXPERIMENTAL_RESOURCE_DETECTORS, + OTEL_TRACES_SAMPLER_ARG, +) +from opentelemetry.sdk.resources import Resource + +from azure.monitor.opentelemetry._constants import ( + _AZURE_APP_SERVICE_RESOURCE_DETECTOR_NAME, + _AZURE_VM_RESOURCE_DETECTOR_NAME, + _FULLY_SUPPORTED_INSTRUMENTED_LIBRARIES, + _PREVIEW_INSTRUMENTED_LIBRARIES, + DISABLE_LOGGING_ARG, + DISABLE_METRICS_ARG, + DISABLE_TRACING_ARG, + DISTRO_VERSION_ARG, + ENABLE_LIVE_METRICS_ARG, + INSTRUMENTATION_OPTIONS_ARG, + LOGGER_NAME_ARG, + RESOURCE_ARG, + SAMPLING_RATIO_ARG, + SPAN_PROCESSORS_ARG, + VIEWS_ARG, +) +from azure.monitor.opentelemetry._types import ConfigurationValue +from azure.monitor.opentelemetry._version import VERSION + + +_INVALID_FLOAT_MESSAGE = "Value of %s must be a float. Defaulting to %s: %s" +_SUPPORTED_RESOURCE_DETECTORS = ( + _AZURE_APP_SERVICE_RESOURCE_DETECTOR_NAME, + _AZURE_VM_RESOURCE_DETECTOR_NAME, +) +# TODO: remove when sampler uses env var instead +SAMPLING_RATIO_ENV_VAR = OTEL_TRACES_SAMPLER_ARG + + +_logger = getLogger(__name__) + + +def _get_configurations(**kwargs) -> Dict[str, ConfigurationValue]: + configurations = {} + + for key, val in kwargs.items(): + configurations[key] = val + configurations[DISTRO_VERSION_ARG] = VERSION + + _default_disable_logging(configurations) + _default_disable_metrics(configurations) + _default_disable_tracing(configurations) + _default_logger_name(configurations) + _default_resource(configurations) + _default_sampling_ratio(configurations) + _default_instrumentation_options(configurations) + _default_span_processors(configurations) + _default_enable_live_metrics(configurations) + _default_views(configurations) + + return configurations + + +def _default_disable_logging(configurations): + default = False + if OTEL_LOGS_EXPORTER in environ: + if environ[OTEL_LOGS_EXPORTER].lower().strip() == "none": + default = True + configurations[DISABLE_LOGGING_ARG] = default + + +def _default_disable_metrics(configurations): + default = False + if OTEL_METRICS_EXPORTER in environ: + if environ[OTEL_METRICS_EXPORTER].lower().strip() == "none": + default = True + configurations[DISABLE_METRICS_ARG] = default + + +def _default_disable_tracing(configurations): + default = False + if OTEL_TRACES_EXPORTER in environ: + if environ[OTEL_TRACES_EXPORTER].lower().strip() == "none": + default = True + configurations[DISABLE_TRACING_ARG] = default + + +def _default_logger_name(configurations): + configurations.setdefault(LOGGER_NAME_ARG, "") + + +def _default_resource(configurations): + environ.setdefault(OTEL_EXPERIMENTAL_RESOURCE_DETECTORS, ",".join(_SUPPORTED_RESOURCE_DETECTORS)) + if RESOURCE_ARG not in configurations: + configurations[RESOURCE_ARG] = Resource.create() + else: + configurations[RESOURCE_ARG] = Resource.create(configurations[RESOURCE_ARG].attributes) + + +# TODO: remove when sampler uses env var instead +def _default_sampling_ratio(configurations): + default = 1.0 + if SAMPLING_RATIO_ENV_VAR in environ: + try: + default = float(environ[SAMPLING_RATIO_ENV_VAR]) + except ValueError as e: + _logger.error( # pylint: disable=C + _INVALID_FLOAT_MESSAGE, + SAMPLING_RATIO_ENV_VAR, + default, + e, + ) + configurations[SAMPLING_RATIO_ARG] = default + + +def _default_instrumentation_options(configurations): + otel_disabled_instrumentations = _get_otel_disabled_instrumentations() + + merged_instrumentation_options = {} + instrumentation_options = configurations.get(INSTRUMENTATION_OPTIONS_ARG, {}) + for lib_name in _FULLY_SUPPORTED_INSTRUMENTED_LIBRARIES: + disabled_by_env_var = lib_name in otel_disabled_instrumentations + options = {"enabled": not disabled_by_env_var} + options.update(instrumentation_options.get(lib_name, {})) + merged_instrumentation_options[lib_name] = options + for lib_name in _PREVIEW_INSTRUMENTED_LIBRARIES: + options = {"enabled": False} + options.update(instrumentation_options.get(lib_name, {})) + merged_instrumentation_options[lib_name] = options + + configurations[INSTRUMENTATION_OPTIONS_ARG] = merged_instrumentation_options + + +def _default_span_processors(configurations): + configurations.setdefault(SPAN_PROCESSORS_ARG, []) + + +def _default_enable_live_metrics(configurations): + configurations.setdefault(ENABLE_LIVE_METRICS_ARG, False) + + +def _default_views(configurations): + configurations.setdefault(VIEWS_ARG, []) + + +def _get_otel_disabled_instrumentations(): + disabled_instrumentation = environ.get(OTEL_PYTHON_DISABLED_INSTRUMENTATIONS, "") + disabled_instrumentation = disabled_instrumentation.split(",") + # to handle users entering "requests , flask" or "requests, flask" with spaces + disabled_instrumentation = [x.strip() for x in disabled_instrumentation] + return disabled_instrumentation + + +def _is_instrumentation_enabled(configurations, lib_name): + if INSTRUMENTATION_OPTIONS_ARG not in configurations: + return False + instrumentation_options = configurations[INSTRUMENTATION_OPTIONS_ARG] + if not lib_name in instrumentation_options: + return False + library_options = instrumentation_options[lib_name] + if "enabled" not in library_options: + return False + return library_options["enabled"] is True |