1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15+ import json
1516import os
1617import platform
1718import unittest
1819
1920import mock
21+ import requests
2022
2123from opencensus .common .version import __version__ as opencensus_version
2224from opencensus .ext .azure .common .version import __version__ as ext_version
2325from opencensus .ext .azure .metrics_exporter import heartbeat_metrics
2426
2527
28+ class MockResponse (object ):
29+ def __init__ (self , status_code , text ):
30+ self .status_code = status_code
31+ self .text = text
32+
33+
34+ def throw (exc_type , * args , ** kwargs ):
35+ def func (* _args , ** _kwargs ):
36+ raise exc_type (* args , ** kwargs )
37+ return func
38+
39+
2640class TestHeartbeatMetrics (unittest .TestCase ):
2741 def setUp (self ):
2842 # pylint: disable=protected-access
2943 heartbeat_metrics ._HEARTBEAT_METRICS = None
3044
31- @mock .patch ('opencensus.ext.azure.metrics_exporter'
32- '.heartbeat_metrics.register_metrics' )
33- def test_producer_ctor (self , avail_mock ):
34- heartbeat_metrics .AzureHeartbeatMetricsProducer ()
35-
36- self .assertEqual (len (avail_mock .call_args_list ), 1 )
45+ def test_producer_ctor (self ):
46+ producer = heartbeat_metrics .AzureHeartbeatMetricsProducer ()
47+ # pylint: disable=protected-access
48+ metric = producer ._heartbeat
49+ self .assertTrue (
50+ isinstance (
51+ metric ,
52+ heartbeat_metrics .heartbeat .HeartbeatMetric
53+ )
54+ )
3755
3856 def test_producer_get_metrics (self ):
3957 producer = heartbeat_metrics .AzureHeartbeatMetricsProducer ()
4058 metrics = producer .get_metrics ()
4159
4260 self .assertEqual (len (metrics ), 1 )
4361
44- def test_register_metrics (self ):
45- registry = heartbeat_metrics .register_metrics ()
46-
47- self .assertEqual (len (registry .get_metrics ()), 1 )
48-
4962 @mock .patch ('opencensus.metrics.transport.get_exporter_thread' )
5063 def test_enable_heartbeat_metrics (self , transport_mock ):
5164 ikey = '12345678-1234-5678-abcd-12345678abcd'
@@ -61,7 +74,7 @@ def test_enable_heartbeat_metrics(self, transport_mock):
6174 transport_mock .assert_called ()
6275
6376 @mock .patch ('opencensus.metrics.transport.get_exporter_thread' )
64- def test_enable_heartbeat_metrics_exits (self , transport_mock ):
77+ def test_enable_heartbeat_metrics_exists (self , transport_mock ):
6578 # pylint: disable=protected-access
6679 producer = heartbeat_metrics .AzureHeartbeatMetricsProducer ()
6780 heartbeat_metrics ._HEARTBEAT_METRICS = producer
@@ -85,6 +98,23 @@ def test_heartbeat_metric_init(self):
8598 ext_version ,
8699 ))
87100 self .assertEqual (values [1 ].value , platform .system ())
101+ gauge = metric .heartbeat
102+
103+ self .assertEqual (gauge .descriptor .name , 'Heartbeat' )
104+ self .assertEqual (
105+ gauge .descriptor .description ,
106+ 'Heartbeat metric with custom dimensions'
107+ )
108+ self .assertEqual (gauge .descriptor .unit , 'count' )
109+ self .assertEqual (gauge .descriptor ._type , 1 )
110+ self .assertEqual (
111+ gauge .descriptor .label_keys ,
112+ list (metric .properties .keys ())
113+ )
114+ self .assertEqual (
115+ gauge ._len_label_keys ,
116+ len (metric .properties .keys ())
117+ )
88118
89119 @mock .patch .dict (
90120 os .environ ,
@@ -143,23 +173,74 @@ def test_heartbeat_metric_init_functionapp(self):
143173 self .assertEqual (keys [2 ].key , "azfunction_appId" )
144174 self .assertEqual (values [2 ].value , "host_name" )
145175
146- def test_heartbeat_metric (self ):
147- # pylint: disable=protected-access
148- metric = heartbeat_metrics .HeartbeatMetric ()
149- gauge = metric ()
150-
151- self .assertEqual (gauge .descriptor .name , 'Heartbeat' )
152- self .assertEqual (
153- gauge .descriptor .description ,
154- 'Heartbeat metric with custom dimensions'
155- )
156- self .assertEqual (gauge .descriptor .unit , 'count' )
157- self .assertEqual (gauge .descriptor ._type , 1 )
158- self .assertEqual (
159- gauge .descriptor .label_keys ,
160- list (metric .properties .keys ())
161- )
162- self .assertEqual (
163- gauge ._len_label_keys ,
164- len (metric .properties .keys ())
165- )
176+ def test_heartbeat_metric_init_vm (self ):
177+ with mock .patch ('requests.get' ) as get :
178+ get .return_value = MockResponse (
179+ 200 ,
180+ json .dumps (
181+ {
182+ 'vmId' : 5 ,
183+ 'subscriptionId' : 3 ,
184+ 'osType' : 'Linux'
185+ }
186+ )
187+ )
188+ metric = heartbeat_metrics .HeartbeatMetric ()
189+ self .assertTrue (metric .is_vm )
190+ self .assertEqual (metric .NAME , 'Heartbeat' )
191+ keys = list (metric .properties .keys ())
192+ values = list (metric .properties .values ())
193+ self .assertEqual (len (keys ), 5 )
194+ self .assertEqual (len (keys ), len (values ))
195+ self .assertEqual (keys [0 ].key , "sdk" )
196+ self .assertEqual (keys [1 ].key , "osType" )
197+ self .assertEqual (values [0 ].value , 'py{}:oc{}:ext{}' .format (
198+ platform .python_version (),
199+ opencensus_version ,
200+ ext_version ,
201+ ))
202+ self .assertEqual (values [1 ].value , platform .system ())
203+ self .assertEqual (keys [2 ].key , "azInst_vmId" )
204+ self .assertEqual (values [2 ].value , 5 )
205+ self .assertEqual (keys [3 ].key , "azInst_subscriptionId" )
206+ self .assertEqual (values [3 ].value , 3 )
207+ self .assertEqual (keys [4 ].key , "azInst_osType" )
208+ self .assertEqual (values [4 ].value , "Linux" )
209+
210+ def test_heartbeat_metric_not_vm (self ):
211+ with mock .patch (
212+ 'requests.get' ,
213+ throw (requests .exceptions .ConnectionError )
214+ ):
215+ metric = heartbeat_metrics .HeartbeatMetric ()
216+ self .assertFalse (metric .is_vm )
217+ self .assertEqual (metric .NAME , 'Heartbeat' )
218+ keys = list (metric .properties .keys ())
219+ self .assertEqual (len (keys ), 2 )
220+
221+ def test_heartbeat_metric_vm_error_response (self ):
222+ with mock .patch ('requests.get' ) as get :
223+ get .return_value = MockResponse (
224+ 200 ,
225+ json .dumps (
226+ {
227+ 'vmId' : 5 ,
228+ 'subscriptionId' : 3 ,
229+ 'osType' : 'Linux'
230+ }
231+ )
232+ )
233+ metric = heartbeat_metrics .HeartbeatMetric ()
234+ self .assertTrue (metric .is_vm )
235+ keys = list (metric .properties .keys ())
236+ self .assertEqual (len (keys ), 5 )
237+ with mock .patch (
238+ 'requests.get' ,
239+ throw (Exception )
240+ ):
241+ metric .vm_data .clear ()
242+ self .assertTrue (metric .is_vm )
243+ self .assertEqual (len (metric .vm_data ), 0 )
244+ self .assertTrue (metric .is_vm )
245+ keys = list (metric .properties .keys ())
246+ self .assertEqual (len (keys ), 5 )
0 commit comments