From e27c9b57d923c657f86dccdeb4905bb7cdd3672a Mon Sep 17 00:00:00 2001 From: Jeremy Voss Date: Tue, 4 Mar 2025 13:25:49 -0800 Subject: [PATCH 1/6] Update AKS checks and tests --- .../opentelemetry/exporter/_constants.py | 1 + .../monitor/opentelemetry/exporter/_utils.py | 7 +- .../tests/test_utils.py | 162 +++++++++++++++--- 3 files changed, 140 insertions(+), 30 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_constants.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_constants.py index a82881e22406..6b4004042915 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_constants.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_constants.py @@ -24,6 +24,7 @@ _FUNCTIONS_WORKER_RUNTIME = "FUNCTIONS_WORKER_RUNTIME" _PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY = "PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY" _AKS_ARM_NAMESPACE_ID = "AKS_ARM_NAMESPACE_ID" +_KUBERNETES_SERVICE_HOST = "KUBERNETES_SERVICE_HOST" # Network diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_utils.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_utils.py index e1a4fc791e9a..1c0e74cb17b4 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_utils.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_utils.py @@ -23,8 +23,9 @@ from azure.monitor.opentelemetry.exporter._constants import ( _AKS_ARM_NAMESPACE_ID, _DEFAULT_AAD_SCOPE, - _INSTRUMENTATIONS_BIT_MAP, _FUNCTIONS_WORKER_RUNTIME, + _INSTRUMENTATIONS_BIT_MAP, + _KUBERNETES_SERVICE_HOST, _PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY, _WEBSITE_SITE_NAME, ) @@ -63,7 +64,7 @@ def _is_on_functions(): def _is_on_aks(): - return _AKS_ARM_NAMESPACE_ID in environ + return _KUBERNETES_SERVICE_HOST in environ # Attach @@ -74,6 +75,8 @@ def _is_attach_enabled(): return isdir("/agents/python/") if _is_on_functions(): return environ.get(_PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY) == "true" + if _is_on_aks(): + return _AKS_ARM_NAMESPACE_ID in environ return False diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py index 1617e945ee6b..ef74bd5b0570 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py @@ -11,6 +11,15 @@ from azure.monitor.opentelemetry.exporter._generated.models import TelemetryItem from opentelemetry.sdk.resources import Resource from unittest.mock import patch +# from azure.monitor.opentelemetry.exporter._constants import ( +# _AKS_ARM_NAMESPACE_ID, +# _DEFAULT_AAD_SCOPE, +# _FUNCTIONS_WORKER_RUNTIME, +# _INSTRUMENTATIONS_BIT_MAP, +# _KUBERNETES_SERVICE_HOST, +# _PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY, +# _WEBSITE_SITE_NAME, +# ) TEST_AI_DEVICE_ID = "TEST_AI_DEVICE_ID" @@ -29,6 +38,8 @@ TEST_TIMESTAMP = "TEST_TIMESTAMP" TEST_TIME = "TEST_TIME" TEST_WEBSITE_SITE_NAME = "TEST_WEBSITE_SITE_NAME" +TEST_KUBERNETES_SERVICE_HOST = "TEST_KUBERNETES_SERVICE_HOST" +TEST_AKS_ARM_NAMESPACE_ID = "TEST_AKS_ARM_NAMESPACE_ID" class TestUtils(unittest.TestCase): @@ -105,37 +116,37 @@ def test_create_telemetry_item(self, mock_ns_to_iso_str): @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): + def test_get_sdk_version_prefix(self, mock_system, mock_isdir): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "uum_") @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): + def test_get_sdk_version_prefix_linux(self, mock_system, mock_isdir): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "ulm_") @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): + def test_get_sdk_version_prefix_windows(self, mock_system, mock_isdir): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "uwm_") @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): + def test_get_sdk_version_prefix_attach(self, mock_system, mock_isdir): 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): + def test_get_sdk_version_prefix_attach_linux(self, mock_system, mock_isdir): 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): + def test_get_sdk_version_prefix_attach_windows(self, mock_system, mock_isdir): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "uwi_") @@ -146,7 +157,7 @@ def test_get_sdk_version_prefix_attach_windows(self, mock_system, mock_getenv): ) @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): + def test_get_sdk_version_prefix_app_service(self, mock_system, mock_isdir): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "aum_") @@ -155,7 +166,7 @@ def test_get_sdk_version_prefix_app_service(self, mock_system, mock_getenv): ) @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): + def test_get_sdk_version_prefix_app_service_linux(self, mock_system, mock_isdir): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "alm_") @@ -164,7 +175,7 @@ def test_get_sdk_version_prefix_app_service_linux(self, mock_system, mock_getenv ) @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): + def test_get_sdk_version_prefix_app_service_windows(self, mock_system, mock_isdir): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "awm_") @@ -173,7 +184,7 @@ def test_get_sdk_version_prefix_app_service_windows(self, mock_system, mock_gete ) @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): + def test_get_sdk_version_prefix_app_service_attach(self, mock_system, mock_isdir): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "aui_") @@ -182,7 +193,7 @@ def test_get_sdk_version_prefix_app_service_attach(self, mock_system, mock_geten ) @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): + def test_get_sdk_version_prefix_app_service_linux_attach(self, mock_system, mock_isdir): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "ali_") @@ -191,7 +202,7 @@ def test_get_sdk_version_prefix_app_service_linux_attach(self, mock_system, mock ) @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): + def test_get_sdk_version_prefix_app_service_windows_attach(self, mock_system, mock_isdir): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "awi_") @@ -202,9 +213,8 @@ def test_get_sdk_version_prefix_app_service_windows_attach(self, mock_system, mo {"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): + def test_get_sdk_version_prefix_function(self, mock_system): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "fum_") @@ -213,9 +223,8 @@ def test_get_sdk_version_prefix_function(self, mock_system, mock_getenv): {"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): + def test_get_sdk_version_prefix_function_linux(self, mock_system): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "flm_") @@ -224,45 +233,127 @@ def test_get_sdk_version_prefix_function_linux(self, mock_system, mock_getenv): {"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): + def test_get_sdk_version_prefix_function_windows(self, mock_system): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "fwm_") @patch.dict( "azure.monitor.opentelemetry.exporter._utils.environ", - {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME}, + { + "FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME, + "PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY": "true", + }, 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): + def test_get_sdk_version_prefix_function_attach(self, mock_system): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "fui_") @patch.dict( "azure.monitor.opentelemetry.exporter._utils.environ", - {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME}, + { + "FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME, + "PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY": "true", + }, 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): + def test_get_sdk_version_prefix_function_linux_attach(self, mock_system): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "fli_") @patch.dict( "azure.monitor.opentelemetry.exporter._utils.environ", - {"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME}, + { + "FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME, + "PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY": "true", + }, 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): + def test_get_sdk_version_prefix_function_windows_attach(self, mock_system): result = _utils._get_sdk_version_prefix() self.assertEqual(result, "fwi_") + # AKS SDK Version Prefix + + @patch.dict( + "azure.monitor.opentelemetry.exporter._utils.environ", + { + "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, + }, + clear=True, + ) + @patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="") + def test_get_sdk_version_prefix_aks(self, mock_system): + result = _utils._get_sdk_version_prefix() + self.assertEqual(result, "kum_") + + @patch.dict( + "azure.monitor.opentelemetry.exporter._utils.environ", + { + "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, + }, + clear=True, + ) + @patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux") + def test_get_sdk_version_prefix_aks_linux(self, mock_system): + result = _utils._get_sdk_version_prefix() + self.assertEqual(result, "klm_") + + @patch.dict( + "azure.monitor.opentelemetry.exporter._utils.environ", + { + "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, + }, + clear=True, + ) + @patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows") + def test_get_sdk_version_prefix_aks_windows(self, mock_system): + result = _utils._get_sdk_version_prefix() + self.assertEqual(result, "kwm_") + + @patch.dict( + "azure.monitor.opentelemetry.exporter._utils.environ", + { + "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, + "AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID, + }, + clear=True, + ) + @patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="") + def test_get_sdk_version_prefix_aks_attach(self, mock_system): + result = _utils._get_sdk_version_prefix() + self.assertEqual(result, "kui_") + + @patch.dict( + "azure.monitor.opentelemetry.exporter._utils.environ", + { + "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, + "AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID, + }, + clear=True, + ) + @patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux") + def test_get_sdk_version_prefix_aks_linux_attach(self, mock_system): + result = _utils._get_sdk_version_prefix() + self.assertEqual(result, "kli_") + + @patch.dict( + "azure.monitor.opentelemetry.exporter._utils.environ", + { + "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, + "AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID, + }, + clear=True, + ) + @patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows") + def test_get_sdk_version_prefix_aks_windows_attach(self, mock_system): + result = _utils._get_sdk_version_prefix() + self.assertEqual(result, "kwi_") + # Attach @patch( @@ -288,7 +379,22 @@ def test_attach_app_service_disabled(self, mock_isdir): @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) + self.assertFalse(_utils._is_attach_enabled()) + + @patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", { + "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, + "AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID, + }, clear=True) + def test_attach_aks(self): + # This is not an expected scenario and just tests the default + self.assertTrue(_utils._is_attach_enabled()) + + @patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", { + "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, + }, clear=True) + def test_aks_no_attach(self): + # This is not an expected scenario and just tests the default + self.assertFalse(_utils._is_attach_enabled()) # Synthetic From b5210c79667bc620e092adc3e657f2872c8f600c Mon Sep 17 00:00:00 2001 From: Jeremy Voss Date: Tue, 4 Mar 2025 13:29:05 -0800 Subject: [PATCH 2/6] changelog --- sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md index f69f31d87593..c152174f20d2 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md @@ -23,6 +23,8 @@ ([#39886](https://github.com/Azure/azure-sdk-for-python/pull/39886)) - Populate `client_Ip` on `customEvent` telemetry ([#39923](https://github.com/Azure/azure-sdk-for-python/pull/39923)) +- Update AKS check to use KUBERNETES_SERVICE_HOST + ([#39941](https://github.com/Azure/azure-sdk-for-python/pull/39941)) ### Bugs Fixed From 8f115939bc3f6757324bee4ebbe4cb10f51028ec Mon Sep 17 00:00:00 2001 From: Jeremy Voss Date: Tue, 4 Mar 2025 13:30:53 -0800 Subject: [PATCH 3/6] clean up --- .../tests/test_utils.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py index ef74bd5b0570..2fc178a9361c 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py @@ -11,15 +11,6 @@ from azure.monitor.opentelemetry.exporter._generated.models import TelemetryItem from opentelemetry.sdk.resources import Resource from unittest.mock import patch -# from azure.monitor.opentelemetry.exporter._constants import ( -# _AKS_ARM_NAMESPACE_ID, -# _DEFAULT_AAD_SCOPE, -# _FUNCTIONS_WORKER_RUNTIME, -# _INSTRUMENTATIONS_BIT_MAP, -# _KUBERNETES_SERVICE_HOST, -# _PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY, -# _WEBSITE_SITE_NAME, -# ) TEST_AI_DEVICE_ID = "TEST_AI_DEVICE_ID" From cac08b998c85ce46660acec12c62a234044badf5 Mon Sep 17 00:00:00 2001 From: Jeremy Voss Date: Fri, 28 Mar 2025 10:41:28 -0700 Subject: [PATCH 4/6] RP Id for statsbeat needs work --- .../opentelemetry/exporter/statsbeat/_statsbeat_metrics.py | 5 ++++- .../tests/statsbeat/test_statsbeat.py | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_statsbeat_metrics.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_statsbeat_metrics.py index db84e01b062e..ad5fae376165 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_statsbeat_metrics.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_statsbeat_metrics.py @@ -18,6 +18,7 @@ from azure.monitor.opentelemetry.exporter._constants import ( _ATTACH_METRIC_NAME, _FEATURE_METRIC_NAME, + _KUBERNETES_SERVICE_HOST, _REQ_DURATION_NAME, _REQ_EXCEPTION_NAME, _REQ_FAILURE_NAME, @@ -187,7 +188,9 @@ def _get_attach_metric(self, options: CallbackOptions) -> Iterable[Observation]: elif _utils._is_on_aks(): # AKS rp = _RP_Names.AKS.value - rpId = os.environ.get(_AKS_ARM_NAMESPACE_ID, "") + # TODO: AKS_ARM_NAMESPACE_ID is only for attach + # rpId = os.environ.get(_AKS_ARM_NAMESPACE_ID, "") + rpId = os.environ.get(_KUBERNETES_SERVICE_HOST , "") elif self._vm_retry and self._get_azure_compute_metadata(): # VM rp = _RP_Names.VM.value diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/statsbeat/test_statsbeat.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/statsbeat/test_statsbeat.py index 3c472c554d76..05031a800f8c 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/statsbeat/test_statsbeat.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/statsbeat/test_statsbeat.py @@ -446,14 +446,16 @@ def test_get_attach_metric_functions(self, metadata_mock): @mock.patch.dict( os.environ, { - "AKS_ARM_NAMESPACE_ID": "namespace_id", + "KUBERNETES_SERVICE_HOST": "TEST_KUBERNETES_SERVICE_HOST", }, ) def test_get_attach_metric_aks(self): attributes = dict(_StatsbeatMetrics._COMMON_ATTRIBUTES) self.assertEqual(attributes["rp"], _RP_Names.UNKNOWN.value) attributes["rp"] = _RP_Names.AKS.value - attributes["rpId"] = "namespace_id" + # TODO: What should rpId be for aks? + # attributes["rpId"] = "" + attributes["rpId"] = "TEST_KUBERNETES_SERVICE_HOST" observations = self._metric._get_attach_metric(options=None) for obs in observations: self.assertEqual(obs.value, 1) From 4919f4628d9bdfe9b0d09192d0f3880795e3f24e Mon Sep 17 00:00:00 2001 From: Jeremy Voss Date: Fri, 28 Mar 2025 12:09:45 -0700 Subject: [PATCH 5/6] Use both AKS env vars --- .../exporter/statsbeat/_statsbeat_metrics.py | 7 +++--- .../tests/statsbeat/test_statsbeat.py | 23 ++++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_statsbeat_metrics.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_statsbeat_metrics.py index ad5fae376165..47647565c22e 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_statsbeat_metrics.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_statsbeat_metrics.py @@ -188,9 +188,10 @@ def _get_attach_metric(self, options: CallbackOptions) -> Iterable[Observation]: elif _utils._is_on_aks(): # AKS rp = _RP_Names.AKS.value - # TODO: AKS_ARM_NAMESPACE_ID is only for attach - # rpId = os.environ.get(_AKS_ARM_NAMESPACE_ID, "") - rpId = os.environ.get(_KUBERNETES_SERVICE_HOST , "") + if _AKS_ARM_NAMESPACE_ID in os.environ: + rpId = os.environ.get(_AKS_ARM_NAMESPACE_ID, "") + else: + rpId = os.environ.get(_KUBERNETES_SERVICE_HOST , "") elif self._vm_retry and self._get_azure_compute_metadata(): # VM rp = _RP_Names.VM.value diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/statsbeat/test_statsbeat.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/statsbeat/test_statsbeat.py index 05031a800f8c..eff9d23365ce 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/statsbeat/test_statsbeat.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/statsbeat/test_statsbeat.py @@ -446,15 +446,32 @@ def test_get_attach_metric_functions(self, metadata_mock): @mock.patch.dict( os.environ, { + "AKS_ARM_NAMESPACE_ID": "namespace_id", "KUBERNETES_SERVICE_HOST": "TEST_KUBERNETES_SERVICE_HOST", }, ) - def test_get_attach_metric_aks(self): + def test_get_attach_metric_aks_attach(self): + attributes = dict(_StatsbeatMetrics._COMMON_ATTRIBUTES) + self.assertEqual(attributes["rp"], _RP_Names.UNKNOWN.value) + attributes["rp"] = _RP_Names.AKS.value + attributes["rpId"] = "namespace_id" + observations = self._metric._get_attach_metric(options=None) + for obs in observations: + self.assertEqual(obs.value, 1) + self.assertEqual(obs.attributes, attributes) + self.assertEqual(_StatsbeatMetrics._COMMON_ATTRIBUTES["rp"], _RP_Names.AKS.value) + + # pylint: disable=protected-access + @mock.patch.dict( + os.environ, + { + "KUBERNETES_SERVICE_HOST": "TEST_KUBERNETES_SERVICE_HOST", + }, + ) + def test_get_attach_metric_aks_manual(self): attributes = dict(_StatsbeatMetrics._COMMON_ATTRIBUTES) self.assertEqual(attributes["rp"], _RP_Names.UNKNOWN.value) attributes["rp"] = _RP_Names.AKS.value - # TODO: What should rpId be for aks? - # attributes["rpId"] = "" attributes["rpId"] = "TEST_KUBERNETES_SERVICE_HOST" observations = self._metric._get_attach_metric(options=None) for obs in observations: From 6f9354dc0620be72602eeec6bab5046ee64914ca Mon Sep 17 00:00:00 2001 From: Jeremy Voss Date: Fri, 28 Mar 2025 13:26:15 -0700 Subject: [PATCH 6/6] Update check to use both env vars --- .../azure/monitor/opentelemetry/exporter/_utils.py | 2 +- .../azure-monitor-opentelemetry-exporter/tests/test_utils.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_utils.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_utils.py index 1c0e74cb17b4..790bca6b420a 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_utils.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_utils.py @@ -64,7 +64,7 @@ def _is_on_functions(): def _is_on_aks(): - return _KUBERNETES_SERVICE_HOST in environ + return _AKS_ARM_NAMESPACE_ID in environ or _KUBERNETES_SERVICE_HOST in environ # Attach diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py index 2fc178a9361c..a34d8b66c643 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py @@ -309,7 +309,6 @@ def test_get_sdk_version_prefix_aks_windows(self, mock_system): @patch.dict( "azure.monitor.opentelemetry.exporter._utils.environ", { - "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, "AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID, }, clear=True, @@ -322,7 +321,6 @@ def test_get_sdk_version_prefix_aks_attach(self, mock_system): @patch.dict( "azure.monitor.opentelemetry.exporter._utils.environ", { - "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, "AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID, }, clear=True, @@ -335,7 +333,6 @@ def test_get_sdk_version_prefix_aks_linux_attach(self, mock_system): @patch.dict( "azure.monitor.opentelemetry.exporter._utils.environ", { - "KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST, "AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID, }, clear=True,