@@ -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" , '' ))
0 commit comments