aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/azure/monitor/opentelemetry/_diagnostics/diagnostic_logging.py
blob: f4e05e39ca5c17e10bb693a58f5538d05488ccb3 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# -------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License in the project root for
# license information.
# --------------------------------------------------------------------------

import logging
import threading
from os import makedirs
from os.path import exists, join

from azure.monitor.opentelemetry._utils import (
    _EXTENSION_VERSION,
    _IS_DIAGNOSTICS_ENABLED,
    _env_var_or_default,
    _get_customer_ikey_from_env_var,
    _get_log_path,
)
from azure.monitor.opentelemetry._version import VERSION

_DIAGNOSTIC_LOGGER_FILE_NAME = "applicationinsights-extension.log"
_SITE_NAME = _env_var_or_default("WEBSITE_SITE_NAME")
_SUBSCRIPTION_ID_ENV_VAR = _env_var_or_default("WEBSITE_OWNER_NAME")
_SUBSCRIPTION_ID = _SUBSCRIPTION_ID_ENV_VAR.split("+")[0] if _SUBSCRIPTION_ID_ENV_VAR else None
_logger = logging.getLogger(__name__)
_logger.propagate = False
_logger.setLevel(logging.DEBUG)
_DIAGNOSTIC_LOG_PATH = _get_log_path()

_DISTRO_DETECTS_ATTACH = "4100"
_INFO = "4101"
_INSTRUMENTATION_SKIPPED = "4101"

_ATTACH_SUCCESS_DISTRO = "4200"
_ATTACH_SUCCESS_CONFIGURATOR = "4201"
_INSTRUMENTATION_SUCCEEDED = "4202"

_DEPENDENCY_OVERLAP = "4300"

_ATTACH_FAILURE_DISTRO = "4400"
_ATTACH_FAILURE_CONFIGURATOR = "4401"
_ATTACH_DETECTS_SDK = "4402"
_INSTRUMENTATION_FAILED = "4403"


class AzureDiagnosticLogging:
    _initialized = False
    _lock = threading.Lock()

    @classmethod
    def _initialize(cls):
        with AzureDiagnosticLogging._lock:
            if not AzureDiagnosticLogging._initialized:
                if _IS_DIAGNOSTICS_ENABLED and _DIAGNOSTIC_LOG_PATH:
                    log_format = (
                        "{"
                        + '"time":"%(asctime)s.%(msecs)03d", '
                        + '"level":"%(levelname)s", '
                        + '"logger":"%(name)s", '
                        + '"message":"%(message)s", '
                        + '"properties":{'
                        + '"operation":"Startup", '
                        + f'"siteName":"{_SITE_NAME}", '
                        + f'"ikey":"{_get_customer_ikey_from_env_var()}", '
                        + f'"extensionVersion":"{_EXTENSION_VERSION}", '
                        + f'"sdkVersion":"{VERSION}", '
                        + f'"subscriptionId":"{_SUBSCRIPTION_ID}", '
                        + '"msgId":"%(msgId)s", '
                        + '"language":"python"'
                        + "}"
                        + "}"
                    )
                    if not exists(_DIAGNOSTIC_LOG_PATH):
                        makedirs(_DIAGNOSTIC_LOG_PATH)
                    f_handler = logging.FileHandler(join(_DIAGNOSTIC_LOG_PATH, _DIAGNOSTIC_LOGGER_FILE_NAME))
                    formatter = logging.Formatter(fmt=log_format, datefmt="%Y-%m-%dT%H:%M:%S")
                    f_handler.setFormatter(formatter)
                    _logger.addHandler(f_handler)
                    AzureDiagnosticLogging._initialized = True

    @classmethod
    def debug(cls, message: str, message_id: str):
        AzureDiagnosticLogging._initialize()
        _logger.debug(message, extra={"msgId": message_id})

    @classmethod
    def info(cls, message: str, message_id: str):
        AzureDiagnosticLogging._initialize()
        _logger.info(message, extra={"msgId": message_id})

    @classmethod
    def warning(cls, message: str, message_id: str):
        AzureDiagnosticLogging._initialize()
        _logger.warning(message, extra={"msgId": message_id})

    @classmethod
    def error(cls, message: str, message_id: str):
        AzureDiagnosticLogging._initialize()
        _logger.error(message, extra={"msgId": message_id})