Skip to content

Commit 611a717

Browse files
authored
Merge branch 'main' into feature/asyncio-instrumentation
2 parents 41ecf14 + 02e38ed commit 611a717

File tree

3 files changed

+65
-61
lines changed

3 files changed

+65
-61
lines changed

CHANGELOG.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10-
- Drop uspport for 3.7
10+
- Drop support for 3.7
1111
([#2151](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2151))
1212
- `opentelemetry-resource-detector-azure` Added 10s timeout to VM Resource Detector
1313
([#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
1717
([#2132](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2132))
1818
- `opentelemetry-resource-detector-azure` Changed timeout to 4 seconds due to [timeout bug](https://github.com/open-telemetry/opentelemetry-python/issues/3644)
1919
([#2136](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2136))
20+
- `opentelemetry-resource-detector-azure` Suppress instrumentation for `urllib` call
21+
([#2178](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2178))
2022

2123
## Version 1.22.0/0.43b0 (2023-12-14)
2224

resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py

+54-52
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717
from urllib.error import URLError
1818
from urllib.request import Request, urlopen
1919

20+
from opentelemetry.context import (
21+
_SUPPRESS_INSTRUMENTATION_KEY,
22+
attach,
23+
detach,
24+
set_value,
25+
)
2026
from opentelemetry.sdk.resources import Resource, ResourceDetector
2127
from opentelemetry.semconv.resource import (
2228
CloudPlatformValues,
@@ -49,64 +55,60 @@ class AzureVMResourceDetector(ResourceDetector):
4955
# pylint: disable=no-self-use
5056
def detect(self) -> "Resource":
5157
attributes = {}
52-
metadata_json = (
53-
_AzureVMMetadataServiceRequestor().get_azure_vm_metadata()
54-
)
58+
token = attach(set_value(_SUPPRESS_INSTRUMENTATION_KEY, True))
59+
metadata_json = _get_azure_vm_metadata()
5560
if not metadata_json:
5661
return Resource(attributes)
5762
for attribute_key in EXPECTED_AZURE_AMS_ATTRIBUTES:
58-
attributes[
59-
attribute_key
60-
] = _AzureVMMetadataServiceRequestor().get_attribute_from_metadata(
63+
attributes[attribute_key] = _get_attribute_from_metadata(
6164
metadata_json, attribute_key
6265
)
66+
detach(token)
6367
return Resource(attributes)
6468

6569

66-
class _AzureVMMetadataServiceRequestor:
67-
def get_azure_vm_metadata(self): # pylint: disable=no-self-use
68-
request = Request(_AZURE_VM_METADATA_ENDPOINT)
69-
request.add_header("Metadata", "True")
70-
try:
71-
# TODO: Changed to 4s to fit into OTel SDK's 5 second timeout.
72-
# Lengthen or allow user input if issue is resolved.
73-
# See https://github.com/open-telemetry/opentelemetry-python/issues/3644
74-
with urlopen(request, timeout=4) as response:
75-
return loads(response.read())
76-
except URLError:
77-
# Not on Azure VM
78-
return None
79-
except Exception as e: # pylint: disable=broad-except,invalid-name
80-
_logger.exception("Failed to receive Azure VM metadata: %s", e)
81-
return None
70+
def _get_azure_vm_metadata():
71+
request = Request(_AZURE_VM_METADATA_ENDPOINT)
72+
request.add_header("Metadata", "True")
73+
try:
74+
# TODO: Changed to 4s to fit into OTel SDK's 5 second timeout.
75+
# Lengthen or allow user input if issue is resolved.
76+
# See https://github.com/open-telemetry/opentelemetry-python/issues/3644
77+
with urlopen(request, timeout=4) as response:
78+
return loads(response.read())
79+
except URLError:
80+
# Not on Azure VM
81+
return None
82+
except Exception as e: # pylint: disable=broad-except,invalid-name
83+
_logger.exception("Failed to receive Azure VM metadata: %s", e)
84+
return None
85+
8286

83-
def get_attribute_from_metadata(
84-
self, metadata_json, attribute_key
85-
): # pylint: disable=no-self-use
86-
ams_value = ""
87-
if attribute_key == _AZURE_VM_SCALE_SET_NAME_ATTRIBUTE:
88-
ams_value = metadata_json["vmScaleSetName"]
89-
elif attribute_key == _AZURE_VM_SKU_ATTRIBUTE:
90-
ams_value = metadata_json["sku"]
91-
elif attribute_key == ResourceAttributes.CLOUD_PLATFORM:
92-
ams_value = CloudPlatformValues.AZURE_VM.value
93-
elif attribute_key == ResourceAttributes.CLOUD_PROVIDER:
94-
ams_value = CloudProviderValues.AZURE.value
95-
elif attribute_key == ResourceAttributes.CLOUD_REGION:
96-
ams_value = metadata_json["location"]
97-
elif attribute_key == ResourceAttributes.CLOUD_RESOURCE_ID:
98-
ams_value = metadata_json["resourceId"]
99-
elif attribute_key in (
100-
ResourceAttributes.HOST_ID,
101-
ResourceAttributes.SERVICE_INSTANCE_ID,
102-
):
103-
ams_value = metadata_json["vmId"]
104-
elif attribute_key == ResourceAttributes.HOST_NAME:
105-
ams_value = metadata_json["name"]
106-
elif attribute_key == ResourceAttributes.HOST_TYPE:
107-
ams_value = metadata_json["vmSize"]
108-
elif attribute_key == ResourceAttributes.OS_TYPE:
109-
ams_value = metadata_json["osType"]
110-
elif attribute_key == ResourceAttributes.OS_VERSION:
111-
ams_value = metadata_json["version"]
112-
return ams_value
87+
def _get_attribute_from_metadata(metadata_json, attribute_key):
88+
ams_value = ""
89+
if attribute_key == _AZURE_VM_SCALE_SET_NAME_ATTRIBUTE:
90+
ams_value = metadata_json["vmScaleSetName"]
91+
elif attribute_key == _AZURE_VM_SKU_ATTRIBUTE:
92+
ams_value = metadata_json["sku"]
93+
elif attribute_key == ResourceAttributes.CLOUD_PLATFORM:
94+
ams_value = CloudPlatformValues.AZURE_VM.value
95+
elif attribute_key == ResourceAttributes.CLOUD_PROVIDER:
96+
ams_value = CloudProviderValues.AZURE.value
97+
elif attribute_key == ResourceAttributes.CLOUD_REGION:
98+
ams_value = metadata_json["location"]
99+
elif attribute_key == ResourceAttributes.CLOUD_RESOURCE_ID:
100+
ams_value = metadata_json["resourceId"]
101+
elif attribute_key in (
102+
ResourceAttributes.HOST_ID,
103+
ResourceAttributes.SERVICE_INSTANCE_ID,
104+
):
105+
ams_value = metadata_json["vmId"]
106+
elif attribute_key == ResourceAttributes.HOST_NAME:
107+
ams_value = metadata_json["name"]
108+
elif attribute_key == ResourceAttributes.HOST_TYPE:
109+
ams_value = metadata_json["vmSize"]
110+
elif attribute_key == ResourceAttributes.OS_TYPE:
111+
ams_value = metadata_json["osType"]
112+
elif attribute_key == ResourceAttributes.OS_VERSION:
113+
ams_value = metadata_json["version"]
114+
return ams_value

resource/opentelemetry-resource-detector-azure/tests/test_vm.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
import unittest
15-
from unittest.mock import Mock, patch
15+
from unittest.mock import patch
1616

1717
# pylint: disable=no-name-in-module
1818
from opentelemetry.resource.detector.azure.vm import AzureVMResourceDetector
@@ -363,18 +363,18 @@
363363
class TestAzureVMResourceDetector(unittest.TestCase):
364364
@patch("opentelemetry.resource.detector.azure.vm.urlopen")
365365
def test_linux(self, mock_urlopen):
366-
mock_response = Mock()
367-
mock_urlopen.return_value = mock_response
368-
mock_response.read.return_value = LINUX_JSON
366+
mock_urlopen.return_value.__enter__.return_value.read.return_value = (
367+
LINUX_JSON
368+
)
369369
attributes = AzureVMResourceDetector().detect().attributes
370370
for attribute_key, attribute_value in LINUX_ATTRIBUTES.items():
371371
self.assertEqual(attributes[attribute_key], attribute_value)
372372

373373
@patch("opentelemetry.resource.detector.azure.vm.urlopen")
374374
def test_windows(self, mock_urlopen):
375-
mock_response = Mock()
376-
mock_urlopen.return_value = mock_response
377-
mock_response.read.return_value = WINDOWS_JSON
375+
mock_urlopen.return_value.__enter__.return_value.read.return_value = (
376+
WINDOWS_JSON
377+
)
378378
attributes = AzureVMResourceDetector().detect().attributes
379-
for attribute_key, attribute_value in LINUX_ATTRIBUTES.items():
379+
for attribute_key, attribute_value in WINDOWS_ATTRIBUTES.items():
380380
self.assertEqual(attributes[attribute_key], attribute_value)

0 commit comments

Comments
 (0)