Skip to content

Commit a7abef6

Browse files
authored
Add azure resource detectors (#32087)
1 parent d5ed657 commit a7abef6

5 files changed

Lines changed: 63 additions & 1 deletion

File tree

sdk/monitor/azure-monitor-opentelemetry/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
## 1.0.0 (2023-09-12)
44

5+
### Features Added
6+
7+
- Add Azure resource detectors
8+
([#32087](https://github.com/Azure/azure-sdk-for-python/pull/32087))
9+
510
### Other Changes
611

712
- The `autoinstrumentation', 'diagnostics' and 'util' subnamespaces have been made internal.

sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_configure.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
# Licensed under the MIT License. See License in the project root for
44
# license information.
55
# --------------------------------------------------------------------------
6+
import os
7+
68
from logging import getLogger
79
from typing import Dict, cast
810

@@ -14,6 +16,7 @@
1416
BaseInstrumentor,
1517
)
1618
from opentelemetry.metrics import set_meter_provider
19+
from opentelemetry.sdk.environment_variables import OTEL_EXPERIMENTAL_RESOURCE_DETECTORS
1720
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
1821
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
1922
from opentelemetry.sdk.metrics import MeterProvider
@@ -54,6 +57,11 @@
5457
"urllib3",
5558
)
5659

60+
_SUPPORTED_RESOURCE_DETECTORS = (
61+
"azure_app_service",
62+
"azure_vm",
63+
)
64+
5765

5866
def configure_azure_monitor(**kwargs) -> None:
5967
"""This function works as a configuration layer that allows the
@@ -77,6 +85,9 @@ def configure_azure_monitor(**kwargs) -> None:
7785
disable_logging = configurations[DISABLE_LOGGING_ARG]
7886
disable_metrics = configurations[DISABLE_METRICS_ARG]
7987

88+
# Setup resources
89+
_setup_resources()
90+
8091
# Setup tracing pipeline
8192
if not disable_tracing:
8293
_setup_tracing(configurations)
@@ -94,6 +105,13 @@ def configure_azure_monitor(**kwargs) -> None:
94105
# instanstiated in the other setup steps
95106
_setup_instrumentations(configurations)
96107

108+
def _setup_resources():
109+
detectors = os.environ.get(OTEL_EXPERIMENTAL_RESOURCE_DETECTORS, "")
110+
if detectors:
111+
detectors = detectors + ","
112+
detectors += ",".join(_SUPPORTED_RESOURCE_DETECTORS)
113+
os.environ[OTEL_EXPERIMENTAL_RESOURCE_DETECTORS] = detectors
114+
97115

98116
def _setup_tracing(configurations: Dict[str, ConfigurationValue]):
99117
sampling_ratio = configurations[SAMPLING_RATIO_ARG]

sdk/monitor/azure-monitor-opentelemetry/setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
"opentelemetry-instrumentation-requests~=0.41b0",
9797
"opentelemetry-instrumentation-urllib~=0.41b0",
9898
"opentelemetry-instrumentation-urllib3~=0.41b0",
99+
"opentelemetry-resource-detector-azure~=0.1.0",
99100
],
100101
entry_points={
101102
"opentelemetry_distro": [

sdk/monitor/azure-monitor-opentelemetry/tests/configuration/test_configure.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
14+
import os
1515
import unittest
1616
from unittest.mock import Mock, patch
1717

@@ -21,6 +21,7 @@
2121
_setup_instrumentations,
2222
_setup_logging,
2323
_setup_metrics,
24+
_setup_resources,
2425
_setup_tracing,
2526
configure_azure_monitor,
2627
)
@@ -39,8 +40,12 @@ class TestConfigure(unittest.TestCase):
3940
@patch(
4041
"azure.monitor.opentelemetry._configure._setup_tracing",
4142
)
43+
@patch(
44+
"azure.monitor.opentelemetry._configure._setup_resources",
45+
)
4246
def test_configure_azure_monitor(
4347
self,
48+
resource_mock,
4449
tracing_mock,
4550
logging_mock,
4651
metrics_mock,
@@ -50,6 +55,7 @@ def test_configure_azure_monitor(
5055
"connection_string": "test_cs",
5156
}
5257
configure_azure_monitor(**kwargs)
58+
resource_mock.assert_called_once()
5359
tracing_mock.assert_called_once()
5460
logging_mock.assert_called_once()
5561
metrics_mock.assert_called_once()
@@ -67,12 +73,16 @@ def test_configure_azure_monitor(
6773
@patch(
6874
"azure.monitor.opentelemetry._configure._setup_tracing",
6975
)
76+
@patch(
77+
"azure.monitor.opentelemetry._configure._setup_resources",
78+
)
7079
@patch(
7180
"azure.monitor.opentelemetry._configure._get_configurations",
7281
)
7382
def test_configure_azure_monitor_disable_tracing(
7483
self,
7584
config_mock,
85+
resource_mock,
7686
tracing_mock,
7787
logging_mock,
7888
metrics_mock,
@@ -86,6 +96,7 @@ def test_configure_azure_monitor_disable_tracing(
8696
}
8797
config_mock.return_value = configurations
8898
configure_azure_monitor()
99+
resource_mock.assert_called_once()
89100
tracing_mock.assert_not_called()
90101
logging_mock.assert_called_once_with(configurations)
91102
metrics_mock.assert_called_once_with(configurations)
@@ -103,12 +114,16 @@ def test_configure_azure_monitor_disable_tracing(
103114
@patch(
104115
"azure.monitor.opentelemetry._configure._setup_tracing",
105116
)
117+
@patch(
118+
"azure.monitor.opentelemetry._configure._setup_resources",
119+
)
106120
@patch(
107121
"azure.monitor.opentelemetry._configure._get_configurations",
108122
)
109123
def test_configure_azure_monitor_disable_logging(
110124
self,
111125
config_mock,
126+
resource_mock,
112127
tracing_mock,
113128
logging_mock,
114129
metrics_mock,
@@ -122,6 +137,7 @@ def test_configure_azure_monitor_disable_logging(
122137
}
123138
config_mock.return_value = configurations
124139
configure_azure_monitor()
140+
resource_mock.assert_called_once()
125141
tracing_mock.assert_called_once_with(configurations)
126142
logging_mock.assert_not_called()
127143
metrics_mock.assert_called_once_with(configurations)
@@ -139,12 +155,16 @@ def test_configure_azure_monitor_disable_logging(
139155
@patch(
140156
"azure.monitor.opentelemetry._configure._setup_tracing",
141157
)
158+
@patch(
159+
"azure.monitor.opentelemetry._configure._setup_resources",
160+
)
142161
@patch(
143162
"azure.monitor.opentelemetry._configure._get_configurations",
144163
)
145164
def test_configure_azure_monitor_disable_metrics(
146165
self,
147166
config_mock,
167+
resource_mock,
148168
tracing_mock,
149169
logging_mock,
150170
metrics_mock,
@@ -158,11 +178,28 @@ def test_configure_azure_monitor_disable_metrics(
158178
}
159179
config_mock.return_value = configurations
160180
configure_azure_monitor()
181+
resource_mock.assert_called_once()
161182
tracing_mock.assert_called_once_with(configurations)
162183
logging_mock.assert_called_once_with(configurations)
163184
metrics_mock.assert_not_called()
164185
instrumentation_mock.assert_called_once_with(configurations)
165186

187+
@patch.dict("os.environ", {"OTEL_EXPERIMENTAL_RESOURCE_DETECTORS": ""})
188+
def test_setup_resources(self):
189+
_setup_resources()
190+
self.assertEqual(
191+
os.environ["OTEL_EXPERIMENTAL_RESOURCE_DETECTORS"],
192+
"azure_app_service,azure_vm"
193+
)
194+
195+
@patch.dict("os.environ", {"OTEL_EXPERIMENTAL_RESOURCE_DETECTORS": "test_detector"})
196+
def test_setup_resources_existing_detectors(self):
197+
_setup_resources()
198+
self.assertEqual(
199+
os.environ["OTEL_EXPERIMENTAL_RESOURCE_DETECTORS"],
200+
"test_detector,azure_app_service,azure_vm"
201+
)
202+
166203
@patch(
167204
"azure.monitor.opentelemetry._configure.settings",
168205
)

shared_requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ opentelemetry-instrumentation-psycopg2
4646
opentelemetry-instrumentation-requests
4747
opentelemetry-instrumentation-urllib
4848
opentelemetry-instrumentation-urllib3
49+
opentelemetry-resource-detector-azure
4950
azure-nspkg
5051
azure-ai-nspkg
5152
azure-cognitiveservices-nspkg

0 commit comments

Comments
 (0)