about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils
diff options
context:
space:
mode:
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__.py65
-rw-r--r--.venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_utils/configurations.py178
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