Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@

- Updated FastAPI sample
([#34738](https://github.com/Azure/azure-sdk-for-python/pull/34738))
- Set up branching logic for attach function
([#35066](https://github.com/Azure/azure-sdk-for-python/pull/35066))

## 1.0.0b23 (2024-02-28)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ def _is_on_functions():
return environ.get(_FUNCTIONS_WORKER_RUNTIME) is not None

def _is_attach_enabled():
return isdir("/agents/python/")
if _is_on_app_service():
return isdir("/agents/python/")
return False


# AKS
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,110 +104,161 @@ def test_create_telemetry_item(self, mock_ns_to_iso_str):
)
self.assertEqual(result, expected)

# Unknown
# Unknown SDK Version Prefix

@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
def test_get_sdk_version_prefix(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "uum_")

@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
def test_get_sdk_version_prefix_linux(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "ulm_")

@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
def test_get_sdk_version_prefix_windows(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "uwm_")

# App Service
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
def test_get_sdk_version_prefix_attach(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "uui_")

@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
def test_get_sdk_version_prefix_attach_linux(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "uli_")

@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
def test_get_sdk_version_prefix_attach_windows(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "uwi_")

# App Service SDK Version Prefix

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME})
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
def test_get_sdk_version_prefix_app_service(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "aum_")

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME})
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
def test_get_sdk_version_prefix_app_service_linux(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "alm_")

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME})
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
def test_get_sdk_version_prefix_app_service_windows(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "awm_")

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME})
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=True)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
def test_get_sdk_version_prefix_app_service_attach(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "aui_")

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME})
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=True)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
def test_get_sdk_version_prefix_app_service_linux_attach(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "ali_")

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME})
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=True)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
def test_get_sdk_version_prefix_app_service_windows_attach(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "awi_")

# Function
# Function SDK Version Prefix

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME})
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
def test_get_sdk_version_prefix_function(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "fum_")

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME})
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
def test_get_sdk_version_prefix_function_linux(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "flm_")

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME})
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
def test_get_sdk_version_prefix_function_windows(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "fwm_")

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME})
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=True)
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
def test_get_sdk_version_prefix_function_attach(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "fui_")

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME})
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=True)
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
def test_get_sdk_version_prefix_function_linux_attach(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "fli_")

@patch("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME})
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=True)
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME}, clear=True)
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
def test_get_sdk_version_prefix_function_windows_attach(self, mock_system, mock_getenv):
result = _utils._get_sdk_version_prefix()
self.assertEqual(result, "fwi_")

# Attach

@patch(
"azure.monitor.opentelemetry.exporter._utils.isdir",
return_value=True,
)
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME})
def test_attach_enabled(self, mock_isdir):
self.assertEqual(
_utils._is_attach_enabled(), True
)

@patch(
"azure.monitor.opentelemetry.exporter._utils.isdir",
return_value=False,
)
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {"WEBSITE_SITE_NAME": TEST_WEBSITE_SITE_NAME})
def test_attach_app_service_disabled(self, mock_isdir):
self.assertEqual(
_utils._is_attach_enabled(), False
)

@patch(
"azure.monitor.opentelemetry.exporter._utils.isdir",
return_value=True,
)
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {}, clear=True)
def test_attach_off_app_service_with_agent(self, mock_isdir):
# This is not an expected scenario and just tests the default
self.assertEqual(
_utils._is_attach_enabled(), False
)
2 changes: 2 additions & 0 deletions sdk/monitor/azure-monitor-opentelemetry/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

- Updated FastAPI sample
([#34738](https://github.com/Azure/azure-sdk-for-python/pull/34738))
- Refactored constants and utils
([#35066](https://github.com/Azure/azure-sdk-for-python/pull/35066))

## 1.3.0 (2024-02-29)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
from azure.monitor.opentelemetry._diagnostics.status_logger import (
AzureStatusLogger,
)
from azure.monitor.opentelemetry._util.configurations import (
from azure.monitor.opentelemetry._utils.configurations import (
_get_otel_disabled_instrumentations,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
_DISTRO_DETECTS_ATTACH,
AzureDiagnosticLogging,
)
from azure.monitor.opentelemetry._util.configurations import (
from azure.monitor.opentelemetry._utils.configurations import (
_get_configurations,
_is_instrumentation_enabled,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,6 @@
# 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._constants import ( # pylint: disable=import-error,no-name-in-module
_AZURE_MONITOR_DISTRO_VERSION_ARG,
)
Expand All @@ -35,52 +27,10 @@

_LOG_PATH_LINUX = "/var/log/applicationinsights"
_LOG_PATH_WINDOWS = "\\LogFiles\\ApplicationInsights"
_IS_ON_APP_SERVICE = "WEBSITE_SITE_NAME" in environ
# TODO: Add environment variable to enabled diagnostics off of App Service
_IS_DIAGNOSTICS_ENABLED = _IS_ON_APP_SERVICE
_CUSTOMER_IKEY_ENV_VAR = None
_PREVIEW_ENTRY_POINT_WARNING = "Autoinstrumentation for the Azure Monitor OpenTelemetry Distro is in preview."
logger = logging.getLogger(__name__)


# 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)
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"
)

# Instrumentations
# --------------------Instrumentations------------------------------

# Opt-out
_AZURE_SDK_INSTRUMENTATION_NAME = "azure_sdk"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from os import makedirs
from os.path import exists, join

from azure.monitor.opentelemetry._constants import (
from azure.monitor.opentelemetry._utils import (
_EXTENSION_VERSION,
_IS_DIAGNOSTICS_ENABLED,
_env_var_or_default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from os.path import exists, join
from platform import node

from azure.monitor.opentelemetry._constants import (
from azure.monitor.opentelemetry._utils import (
_EXTENSION_VERSION,
_IS_DIAGNOSTICS_ENABLED,
_get_customer_ikey_from_env_var,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# -------------------------------------------------------------------------
# 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 _is_on_app_service # pylint: disable=import-error,no-name-in-module
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)
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"
)
Loading