17
17
18
18
from google .api .label_pb2 import LabelDescriptor
19
19
from google .api .metric_pb2 import MetricDescriptor
20
+ from google .api .monitored_resource_pb2 import MonitoredResource
20
21
from google .cloud .monitoring_v3 .proto .metric_pb2 import TimeSeries
21
22
22
23
from opentelemetry .exporter .cloud_monitoring import (
27
28
)
28
29
from opentelemetry .sdk .metrics .export import MetricRecord
29
30
from opentelemetry .sdk .metrics .export .aggregate import SumAggregator
31
+ from opentelemetry .sdk .resources import Resource
30
32
31
33
32
34
class UnsupportedAggregator :
33
35
pass
34
36
35
37
38
+ class MockMeter :
39
+ def __init__ (self , resource = Resource .create_empty ()):
40
+ self .resource = resource
41
+
42
+
36
43
class MockMetric :
37
- def __init__ (self , name = "name" , description = "description" , value_type = int ):
44
+ def __init__ (
45
+ self ,
46
+ name = "name" ,
47
+ description = "description" ,
48
+ value_type = int ,
49
+ meter = None ,
50
+ ):
38
51
self .name = name
39
52
self .description = description
40
53
self .value_type = value_type
54
+ self .meter = meter or MockMeter ()
41
55
42
56
43
57
# pylint: disable=protected-access
@@ -205,24 +219,41 @@ def test_export(self):
205
219
}
206
220
)
207
221
222
+ resource = Resource (
223
+ labels = {
224
+ "cloud.account.id" : 123 ,
225
+ "host.id" : "host" ,
226
+ "cloud.zone" : "US" ,
227
+ "cloud.provider" : "gcp" ,
228
+ "extra_info" : "extra" ,
229
+ "gcp.resource_type" : "gce_instance" ,
230
+ "not_gcp_resource" : "value" ,
231
+ }
232
+ )
233
+
208
234
sum_agg_one = SumAggregator ()
209
235
sum_agg_one .checkpoint = 1
210
236
sum_agg_one .last_update_timestamp = (WRITE_INTERVAL + 1 ) * 1e9
211
237
exporter .export (
212
238
[
213
239
MetricRecord (
214
- MockMetric (),
240
+ MockMetric (meter = MockMeter ( resource = resource ) ),
215
241
(("label1" , "value1" ), ("label2" , 1 ),),
216
242
sum_agg_one ,
217
243
),
218
244
MetricRecord (
219
- MockMetric (),
245
+ MockMetric (meter = MockMeter ( resource = resource ) ),
220
246
(("label1" , "value2" ), ("label2" , 2 ),),
221
247
sum_agg_one ,
222
248
),
223
249
]
224
250
)
225
- series1 = TimeSeries ()
251
+ expected_resource = MonitoredResource (
252
+ type = "gce_instance" ,
253
+ labels = {"project_id" : "123" , "instance_id" : "host" , "zone" : "US" },
254
+ )
255
+
256
+ series1 = TimeSeries (resource = expected_resource )
226
257
series1 .metric .type = "custom.googleapis.com/OpenTelemetry/name"
227
258
series1 .metric .labels ["label1" ] = "value1"
228
259
series1 .metric .labels ["label2" ] = "1"
@@ -231,7 +262,7 @@ def test_export(self):
231
262
point .interval .end_time .seconds = WRITE_INTERVAL + 1
232
263
point .interval .end_time .nanos = 0
233
264
234
- series2 = TimeSeries ()
265
+ series2 = TimeSeries (resource = expected_resource )
235
266
series2 .metric .type = "custom.googleapis.com/OpenTelemetry/name"
236
267
series2 .metric .labels ["label1" ] = "value2"
237
268
series2 .metric .labels ["label2" ] = "2"
@@ -342,3 +373,64 @@ def test_unique_identifier(self):
342
373
first_call [0 ][1 ][0 ].metric .labels [UNIQUE_IDENTIFIER_KEY ],
343
374
second_call [0 ][1 ][0 ].metric .labels [UNIQUE_IDENTIFIER_KEY ],
344
375
)
376
+
377
+ def test_extract_resources (self ):
378
+ exporter = CloudMonitoringMetricsExporter (project_id = self .project_id )
379
+
380
+ self .assertIsNone (
381
+ exporter ._get_monitored_resource (Resource .create_empty ())
382
+ )
383
+ resource = Resource (
384
+ labels = {
385
+ "cloud.account.id" : 123 ,
386
+ "host.id" : "host" ,
387
+ "cloud.zone" : "US" ,
388
+ "cloud.provider" : "gcp" ,
389
+ "extra_info" : "extra" ,
390
+ "gcp.resource_type" : "gce_instance" ,
391
+ "not_gcp_resource" : "value" ,
392
+ }
393
+ )
394
+ expected_extract = MonitoredResource (
395
+ type = "gce_instance" ,
396
+ labels = {"project_id" : "123" , "instance_id" : "host" , "zone" : "US" },
397
+ )
398
+ self .assertEqual (
399
+ exporter ._get_monitored_resource (resource ), expected_extract
400
+ )
401
+
402
+ resource = Resource (
403
+ labels = {
404
+ "cloud.account.id" : "123" ,
405
+ "host.id" : "host" ,
406
+ "extra_info" : "extra" ,
407
+ "not_gcp_resource" : "value" ,
408
+ "gcp.resource_type" : "gce_instance" ,
409
+ "cloud.provider" : "gcp" ,
410
+ }
411
+ )
412
+ # Should throw when passed a malformed GCP resource dict
413
+ self .assertRaises (KeyError , exporter ._get_monitored_resource , resource )
414
+
415
+ resource = Resource (
416
+ labels = {
417
+ "cloud.account.id" : "123" ,
418
+ "host.id" : "host" ,
419
+ "extra_info" : "extra" ,
420
+ "not_gcp_resource" : "value" ,
421
+ "gcp.resource_type" : "unsupported_gcp_resource" ,
422
+ "cloud.provider" : "gcp" ,
423
+ }
424
+ )
425
+ self .assertIsNone (exporter ._get_monitored_resource (resource ))
426
+
427
+ resource = Resource (
428
+ labels = {
429
+ "cloud.account.id" : "123" ,
430
+ "host.id" : "host" ,
431
+ "extra_info" : "extra" ,
432
+ "not_gcp_resource" : "value" ,
433
+ "cloud.provider" : "aws" ,
434
+ }
435
+ )
436
+ self .assertIsNone (exporter ._get_monitored_resource (resource ))
0 commit comments