Skip to content

Commit 19241b2

Browse files
authored
Update AKS checks and tests to use KUBERNETES_SERVICE_HOST (#39941)
* Update AKS checks and tests * changelog * clean up * RP Id for statsbeat needs work * Use both AKS env vars * Update check to use both env vars
1 parent ffd0684 commit 19241b2

File tree

6 files changed

+155
-32
lines changed

6 files changed

+155
-32
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
([#39886](https://github.com/Azure/azure-sdk-for-python/pull/39886))
2424
- Populate `client_Ip` on `customEvent` telemetry
2525
([#39923](https://github.com/Azure/azure-sdk-for-python/pull/39923))
26+
- Update AKS check to use KUBERNETES_SERVICE_HOST
27+
([#39941](https://github.com/Azure/azure-sdk-for-python/pull/39941))
2628

2729
### Bugs Fixed
2830

sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
_FUNCTIONS_WORKER_RUNTIME = "FUNCTIONS_WORKER_RUNTIME"
2525
_PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY = "PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY"
2626
_AKS_ARM_NAMESPACE_ID = "AKS_ARM_NAMESPACE_ID"
27+
_KUBERNETES_SERVICE_HOST = "KUBERNETES_SERVICE_HOST"
2728

2829
# Network
2930

sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_utils.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@
2323
from azure.monitor.opentelemetry.exporter._constants import (
2424
_AKS_ARM_NAMESPACE_ID,
2525
_DEFAULT_AAD_SCOPE,
26-
_INSTRUMENTATIONS_BIT_MAP,
2726
_FUNCTIONS_WORKER_RUNTIME,
27+
_INSTRUMENTATIONS_BIT_MAP,
28+
_KUBERNETES_SERVICE_HOST,
2829
_PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY,
2930
_WEBSITE_SITE_NAME,
3031
)
@@ -63,7 +64,7 @@ def _is_on_functions():
6364

6465

6566
def _is_on_aks():
66-
return _AKS_ARM_NAMESPACE_ID in environ
67+
return _AKS_ARM_NAMESPACE_ID in environ or _KUBERNETES_SERVICE_HOST in environ
6768

6869

6970
# Attach
@@ -74,6 +75,8 @@ def _is_attach_enabled():
7475
return isdir("/agents/python/")
7576
if _is_on_functions():
7677
return environ.get(_PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY) == "true"
78+
if _is_on_aks():
79+
return _AKS_ARM_NAMESPACE_ID in environ
7780
return False
7881

7982

sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_statsbeat_metrics.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from azure.monitor.opentelemetry.exporter._constants import (
1919
_ATTACH_METRIC_NAME,
2020
_FEATURE_METRIC_NAME,
21+
_KUBERNETES_SERVICE_HOST,
2122
_REQ_DURATION_NAME,
2223
_REQ_EXCEPTION_NAME,
2324
_REQ_FAILURE_NAME,
@@ -187,7 +188,10 @@ def _get_attach_metric(self, options: CallbackOptions) -> Iterable[Observation]:
187188
elif _utils._is_on_aks():
188189
# AKS
189190
rp = _RP_Names.AKS.value
190-
rpId = os.environ.get(_AKS_ARM_NAMESPACE_ID, "")
191+
if _AKS_ARM_NAMESPACE_ID in os.environ:
192+
rpId = os.environ.get(_AKS_ARM_NAMESPACE_ID, "")
193+
else:
194+
rpId = os.environ.get(_KUBERNETES_SERVICE_HOST , "")
191195
elif self._vm_retry and self._get_azure_compute_metadata():
192196
# VM
193197
rp = _RP_Names.VM.value

sdk/monitor/azure-monitor-opentelemetry-exporter/tests/statsbeat/test_statsbeat.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,9 +447,10 @@ def test_get_attach_metric_functions(self, metadata_mock):
447447
os.environ,
448448
{
449449
"AKS_ARM_NAMESPACE_ID": "namespace_id",
450+
"KUBERNETES_SERVICE_HOST": "TEST_KUBERNETES_SERVICE_HOST",
450451
},
451452
)
452-
def test_get_attach_metric_aks(self):
453+
def test_get_attach_metric_aks_attach(self):
453454
attributes = dict(_StatsbeatMetrics._COMMON_ATTRIBUTES)
454455
self.assertEqual(attributes["rp"], _RP_Names.UNKNOWN.value)
455456
attributes["rp"] = _RP_Names.AKS.value
@@ -460,6 +461,24 @@ def test_get_attach_metric_aks(self):
460461
self.assertEqual(obs.attributes, attributes)
461462
self.assertEqual(_StatsbeatMetrics._COMMON_ATTRIBUTES["rp"], _RP_Names.AKS.value)
462463

464+
# pylint: disable=protected-access
465+
@mock.patch.dict(
466+
os.environ,
467+
{
468+
"KUBERNETES_SERVICE_HOST": "TEST_KUBERNETES_SERVICE_HOST",
469+
},
470+
)
471+
def test_get_attach_metric_aks_manual(self):
472+
attributes = dict(_StatsbeatMetrics._COMMON_ATTRIBUTES)
473+
self.assertEqual(attributes["rp"], _RP_Names.UNKNOWN.value)
474+
attributes["rp"] = _RP_Names.AKS.value
475+
attributes["rpId"] = "TEST_KUBERNETES_SERVICE_HOST"
476+
observations = self._metric._get_attach_metric(options=None)
477+
for obs in observations:
478+
self.assertEqual(obs.value, 1)
479+
self.assertEqual(obs.attributes, attributes)
480+
self.assertEqual(_StatsbeatMetrics._COMMON_ATTRIBUTES["rp"], _RP_Names.AKS.value)
481+
463482
@mock.patch(
464483
"azure.monitor.opentelemetry.exporter.statsbeat._statsbeat_metrics._StatsbeatMetrics._get_azure_compute_metadata"
465484
)

sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_utils.py

Lines changed: 122 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
TEST_TIMESTAMP = "TEST_TIMESTAMP"
3030
TEST_TIME = "TEST_TIME"
3131
TEST_WEBSITE_SITE_NAME = "TEST_WEBSITE_SITE_NAME"
32+
TEST_KUBERNETES_SERVICE_HOST = "TEST_KUBERNETES_SERVICE_HOST"
33+
TEST_AKS_ARM_NAMESPACE_ID = "TEST_AKS_ARM_NAMESPACE_ID"
3234

3335

3436
class TestUtils(unittest.TestCase):
@@ -105,37 +107,37 @@ def test_create_telemetry_item(self, mock_ns_to_iso_str):
105107

106108
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
107109
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
108-
def test_get_sdk_version_prefix(self, mock_system, mock_getenv):
110+
def test_get_sdk_version_prefix(self, mock_system, mock_isdir):
109111
result = _utils._get_sdk_version_prefix()
110112
self.assertEqual(result, "uum_")
111113

112114
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
113115
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
114-
def test_get_sdk_version_prefix_linux(self, mock_system, mock_getenv):
116+
def test_get_sdk_version_prefix_linux(self, mock_system, mock_isdir):
115117
result = _utils._get_sdk_version_prefix()
116118
self.assertEqual(result, "ulm_")
117119

118120
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
119121
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
120-
def test_get_sdk_version_prefix_windows(self, mock_system, mock_getenv):
122+
def test_get_sdk_version_prefix_windows(self, mock_system, mock_isdir):
121123
result = _utils._get_sdk_version_prefix()
122124
self.assertEqual(result, "uwm_")
123125

124126
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
125127
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
126-
def test_get_sdk_version_prefix_attach(self, mock_system, mock_getenv):
128+
def test_get_sdk_version_prefix_attach(self, mock_system, mock_isdir):
127129
result = _utils._get_sdk_version_prefix()
128130
self.assertEqual(result, "uui_")
129131

130132
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
131133
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
132-
def test_get_sdk_version_prefix_attach_linux(self, mock_system, mock_getenv):
134+
def test_get_sdk_version_prefix_attach_linux(self, mock_system, mock_isdir):
133135
result = _utils._get_sdk_version_prefix()
134136
self.assertEqual(result, "uli_")
135137

136138
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
137139
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
138-
def test_get_sdk_version_prefix_attach_windows(self, mock_system, mock_getenv):
140+
def test_get_sdk_version_prefix_attach_windows(self, mock_system, mock_isdir):
139141
result = _utils._get_sdk_version_prefix()
140142
self.assertEqual(result, "uwi_")
141143

@@ -146,7 +148,7 @@ def test_get_sdk_version_prefix_attach_windows(self, mock_system, mock_getenv):
146148
)
147149
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
148150
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
149-
def test_get_sdk_version_prefix_app_service(self, mock_system, mock_getenv):
151+
def test_get_sdk_version_prefix_app_service(self, mock_system, mock_isdir):
150152
result = _utils._get_sdk_version_prefix()
151153
self.assertEqual(result, "aum_")
152154

@@ -155,7 +157,7 @@ def test_get_sdk_version_prefix_app_service(self, mock_system, mock_getenv):
155157
)
156158
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
157159
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
158-
def test_get_sdk_version_prefix_app_service_linux(self, mock_system, mock_getenv):
160+
def test_get_sdk_version_prefix_app_service_linux(self, mock_system, mock_isdir):
159161
result = _utils._get_sdk_version_prefix()
160162
self.assertEqual(result, "alm_")
161163

@@ -164,7 +166,7 @@ def test_get_sdk_version_prefix_app_service_linux(self, mock_system, mock_getenv
164166
)
165167
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=False)
166168
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
167-
def test_get_sdk_version_prefix_app_service_windows(self, mock_system, mock_getenv):
169+
def test_get_sdk_version_prefix_app_service_windows(self, mock_system, mock_isdir):
168170
result = _utils._get_sdk_version_prefix()
169171
self.assertEqual(result, "awm_")
170172

@@ -173,7 +175,7 @@ def test_get_sdk_version_prefix_app_service_windows(self, mock_system, mock_gete
173175
)
174176
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=True)
175177
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
176-
def test_get_sdk_version_prefix_app_service_attach(self, mock_system, mock_getenv):
178+
def test_get_sdk_version_prefix_app_service_attach(self, mock_system, mock_isdir):
177179
result = _utils._get_sdk_version_prefix()
178180
self.assertEqual(result, "aui_")
179181

@@ -182,7 +184,7 @@ def test_get_sdk_version_prefix_app_service_attach(self, mock_system, mock_geten
182184
)
183185
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=True)
184186
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
185-
def test_get_sdk_version_prefix_app_service_linux_attach(self, mock_system, mock_getenv):
187+
def test_get_sdk_version_prefix_app_service_linux_attach(self, mock_system, mock_isdir):
186188
result = _utils._get_sdk_version_prefix()
187189
self.assertEqual(result, "ali_")
188190

@@ -191,7 +193,7 @@ def test_get_sdk_version_prefix_app_service_linux_attach(self, mock_system, mock
191193
)
192194
@patch("azure.monitor.opentelemetry.exporter._utils.isdir", return_value=True)
193195
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
194-
def test_get_sdk_version_prefix_app_service_windows_attach(self, mock_system, mock_getenv):
196+
def test_get_sdk_version_prefix_app_service_windows_attach(self, mock_system, mock_isdir):
195197
result = _utils._get_sdk_version_prefix()
196198
self.assertEqual(result, "awi_")
197199

@@ -202,9 +204,8 @@ def test_get_sdk_version_prefix_app_service_windows_attach(self, mock_system, mo
202204
{"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME},
203205
clear=True,
204206
)
205-
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
206207
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
207-
def test_get_sdk_version_prefix_function(self, mock_system, mock_getenv):
208+
def test_get_sdk_version_prefix_function(self, mock_system):
208209
result = _utils._get_sdk_version_prefix()
209210
self.assertEqual(result, "fum_")
210211

@@ -213,9 +214,8 @@ def test_get_sdk_version_prefix_function(self, mock_system, mock_getenv):
213214
{"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME},
214215
clear=True,
215216
)
216-
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
217217
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
218-
def test_get_sdk_version_prefix_function_linux(self, mock_system, mock_getenv):
218+
def test_get_sdk_version_prefix_function_linux(self, mock_system):
219219
result = _utils._get_sdk_version_prefix()
220220
self.assertEqual(result, "flm_")
221221

@@ -224,45 +224,124 @@ def test_get_sdk_version_prefix_function_linux(self, mock_system, mock_getenv):
224224
{"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME},
225225
clear=True,
226226
)
227-
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=False)
228227
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
229-
def test_get_sdk_version_prefix_function_windows(self, mock_system, mock_getenv):
228+
def test_get_sdk_version_prefix_function_windows(self, mock_system):
230229
result = _utils._get_sdk_version_prefix()
231230
self.assertEqual(result, "fwm_")
232231

233232
@patch.dict(
234233
"azure.monitor.opentelemetry.exporter._utils.environ",
235-
{"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME},
234+
{
235+
"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME,
236+
"PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY": "true",
237+
},
236238
clear=True,
237239
)
238-
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
239240
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
240-
def test_get_sdk_version_prefix_function_attach(self, mock_system, mock_getenv):
241+
def test_get_sdk_version_prefix_function_attach(self, mock_system):
241242
result = _utils._get_sdk_version_prefix()
242243
self.assertEqual(result, "fui_")
243244

244245
@patch.dict(
245246
"azure.monitor.opentelemetry.exporter._utils.environ",
246-
{"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME},
247+
{
248+
"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME,
249+
"PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY": "true",
250+
},
247251
clear=True,
248252
)
249-
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
250253
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
251-
def test_get_sdk_version_prefix_function_linux_attach(self, mock_system, mock_getenv):
254+
def test_get_sdk_version_prefix_function_linux_attach(self, mock_system):
252255
result = _utils._get_sdk_version_prefix()
253256
self.assertEqual(result, "fli_")
254257

255258
@patch.dict(
256259
"azure.monitor.opentelemetry.exporter._utils.environ",
257-
{"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME},
260+
{
261+
"FUNCTIONS_WORKER_RUNTIME": TEST_WEBSITE_SITE_NAME,
262+
"PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY": "true",
263+
},
258264
clear=True,
259265
)
260-
@patch("azure.monitor.opentelemetry.exporter._utils._is_attach_enabled", return_value=True)
261266
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
262-
def test_get_sdk_version_prefix_function_windows_attach(self, mock_system, mock_getenv):
267+
def test_get_sdk_version_prefix_function_windows_attach(self, mock_system):
263268
result = _utils._get_sdk_version_prefix()
264269
self.assertEqual(result, "fwi_")
265270

271+
# AKS SDK Version Prefix
272+
273+
@patch.dict(
274+
"azure.monitor.opentelemetry.exporter._utils.environ",
275+
{
276+
"KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST,
277+
},
278+
clear=True,
279+
)
280+
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
281+
def test_get_sdk_version_prefix_aks(self, mock_system):
282+
result = _utils._get_sdk_version_prefix()
283+
self.assertEqual(result, "kum_")
284+
285+
@patch.dict(
286+
"azure.monitor.opentelemetry.exporter._utils.environ",
287+
{
288+
"KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST,
289+
},
290+
clear=True,
291+
)
292+
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
293+
def test_get_sdk_version_prefix_aks_linux(self, mock_system):
294+
result = _utils._get_sdk_version_prefix()
295+
self.assertEqual(result, "klm_")
296+
297+
@patch.dict(
298+
"azure.monitor.opentelemetry.exporter._utils.environ",
299+
{
300+
"KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST,
301+
},
302+
clear=True,
303+
)
304+
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
305+
def test_get_sdk_version_prefix_aks_windows(self, mock_system):
306+
result = _utils._get_sdk_version_prefix()
307+
self.assertEqual(result, "kwm_")
308+
309+
@patch.dict(
310+
"azure.monitor.opentelemetry.exporter._utils.environ",
311+
{
312+
"AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID,
313+
},
314+
clear=True,
315+
)
316+
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="")
317+
def test_get_sdk_version_prefix_aks_attach(self, mock_system):
318+
result = _utils._get_sdk_version_prefix()
319+
self.assertEqual(result, "kui_")
320+
321+
@patch.dict(
322+
"azure.monitor.opentelemetry.exporter._utils.environ",
323+
{
324+
"AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID,
325+
},
326+
clear=True,
327+
)
328+
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Linux")
329+
def test_get_sdk_version_prefix_aks_linux_attach(self, mock_system):
330+
result = _utils._get_sdk_version_prefix()
331+
self.assertEqual(result, "kli_")
332+
333+
@patch.dict(
334+
"azure.monitor.opentelemetry.exporter._utils.environ",
335+
{
336+
"AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID,
337+
},
338+
clear=True,
339+
)
340+
@patch("azure.monitor.opentelemetry.exporter._utils.platform.system", return_value="Windows")
341+
def test_get_sdk_version_prefix_aks_windows_attach(self, mock_system):
342+
result = _utils._get_sdk_version_prefix()
343+
self.assertEqual(result, "kwi_")
344+
266345
# Attach
267346

268347
@patch(
@@ -288,7 +367,22 @@ def test_attach_app_service_disabled(self, mock_isdir):
288367
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {}, clear=True)
289368
def test_attach_off_app_service_with_agent(self, mock_isdir):
290369
# This is not an expected scenario and just tests the default
291-
self.assertEqual(_utils._is_attach_enabled(), False)
370+
self.assertFalse(_utils._is_attach_enabled())
371+
372+
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {
373+
"KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST,
374+
"AKS_ARM_NAMESPACE_ID": TEST_AKS_ARM_NAMESPACE_ID,
375+
}, clear=True)
376+
def test_attach_aks(self):
377+
# This is not an expected scenario and just tests the default
378+
self.assertTrue(_utils._is_attach_enabled())
379+
380+
@patch.dict("azure.monitor.opentelemetry.exporter._utils.environ", {
381+
"KUBERNETES_SERVICE_HOST": TEST_KUBERNETES_SERVICE_HOST,
382+
}, clear=True)
383+
def test_aks_no_attach(self):
384+
# This is not an expected scenario and just tests the default
385+
self.assertFalse(_utils._is_attach_enabled())
292386

293387
# Synthetic
294388

0 commit comments

Comments
 (0)