Skip to content
This repository was archived by the owner on Sep 17, 2025. It is now read-only.

Commit e1d3c3b

Browse files
authored
Only ping azuremetadataservice if vm retry (#946)
1 parent 6d20b64 commit e1d3c3b

File tree

3 files changed

+62
-54
lines changed

3 files changed

+62
-54
lines changed

contrib/opencensus-ext-azure/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
([#935](https://github.com/census-instrumentation/opencensus-python/pull/935))
99
- Add links in properties for trace exporter envelopes
1010
([#936](https://github.com/census-instrumentation/opencensus-python/pull/936))
11+
- Fix attach rate metrics for VM to only ping data service on retry
12+
([#946](https://github.com/census-instrumentation/opencensus-python/pull/946))
1113

1214
## 1.0.4
1315
Released 2020-06-29

contrib/opencensus-ext-azure/opencensus/ext/azure/metrics_exporter/heartbeat_metrics/heartbeat.py

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ class HeartbeatMetric:
3636

3737
def __init__(self):
3838
self.vm_data = {}
39-
self.is_vm = False
39+
self.vm_retry = False
4040
self.properties = OrderedDict()
41-
self.update_properties()
41+
self._init_properties()
4242
self.heartbeat = LongGauge(
4343
HeartbeatMetric.NAME,
4444
'Heartbeat metric with custom dimensions',
@@ -50,22 +50,23 @@ def __init__(self):
5050
)
5151

5252
def get_metrics(self):
53-
if self.is_vm:
54-
# Only need to update if in vm (properties could change)
55-
self.properties.clear()
56-
self.update_properties()
57-
self.heartbeat = LongGauge(
58-
HeartbeatMetric.NAME,
59-
'Heartbeat metric with custom dimensions',
60-
'count',
61-
list(self.properties.keys()),
62-
)
63-
self.heartbeat.get_or_create_time_series(
64-
list(self.properties.values())
65-
)
53+
if self.vm_retry:
54+
# Only need to possibly update if vm retry
55+
if self._get_azure_compute_metadata() and not self.vm_retry:
56+
self._populate_vm_data()
57+
# Recreate the metric to initialize key/values
58+
self.heartbeat = LongGauge(
59+
HeartbeatMetric.NAME,
60+
'Heartbeat metric with custom dimensions',
61+
'count',
62+
list(self.properties.keys()),
63+
)
64+
self.heartbeat.get_or_create_time_series(
65+
list(self.properties.values())
66+
)
6667
return [self.heartbeat.get_metric(datetime.datetime.utcnow())]
6768

68-
def update_properties(self):
69+
def _init_properties(self):
6970
self.properties[LabelKey("sdk", '')] = LabelValue(
7071
'py{}:oc{}:ext{}'.format(
7172
platform.python_version(),
@@ -86,35 +87,40 @@ def update_properties(self):
8687
# Function apps
8788
self.properties[LabelKey("azfunction_appId", '')] = \
8889
LabelValue(os.environ.get("WEBSITE_HOSTNAME"))
89-
elif self.get_azure_compute_metadata():
90+
elif self._get_azure_compute_metadata() and not self.vm_retry:
9091
# VM
91-
if self.vm_data:
92-
self.properties[LabelKey("azInst_vmId", '')] = \
93-
LabelValue(self.vm_data.get("vmId", ''))
94-
self.properties[LabelKey("azInst_subscriptionId", '')] = \
95-
LabelValue(self.vm_data.get("subscriptionId", ''))
96-
self.properties[LabelKey("azInst_osType", '')] = \
97-
LabelValue(self.vm_data.get("osType", ''))
92+
self._populate_vm_data()
9893

99-
def get_azure_compute_metadata(self):
94+
def _get_azure_compute_metadata(self):
10095
try:
10196
request_url = "{0}?{1}&{2}".format(
10297
_AIMS_URI, _AIMS_API_VERSION, _AIMS_FORMAT)
10398
response = requests.get(
10499
request_url, headers={"MetaData": "True"}, timeout=5.0)
105100
except (requests.exceptions.ConnectionError, requests.Timeout):
106101
# Not in VM
107-
self.is_vm = False
102+
self.vm_retry = False
108103
return False
109104
except requests.exceptions.RequestException:
110-
pass # retry
105+
self.vm_retry = True # retry
106+
return False
111107

112-
self.is_vm = True
113108
try:
114109
text = response.text
115110
self.vm_data = json.loads(text)
116111
except Exception: # pylint: disable=broad-except
117112
# Error in reading response body, retry
118-
pass
113+
self.vm_retry = True
114+
return False
119115

116+
self.vm_retry = False
120117
return True
118+
119+
def _populate_vm_data(self):
120+
if self.vm_data:
121+
self.properties[LabelKey("azInst_vmId", '')] = \
122+
LabelValue(self.vm_data.get("vmId", ''))
123+
self.properties[LabelKey("azInst_subscriptionId", '')] = \
124+
LabelValue(self.vm_data.get("subscriptionId", ''))
125+
self.properties[LabelKey("azInst_osType", '')] = \
126+
LabelValue(self.vm_data.get("osType", ''))

contrib/opencensus-ext-azure/tests/test_azure_heartbeat_metrics.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def test_heartbeat_metric_init_vm(self):
186186
)
187187
)
188188
metric = heartbeat_metrics.HeartbeatMetric()
189-
self.assertTrue(metric.is_vm)
189+
self.assertFalse(metric.vm_retry)
190190
self.assertEqual(metric.NAME, 'Heartbeat')
191191
keys = list(metric.properties.keys())
192192
values = list(metric.properties.values())
@@ -213,7 +213,7 @@ def test_heartbeat_metric_not_vm(self):
213213
throw(requests.exceptions.ConnectionError)
214214
):
215215
metric = heartbeat_metrics.HeartbeatMetric()
216-
self.assertFalse(metric.is_vm)
216+
self.assertFalse(metric.vm_retry)
217217
self.assertEqual(metric.NAME, 'Heartbeat')
218218
keys = list(metric.properties.keys())
219219
self.assertEqual(len(keys), 2)
@@ -224,34 +224,34 @@ def test_heartbeat_metric_not_vm_timeout(self):
224224
throw(requests.Timeout)
225225
):
226226
metric = heartbeat_metrics.HeartbeatMetric()
227-
self.assertFalse(metric.is_vm)
227+
self.assertFalse(metric.vm_retry)
228228
self.assertEqual(metric.NAME, 'Heartbeat')
229229
keys = list(metric.properties.keys())
230230
self.assertEqual(len(keys), 2)
231231

232-
def test_heartbeat_metric_vm_error_response(self):
233-
with mock.patch('requests.get') as get:
234-
get.return_value = MockResponse(
235-
200,
236-
json.dumps(
237-
{
238-
'vmId': 5,
239-
'subscriptionId': 3,
240-
'osType': 'Linux'
241-
}
242-
)
243-
)
232+
def test_heartbeat_metric_vm_retry(self):
233+
with mock.patch(
234+
'requests.get',
235+
throw(requests.exceptions.RequestException)
236+
):
244237
metric = heartbeat_metrics.HeartbeatMetric()
245-
self.assertTrue(metric.is_vm)
238+
self.assertTrue(metric.vm_retry)
246239
keys = list(metric.properties.keys())
247-
self.assertEqual(len(keys), 5)
248-
with mock.patch(
249-
'requests.get',
250-
throw(Exception)
251-
):
252-
metric.vm_data.clear()
253-
self.assertTrue(metric.is_vm)
254-
self.assertEqual(len(metric.vm_data), 0)
255-
self.assertTrue(metric.is_vm)
240+
self.assertEqual(len(keys), 2)
241+
self.assertEqual(len(metric.vm_data), 0)
242+
with mock.patch('requests.get') as get:
243+
get.return_value = MockResponse(
244+
200,
245+
json.dumps(
246+
{
247+
'vmId': 5,
248+
'subscriptionId': 3,
249+
'osType': 'Linux'
250+
}
251+
)
252+
)
253+
metric.get_metrics()
254+
self.assertFalse(metric.vm_retry)
255+
self.assertEqual(len(metric.vm_data), 3)
256256
keys = list(metric.properties.keys())
257257
self.assertEqual(len(keys), 5)

0 commit comments

Comments
 (0)