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

Commit 6721a56

Browse files
authored
Move heartbeat init logic into worker (#952)
1 parent e577df9 commit 6721a56

File tree

5 files changed

+58
-17
lines changed

5 files changed

+58
-17
lines changed

contrib/opencensus-ext-azure/examples/traces/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@
2626
tracer = Tracer(exporter=AzureExporter(), sampler=ProbabilitySampler(1.0))
2727
with tracer.span(name='parent'):
2828
with tracer.span(name='child'):
29-
response = requests.get(url='http://localhost:8080/')
29+
response = requests.get(url='http://example.com/')
3030
print(response.status_code)
3131
print(response.text)

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

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,23 @@ class HeartbeatMetric:
3737
def __init__(self):
3838
self.vm_data = {}
3939
self.vm_retry = False
40+
self.init = False
4041
self.properties = OrderedDict()
41-
self._init_properties()
42-
self.heartbeat = LongGauge(
43-
HeartbeatMetric.NAME,
44-
'Heartbeat metric with custom dimensions',
45-
'count',
46-
list(self.properties.keys()),
47-
)
48-
self.heartbeat.get_or_create_time_series(
49-
list(self.properties.values())
50-
)
5142

5243
def get_metrics(self):
53-
if self.vm_retry:
44+
if not self.init:
45+
self._init_properties()
46+
self.heartbeat = LongGauge(
47+
HeartbeatMetric.NAME,
48+
'Heartbeat metric with custom dimensions',
49+
'count',
50+
list(self.properties.keys()),
51+
)
52+
self.heartbeat.get_or_create_time_series(
53+
list(self.properties.values())
54+
)
55+
self.init = True
56+
elif self.vm_retry:
5457
# Only need to possibly update if vm retry
5558
if self._get_azure_compute_metadata() and not self.vm_retry:
5659
self._populate_vm_data()
@@ -64,7 +67,10 @@ def get_metrics(self):
6467
self.heartbeat.get_or_create_time_series(
6568
list(self.properties.values())
6669
)
67-
return [self.heartbeat.get_metric(datetime.datetime.utcnow())]
70+
if self.heartbeat:
71+
return [self.heartbeat.get_metric(datetime.datetime.utcnow())]
72+
else:
73+
return []
6874

6975
def _init_properties(self):
7076
self.properties[LabelKey("sdk", '')] = LabelValue(

contrib/opencensus-ext-azure/opencensus/ext/azure/trace_exporter/__init__.py

Lines changed: 3 additions & 1 deletion
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+
import atexit
1516
import json
1617
import logging
1718

@@ -58,6 +59,7 @@ def __init__(self, **options):
5859
)
5960
self._telemetry_processors = []
6061
super(AzureExporter, self).__init__(**options)
62+
atexit.register(self._stop, self.options.grace_period)
6163
heartbeat_metrics.enable_heartbeat_metrics(
6264
self.options.connection_string, self.options.instrumentation_key)
6365

@@ -181,4 +183,4 @@ def emit(self, batch, event=None):
181183

182184
def _stop(self, timeout=None):
183185
self.storage.close()
184-
return self._worker.stop(timeout)
186+
self._worker.stop(timeout)

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

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,16 @@ def test_enable_heartbeat_metrics_exists(self, transport_mock):
8484

8585
def test_heartbeat_metric_init(self):
8686
metric = heartbeat_metrics.HeartbeatMetric()
87+
self.assertEqual(len(metric.vm_data), 0)
88+
self.assertFalse(metric.vm_retry)
89+
self.assertFalse(metric.init)
90+
self.assertEqual(len(metric.properties), 0)
8791

92+
def test_heartbeat_metric_get_metric_init(self):
93+
metric = heartbeat_metrics.HeartbeatMetric()
94+
self.assertFalse(metric.init)
95+
metrics = metric.get_metrics()
96+
self.assertTrue(metric.init)
8897
self.assertEqual(metric.NAME, 'Heartbeat')
8998
keys = list(metric.properties.keys())
9099
values = list(metric.properties.values())
@@ -115,6 +124,7 @@ def test_heartbeat_metric_init(self):
115124
gauge._len_label_keys,
116125
len(metric.properties.keys())
117126
)
127+
self.assertEqual(len(metrics), 1)
118128

