Skip to content

Commit 70787ec

Browse files
committed
Added try catch, logging, and dependency for azure resource detector
1 parent b29682b commit 70787ec

File tree

6 files changed

+62
-30
lines changed

6 files changed

+62
-30
lines changed

Diff for: CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1818

1919
- `opentelemetry-instrumentation-urllib`/`opentelemetry-instrumentation-urllib3` Fix metric descriptions to match semantic conventions
2020
([#1959]((https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1959))
21+
- `opentelemetry-resource-detector-azure` Added dependency for Cloud Resource ID attribute and clearer logging for Azure Resource Detectors
22+
([#XXX](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/XXXX))
2123

2224
## Version 1.21.0/0.42b0 (2023-11-01)
2325

Diff for: resource/opentelemetry-resource-detector-azure/pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ classifiers = [
2626
]
2727
dependencies = [
2828
"opentelemetry-sdk ~= 1.19",
29+
"opentelemetry-semantic-conventions ~= 0.42b0",
2930
]
3031

3132
[project.optional-dependencies]

Diff for: resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/app_service.py

+22-18
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
from logging import getLogger
1516
from os import environ
1617

1718
from opentelemetry.sdk.resources import Resource, ResourceDetector
@@ -30,6 +31,7 @@
3031
_WEBSITE_RESOURCE_GROUP = "WEBSITE_RESOURCE_GROUP"
3132
_WEBSITE_SITE_NAME = "WEBSITE_SITE_NAME"
3233
_WEBSITE_SLOT_NAME = "WEBSITE_SLOT_NAME"
34+
_logger = getLogger(__name__)
3335

3436

3537
_APP_SERVICE_ATTRIBUTE_ENV_VARS = {
@@ -44,26 +46,28 @@
4446
class AzureAppServiceResourceDetector(ResourceDetector):
4547
def detect(self) -> Resource:
4648
attributes = {}
47-
website_site_name = environ.get(_WEBSITE_SITE_NAME)
48-
if website_site_name:
49-
attributes[ResourceAttributes.SERVICE_NAME] = website_site_name
50-
attributes[
51-
ResourceAttributes.CLOUD_PROVIDER
52-
] = CloudProviderValues.AZURE.value
53-
attributes[
54-
ResourceAttributes.CLOUD_PLATFORM
55-
] = CloudPlatformValues.AZURE_APP_SERVICE.value
56-
57-
azure_resource_uri = _get_azure_resource_uri(website_site_name)
58-
if azure_resource_uri:
49+
try:
50+
website_site_name = environ.get(_WEBSITE_SITE_NAME)
51+
if website_site_name:
52+
attributes[ResourceAttributes.SERVICE_NAME] = website_site_name
53+
attributes[
54+
ResourceAttributes.CLOUD_PROVIDER
55+
] = CloudProviderValues.AZURE.value
5956
attributes[
60-
ResourceAttributes.CLOUD_RESOURCE_ID
61-
] = azure_resource_uri
62-
for (key, env_var) in _APP_SERVICE_ATTRIBUTE_ENV_VARS.items():
63-
value = environ.get(env_var)
64-
if value:
65-
attributes[key] = value
57+
ResourceAttributes.CLOUD_PLATFORM
58+
] = CloudPlatformValues.AZURE_APP_SERVICE.value
6659

60+
azure_resource_uri = _get_azure_resource_uri(website_site_name)
61+
if azure_resource_uri:
62+
attributes[
63+
ResourceAttributes.CLOUD_RESOURCE_ID
64+
] = azure_resource_uri
65+
for (key, env_var) in _APP_SERVICE_ATTRIBUTE_ENV_VARS.items():
66+
value = environ.get(env_var)
67+
if value:
68+
attributes[key] = value
69+
except Exception as e:
70+
_logger.info("Could not detect Azure App Service metadata: %s", e)
6771
return Resource(attributes)
6872

6973

Diff for: resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py

+14-12
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
from json import loads
1616
from logging import getLogger
17-
from urllib.error import URLError
1817
from urllib.request import Request, urlopen
18+
from urllib.error import URLError
1919

2020
from opentelemetry.sdk.resources import Resource, ResourceDetector
2121
from opentelemetry.semconv.resource import (
@@ -24,7 +24,6 @@
2424
ResourceAttributes,
2525
)
2626

27-
# TODO: Remove when cloud resource id is no longer missing in Resource Attributes
2827
_AZURE_VM_METADATA_ENDPOINT = "http://169.254.169.254/metadata/instance/compute?api-version=2021-12-13&format=json"
2928
_AZURE_VM_SCALE_SET_NAME_ATTRIBUTE = "azure.vm.scaleset.name"
3029
_AZURE_VM_SKU_ATTRIBUTE = "azure.vm.sku"
@@ -50,17 +49,20 @@ class AzureVMResourceDetector(ResourceDetector):
5049
# pylint: disable=no-self-use
5150
def detect(self) -> "Resource":
5251
attributes = {}
53-
metadata_json = (
54-
_AzureVMMetadataServiceRequestor().get_azure_vm_metadata()
55-
)
56-
if not metadata_json:
57-
return Resource(attributes)
58-
for attribute_key in EXPECTED_AZURE_AMS_ATTRIBUTES:
59-
attributes[
60-
attribute_key
61-
] = _AzureVMMetadataServiceRequestor().get_attribute_from_metadata(
62-
metadata_json, attribute_key
52+
try:
53+
metadata_json = (
54+
_AzureVMMetadataServiceRequestor().get_azure_vm_metadata()
6355
)
56+
if not metadata_json:
57+
return Resource(attributes)
58+
for attribute_key in EXPECTED_AZURE_AMS_ATTRIBUTES:
59+
attributes[
60+
attribute_key
61+
] = _AzureVMMetadataServiceRequestor().get_attribute_from_metadata(
62+
metadata_json, attribute_key
63+
)
64+
except Exception as e:
65+
_logger.info("Could not detect Azure VM metadata: %s", e)
6466
return Resource(attributes)
6567

6668

Diff for: resource/opentelemetry-resource-detector-azure/tests/test_app_service.py

+8
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,11 @@ def test_on_app_service_no_owner(self):
152152
def test_off_app_service(self):
153153
resource = AzureAppServiceResourceDetector().detect()
154154
self.assertEqual(resource.attributes, {})
155+
156+
@patch("opentelemetry.resource.detector.azure.app_service._logger")
157+
@patch("opentelemetry.resource.detector.azure.app_service.environ")
158+
def test_off_app_service(self, mock_environ, mock_logger):
159+
mock_environ.get.side_effect = Exception("Test Exception")
160+
resource = AzureAppServiceResourceDetector().detect()
161+
mock_logger.info.assert_called_once()
162+
self.assertEqual(resource.attributes, {})

Diff for: resource/opentelemetry-resource-detector-azure/tests/test_vm.py

+15
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,11 @@
330330
"zone": "1"
331331
}
332332
"""
333+
INCOMPLETE_JSON = """
334+
{
335+
"vmId": "02aab8a4-74ef-476e-8182-f6d2ba4166a6"
336+
}
337+
"""
333338
LINUX_ATTRIBUTES = {
334339
"azure.vm.scaleset.name": "crpteste9vflji9",
335340
"azure.vm.sku": "20_04-lts-gen2",
@@ -378,3 +383,13 @@ def test_windows(self, mock_urlopen):
378383
attributes = AzureVMResourceDetector().detect().attributes
379384
for attribute_key, attribute_value in LINUX_ATTRIBUTES.items():
380385
self.assertEqual(attributes[attribute_key], attribute_value)
386+
387+
@patch("opentelemetry.resource.detector.azure.vm._logger")
388+
@patch("opentelemetry.resource.detector.azure.vm.urlopen")
389+
def test_incomplete_exception(self, mock_urlopen, mock_logger):
390+
mock_open = Mock()
391+
mock_urlopen.return_value = mock_open
392+
mock_open.read.return_value = INCOMPLETE_JSON
393+
attributes = AzureVMResourceDetector().detect().attributes
394+
mock_logger.info.assert_called_once()
395+
self.assertEqual(attributes, {})

0 commit comments

Comments
 (0)