32
32
MetricsExportResult ,
33
33
aggregate ,
34
34
)
35
+ from opentelemetry .sdk .resources import Resource
35
36
36
37
37
38
# pylint: disable=no-member
38
39
class TestCollectorMetricsExporter (unittest .TestCase ):
39
40
@classmethod
40
41
def setUpClass (cls ):
41
42
# pylint: disable=protected-access
42
- metrics .set_meter_provider (MeterProvider ())
43
+ cls ._resource_labels = {
44
+ "key_with_str_value" : "some string" ,
45
+ "key_with_int_val" : 321 ,
46
+ "key_with_true" : True ,
47
+ }
48
+ metrics .set_meter_provider (
49
+ MeterProvider (resource = Resource (cls ._resource_labels ))
50
+ )
43
51
cls ._meter = metrics .get_meter (__name__ )
44
- cls ._labels = {"environment" : "staging" }
52
+ cls ._labels = {"environment" : "staging" , "number" : 321 }
45
53
cls ._key_labels = get_dict_as_key (cls ._labels )
46
54
47
55
def test_constructor (self ):
@@ -119,7 +127,7 @@ def test_export(self):
119
127
client = mock_client , host_name = host_name
120
128
)
121
129
test_metric = self ._meter .create_metric (
122
- "testname" , "testdesc" , "unit" , int , Counter ,
130
+ "testname" , "testdesc" , "unit" , int , Counter , self . _labels . keys (),
123
131
)
124
132
record = MetricRecord (
125
133
test_metric , self ._key_labels , aggregate .SumAggregator (),
@@ -142,13 +150,16 @@ def test_export(self):
142
150
143
151
def test_translate_to_collector (self ):
144
152
test_metric = self ._meter .create_metric (
145
- "testname" , "testdesc" , "unit" , int , Counter ,
153
+ "testname" , "testdesc" , "unit" , int , Counter , self . _labels . keys ()
146
154
)
147
155
aggregator = aggregate .SumAggregator ()
148
156
aggregator .update (123 )
149
157
aggregator .take_checkpoint ()
150
158
record = MetricRecord (test_metric , self ._key_labels , aggregator ,)
151
- output_metrics = metrics_exporter .translate_to_collector ([record ])
159
+ start_timestamp = Timestamp ()
160
+ output_metrics = metrics_exporter .translate_to_collector (
161
+ [record ], start_timestamp ,
162
+ )
152
163
self .assertEqual (len (output_metrics ), 1 )
153
164
self .assertIsInstance (output_metrics [0 ], metrics_pb2 .Metric )
154
165
self .assertEqual (output_metrics [0 ].metric_descriptor .name , "testname" )
@@ -161,14 +172,44 @@ def test_translate_to_collector(self):
161
172
metrics_pb2 .MetricDescriptor .CUMULATIVE_INT64 ,
162
173
)
163
174
self .assertEqual (
164
- len (output_metrics [0 ].metric_descriptor .label_keys ), 1
175
+ len (output_metrics [0 ].metric_descriptor .label_keys ), 2
165
176
)
166
177
self .assertEqual (
167
178
output_metrics [0 ].metric_descriptor .label_keys [0 ].key ,
168
179
"environment" ,
169
180
)
181
+ self .assertEqual (
182
+ output_metrics [0 ].metric_descriptor .label_keys [1 ].key , "number" ,
183
+ )
184
+
185
+ self .assertIsNotNone (output_metrics [0 ].resource )
186
+ self .assertEqual (
187
+ output_metrics [0 ].resource .type , "" ,
188
+ )
189
+ self .assertEqual (
190
+ output_metrics [0 ].resource .labels ["key_with_str_value" ],
191
+ self ._resource_labels ["key_with_str_value" ],
192
+ )
193
+ self .assertIsInstance (
194
+ output_metrics [0 ].resource .labels ["key_with_int_val" ], str ,
195
+ )
196
+ self .assertEqual (
197
+ output_metrics [0 ].resource .labels ["key_with_int_val" ],
198
+ str (self ._resource_labels ["key_with_int_val" ]),
199
+ )
200
+ self .assertIsInstance (
201
+ output_metrics [0 ].resource .labels ["key_with_true" ], str ,
202
+ )
203
+ self .assertEqual (
204
+ output_metrics [0 ].resource .labels ["key_with_true" ],
205
+ str (self ._resource_labels ["key_with_true" ]),
206
+ )
207
+
170
208
self .assertEqual (len (output_metrics [0 ].timeseries ), 1 )
171
- self .assertEqual (len (output_metrics [0 ].timeseries [0 ].label_values ), 1 )
209
+ self .assertEqual (len (output_metrics [0 ].timeseries [0 ].label_values ), 2 )
210
+ self .assertEqual (
211
+ output_metrics [0 ].timeseries [0 ].start_timestamp , start_timestamp
212
+ )
172
213
self .assertEqual (
173
214
output_metrics [0 ].timeseries [0 ].label_values [0 ].has_value , True
174
215
)
@@ -187,3 +228,59 @@ def test_translate_to_collector(self):
187
228
self .assertEqual (
188
229
output_metrics [0 ].timeseries [0 ].points [0 ].int64_value , 123
189
230
)
231
+
232
+ def test_infer_ot_resource_type (self ):
233
+ # empty resource
234
+ self .assertEqual (metrics_exporter .infer_oc_resource_type ({}), "" )
235
+
236
+ # container
237
+ self .assertEqual (
238
+ metrics_exporter .infer_oc_resource_type (
239
+ {
240
+ "k8s.cluster.name" : "cluster1" ,
241
+ "k8s.pod.name" : "pod1" ,
242
+ "k8s.namespace.name" : "namespace1" ,
243
+ "container.name" : "container-name1" ,
244
+ "cloud.account.id" : "proj1" ,
245
+ "cloud.zone" : "zone1" ,
246
+ }
247
+ ),
248
+ "container" ,
249
+ )
250
+
251
+ # k8s pod
252
+ self .assertEqual (
253
+ metrics_exporter .infer_oc_resource_type (
254
+ {
255
+ "k8s.cluster.name" : "cluster1" ,
256
+ "k8s.pod.name" : "pod1" ,
257
+ "k8s.namespace.name" : "namespace1" ,
258
+ "cloud.zone" : "zone1" ,
259
+ }
260
+ ),
261
+ "k8s" ,
262
+ )
263
+
264
+ # host
265
+ self .assertEqual (
266
+ metrics_exporter .infer_oc_resource_type (
267
+ {
268
+ "k8s.cluster.name" : "cluster1" ,
269
+ "cloud.zone" : "zone1" ,
270
+ "host.name" : "node1" ,
271
+ }
272
+ ),
273
+ "host" ,
274
+ )
275
+
276
+ # cloud
277
+ self .assertEqual (
278
+ metrics_exporter .infer_oc_resource_type (
279
+ {
280
+ "cloud.provider" : "gcp" ,
281
+ "host.id" : "inst1" ,
282
+ "cloud.zone" : "zone1" ,
283
+ }
284
+ ),
285
+ "cloud" ,
286
+ )
0 commit comments