119129
@mock.patch.dict(
120130
os.environ,
@@ -126,7 +136,9 @@ def test_heartbeat_metric_init(self):
126136
)
127137
def test_heartbeat_metric_init_webapp(self):
128138
metric = heartbeat_metrics.HeartbeatMetric()
129-
139+
self.assertFalse(metric.init)
140+
metric.get_metrics()
141+
self.assertTrue(metric.init)
130142
self.assertEqual(metric.NAME, 'Heartbeat')
131143
keys = list(metric.properties.keys())
132144
values = list(metric.properties.values())
@@ -156,7 +168,9 @@ def test_heartbeat_metric_init_webapp(self):
156168
)
157169
def test_heartbeat_metric_init_functionapp(self):
158170
metric = heartbeat_metrics.HeartbeatMetric()
159-
171+
self.assertFalse(metric.init)
172+
metric.get_metrics()
173+
self.assertTrue(metric.init)
160174
self.assertEqual(metric.NAME, 'Heartbeat')
161175
keys = list(metric.properties.keys())
162176
values = list(metric.properties.values())
@@ -186,6 +200,10 @@ def test_heartbeat_metric_init_vm(self):
186200
)
187201
)
188202
metric = heartbeat_metrics.HeartbeatMetric()
203+
self.assertFalse(metric.init)
204+
self.assertFalse(metric.vm_retry)
205+
metric.get_metrics()
206+
self.assertTrue(metric.init)
189207
self.assertFalse(metric.vm_retry)
190208
self.assertEqual(metric.NAME, 'Heartbeat')
191209
keys = list(metric.properties.keys())
@@ -213,6 +231,10 @@ def test_heartbeat_metric_not_vm(self):
213231
throw(requests.exceptions.ConnectionError)
214232
):
215233
metric = heartbeat_metrics.HeartbeatMetric()
234+
self.assertFalse(metric.init)
235+
self.assertFalse(metric.vm_retry)
236+
metric.get_metrics()
237+
self.assertTrue(metric.init)
216238
self.assertFalse(metric.vm_retry)
217239
self.assertEqual(metric.NAME, 'Heartbeat')
218240
keys = list(metric.properties.keys())
@@ -224,6 +246,10 @@ def test_heartbeat_metric_not_vm_timeout(self):
224246
throw(requests.Timeout)
225247
):
226248
metric = heartbeat_metrics.HeartbeatMetric()
249+
self.assertFalse(metric.init)
250+
self.assertFalse(metric.vm_retry)
251+
metric.get_metrics()
252+
self.assertTrue(metric.init)
227253
self.assertFalse(metric.vm_retry)
228254
self.assertEqual(metric.NAME, 'Heartbeat')
229255
keys = list(metric.properties.keys())
@@ -235,6 +261,10 @@ def test_heartbeat_metric_vm_retry(self):
235261
throw(requests.exceptions.RequestException)
236262
):
237263
metric = heartbeat_metrics.HeartbeatMetric()
264+
self.assertFalse(metric.init)
265+
self.assertFalse(metric.vm_retry)
266+
metric.get_metrics()
267+
self.assertTrue(metric.init)
238268
self.assertTrue(metric.vm_retry)
239269
keys = list(metric.properties.keys())
240270
self.assertEqual(len(keys), 2)

opencensus/metrics/transport.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ def run(self):
8686

8787
def close(self):
8888
try:
89-
return self.func(*self.args, **self.kwargs)
89+
# Suppress request tracking on flush
90+
execution_context.set_is_exporter(True)
91+
self.func(*self.args, **self.kwargs)
92+
execution_context.set_is_exporter(False)
9093
except Exception as ex:
9194
logger.exception("Error handling metric flush: {}".format(ex))
9295
self.cancel()

0 commit comments

Comments
 (0)