From 70771a9c3a38457f7332a5b79e9eceb74057ff40 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Wed, 14 Feb 2024 08:51:54 -0800 Subject: [PATCH 1/4] fix tests --- .../resource/detector/azure/vm.py | 95 +++++++++---------- .../tests/test_vm.py | 10 +- 2 files changed, 50 insertions(+), 55 deletions(-) diff --git a/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py b/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py index b0e0f4d45b..7e60311847 100644 --- a/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py +++ b/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py @@ -50,63 +50,62 @@ class AzureVMResourceDetector(ResourceDetector): def detect(self) -> "Resource": attributes = {} metadata_json = ( - _AzureVMMetadataServiceRequestor().get_azure_vm_metadata() + _get_azure_vm_metadata() ) if not metadata_json: return Resource(attributes) for attribute_key in EXPECTED_AZURE_AMS_ATTRIBUTES: attributes[ attribute_key - ] = _AzureVMMetadataServiceRequestor().get_attribute_from_metadata( + ] = _get_attribute_from_metadata( metadata_json, attribute_key ) return Resource(attributes) -class _AzureVMMetadataServiceRequestor: - def get_azure_vm_metadata(self): # pylint: disable=no-self-use - request = Request(_AZURE_VM_METADATA_ENDPOINT) - request.add_header("Metadata", "True") - try: - # TODO: Changed to 4s to fit into OTel SDK's 5 second timeout. - # Lengthen or allow user input if issue is resolved. - # See https://github.com/open-telemetry/opentelemetry-python/issues/3644 - with urlopen(request, timeout=4) as response: - return loads(response.read()) - except URLError: - # Not on Azure VM - return None - except Exception as e: # pylint: disable=broad-except,invalid-name - _logger.exception("Failed to receive Azure VM metadata: %s", e) - return None +def _get_azure_vm_metadata(): + request = Request(_AZURE_VM_METADATA_ENDPOINT) + request.add_header("Metadata", "True") + try: + # TODO: Changed to 4s to fit into OTel SDK's 5 second timeout. + # Lengthen or allow user input if issue is resolved. + # See https://github.com/open-telemetry/opentelemetry-python/issues/3644 + with urlopen(request, timeout=4) as response: + return loads(response.read()) + except URLError: + # Not on Azure VM + return None + except Exception as e: # pylint: disable=broad-except,invalid-name + _logger.exception("Failed to receive Azure VM metadata: %s", e) + return None - def get_attribute_from_metadata( - self, metadata_json, attribute_key - ): # pylint: disable=no-self-use - ams_value = "" - if attribute_key == _AZURE_VM_SCALE_SET_NAME_ATTRIBUTE: - ams_value = metadata_json["vmScaleSetName"] - elif attribute_key == _AZURE_VM_SKU_ATTRIBUTE: - ams_value = metadata_json["sku"] - elif attribute_key == ResourceAttributes.CLOUD_PLATFORM: - ams_value = CloudPlatformValues.AZURE_VM.value - elif attribute_key == ResourceAttributes.CLOUD_PROVIDER: - ams_value = CloudProviderValues.AZURE.value - elif attribute_key == ResourceAttributes.CLOUD_REGION: - ams_value = metadata_json["location"] - elif attribute_key == ResourceAttributes.CLOUD_RESOURCE_ID: - ams_value = metadata_json["resourceId"] - elif attribute_key in ( - ResourceAttributes.HOST_ID, - ResourceAttributes.SERVICE_INSTANCE_ID, - ): - ams_value = metadata_json["vmId"] - elif attribute_key == ResourceAttributes.HOST_NAME: - ams_value = metadata_json["name"] - elif attribute_key == ResourceAttributes.HOST_TYPE: - ams_value = metadata_json["vmSize"] - elif attribute_key == ResourceAttributes.OS_TYPE: - ams_value = metadata_json["osType"] - elif attribute_key == ResourceAttributes.OS_VERSION: - ams_value = metadata_json["version"] - return ams_value +def _get_attribute_from_metadata( + metadata_json, attribute_key +): + ams_value = "" + if attribute_key == _AZURE_VM_SCALE_SET_NAME_ATTRIBUTE: + ams_value = metadata_json["vmScaleSetName"] + elif attribute_key == _AZURE_VM_SKU_ATTRIBUTE: + ams_value = metadata_json["sku"] + elif attribute_key == ResourceAttributes.CLOUD_PLATFORM: + ams_value = CloudPlatformValues.AZURE_VM.value + elif attribute_key == ResourceAttributes.CLOUD_PROVIDER: + ams_value = CloudProviderValues.AZURE.value + elif attribute_key == ResourceAttributes.CLOUD_REGION: + ams_value = metadata_json["location"] + elif attribute_key == ResourceAttributes.CLOUD_RESOURCE_ID: + ams_value = metadata_json["resourceId"] + elif attribute_key in ( + ResourceAttributes.HOST_ID, + ResourceAttributes.SERVICE_INSTANCE_ID, + ): + ams_value = metadata_json["vmId"] + elif attribute_key == ResourceAttributes.HOST_NAME: + ams_value = metadata_json["name"] + elif attribute_key == ResourceAttributes.HOST_TYPE: + ams_value = metadata_json["vmSize"] + elif attribute_key == ResourceAttributes.OS_TYPE: + ams_value = metadata_json["osType"] + elif attribute_key == ResourceAttributes.OS_VERSION: + ams_value = metadata_json["version"] + return ams_value diff --git a/resource/opentelemetry-resource-detector-azure/tests/test_vm.py b/resource/opentelemetry-resource-detector-azure/tests/test_vm.py index fd443aa3be..1e6c24a054 100644 --- a/resource/opentelemetry-resource-detector-azure/tests/test_vm.py +++ b/resource/opentelemetry-resource-detector-azure/tests/test_vm.py @@ -363,18 +363,14 @@ class TestAzureVMResourceDetector(unittest.TestCase): @patch("opentelemetry.resource.detector.azure.vm.urlopen") def test_linux(self, mock_urlopen): - mock_response = Mock() - mock_urlopen.return_value = mock_response - mock_response.read.return_value = LINUX_JSON + mock_urlopen.return_value.__enter__.return_value.read.return_value = LINUX_JSON attributes = AzureVMResourceDetector().detect().attributes for attribute_key, attribute_value in LINUX_ATTRIBUTES.items(): self.assertEqual(attributes[attribute_key], attribute_value) @patch("opentelemetry.resource.detector.azure.vm.urlopen") def test_windows(self, mock_urlopen): - mock_response = Mock() - mock_urlopen.return_value = mock_response - mock_response.read.return_value = WINDOWS_JSON + mock_urlopen.return_value.__enter__.return_value.read.return_value = WINDOWS_JSON attributes = AzureVMResourceDetector().detect().attributes - for attribute_key, attribute_value in LINUX_ATTRIBUTES.items(): + for attribute_key, attribute_value in WINDOWS_ATTRIBUTES.items(): self.assertEqual(attributes[attribute_key], attribute_value) From 0e3b7fd0b9ea73bebb38deae829f367608a74c71 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Wed, 14 Feb 2024 11:49:59 -0800 Subject: [PATCH 2/4] lint --- .../src/opentelemetry/resource/detector/azure/vm.py | 12 +++--------- .../tests/test_vm.py | 8 ++++++-- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py b/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py index 7e60311847..917e9b200d 100644 --- a/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py +++ b/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py @@ -49,15 +49,11 @@ class AzureVMResourceDetector(ResourceDetector): # pylint: disable=no-self-use def detect(self) -> "Resource": attributes = {} - metadata_json = ( - _get_azure_vm_metadata() - ) + metadata_json = _get_azure_vm_metadata() if not metadata_json: return Resource(attributes) for attribute_key in EXPECTED_AZURE_AMS_ATTRIBUTES: - attributes[ - attribute_key - ] = _get_attribute_from_metadata( + attributes[attribute_key] = _get_attribute_from_metadata( metadata_json, attribute_key ) return Resource(attributes) @@ -79,9 +75,7 @@ def _get_azure_vm_metadata(): _logger.exception("Failed to receive Azure VM metadata: %s", e) return None -def _get_attribute_from_metadata( - metadata_json, attribute_key -): +def _get_attribute_from_metadata(metadata_json, attribute_key): ams_value = "" if attribute_key == _AZURE_VM_SCALE_SET_NAME_ATTRIBUTE: ams_value = metadata_json["vmScaleSetName"] diff --git a/resource/opentelemetry-resource-detector-azure/tests/test_vm.py b/resource/opentelemetry-resource-detector-azure/tests/test_vm.py index 1e6c24a054..b836d1737d 100644 --- a/resource/opentelemetry-resource-detector-azure/tests/test_vm.py +++ b/resource/opentelemetry-resource-detector-azure/tests/test_vm.py @@ -363,14 +363,18 @@ class TestAzureVMResourceDetector(unittest.TestCase): @patch("opentelemetry.resource.detector.azure.vm.urlopen") def test_linux(self, mock_urlopen): - mock_urlopen.return_value.__enter__.return_value.read.return_value = LINUX_JSON + mock_urlopen.return_value.__enter__.return_value.read.return_value = ( + LINUX_JSON + ) attributes = AzureVMResourceDetector().detect().attributes for attribute_key, attribute_value in LINUX_ATTRIBUTES.items(): self.assertEqual(attributes[attribute_key], attribute_value) @patch("opentelemetry.resource.detector.azure.vm.urlopen") def test_windows(self, mock_urlopen): - mock_urlopen.return_value.__enter__.return_value.read.return_value = WINDOWS_JSON + mock_urlopen.return_value.__enter__.return_value.read.return_value = ( + WINDOWS_JSON + ) attributes = AzureVMResourceDetector().detect().attributes for attribute_key, attribute_value in WINDOWS_ATTRIBUTES.items(): self.assertEqual(attributes[attribute_key], attribute_value) From 7ce0fd959ba8a64a294f736fcfe4506d6bbdcee0 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Wed, 14 Feb 2024 12:28:38 -0800 Subject: [PATCH 3/4] supress --- CHANGELOG.md | 4 +++- .../src/opentelemetry/resource/detector/azure/vm.py | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3157bca33e..c3b0b51d50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -- Drop uspport for 3.7 +- Drop support for 3.7 ([#2151](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2151)) - `opentelemetry-resource-detector-azure` Added 10s timeout to VM Resource Detector ([#2119](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2119)) @@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#2132](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2132)) - `opentelemetry-resource-detector-azure` Changed timeout to 4 seconds due to [timeout bug](https://github.com/open-telemetry/opentelemetry-python/issues/3644) ([#2136](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2136)) +- `opentelemetry-resource-detector-azure` Suppress instrumentation for `urllib` call + ([#2119](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2119)) ## Version 1.22.0/0.43b0 (2023-12-14) diff --git a/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py b/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py index 917e9b200d..a4ba295ab9 100644 --- a/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py +++ b/resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py @@ -17,6 +17,12 @@ from urllib.error import URLError from urllib.request import Request, urlopen +from opentelemetry.context import ( + _SUPPRESS_INSTRUMENTATION_KEY, + attach, + detach, + set_value, +) from opentelemetry.sdk.resources import Resource, ResourceDetector from opentelemetry.semconv.resource import ( CloudPlatformValues, @@ -49,6 +55,7 @@ class AzureVMResourceDetector(ResourceDetector): # pylint: disable=no-self-use def detect(self) -> "Resource": attributes = {} + token = attach(set_value(_SUPPRESS_INSTRUMENTATION_KEY, True)) metadata_json = _get_azure_vm_metadata() if not metadata_json: return Resource(attributes) @@ -56,6 +63,7 @@ def detect(self) -> "Resource": attributes[attribute_key] = _get_attribute_from_metadata( metadata_json, attribute_key ) + detach(token) return Resource(attributes) @@ -75,6 +83,7 @@ def _get_azure_vm_metadata(): _logger.exception("Failed to receive Azure VM metadata: %s", e) return None + def _get_attribute_from_metadata(metadata_json, attribute_key): ams_value = "" if attribute_key == _AZURE_VM_SCALE_SET_NAME_ATTRIBUTE: From 6ec0a16c471e31ffe9f0d85af6693a8c6cbf2676 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Wed, 14 Feb 2024 12:38:35 -0800 Subject: [PATCH 4/4] changelog --- CHANGELOG.md | 2 +- resource/opentelemetry-resource-detector-azure/tests/test_vm.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3b0b51d50..868b4f3e0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-resource-detector-azure` Changed timeout to 4 seconds due to [timeout bug](https://github.com/open-telemetry/opentelemetry-python/issues/3644) ([#2136](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2136)) - `opentelemetry-resource-detector-azure` Suppress instrumentation for `urllib` call - ([#2119](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2119)) + ([#2178](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2178)) ## Version 1.22.0/0.43b0 (2023-12-14) diff --git a/resource/opentelemetry-resource-detector-azure/tests/test_vm.py b/resource/opentelemetry-resource-detector-azure/tests/test_vm.py index b836d1737d..86aa373d3c 100644 --- a/resource/opentelemetry-resource-detector-azure/tests/test_vm.py +++ b/resource/opentelemetry-resource-detector-azure/tests/test_vm.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import unittest -from unittest.mock import Mock, patch +from unittest.mock import patch # pylint: disable=no-name-in-module from opentelemetry.resource.detector.azure.vm import AzureVMResourceDetector