1
+ import asyncio
1
2
from concurrent .futures import ThreadPoolExecutor
2
3
import time
3
4
import unittest
4
5
5
- import pytest
6
+ import aiounittest
6
7
7
8
from prometheus_client .core import (
8
9
CollectorRegistry , Counter , CounterMetricFamily , Enum , Gauge ,
@@ -28,7 +29,7 @@ def assert_not_observable(fn, *args, **kwargs):
28
29
assert False , "Did not raise a 'missing label values' exception"
29
30
30
31
31
- class TestCounter (unittest . TestCase ):
32
+ class TestCounter (aiounittest . AsyncTestCase ):
32
33
def setUp (self ):
33
34
self .registry = CollectorRegistry ()
34
35
self .counter = Counter ('c_total' , 'help' , registry = self .registry )
@@ -56,30 +57,42 @@ def f(r):
56
57
57
58
self .assertEqual ((["r" ], None , None , None ), getargspec (f ))
58
59
59
- try :
60
+ with self . assertRaises ( TypeError ) :
60
61
f (False )
61
- except TypeError :
62
- pass
63
62
self .assertEqual (0 , self .registry .get_sample_value ('c_total' ))
64
63
65
- try :
64
+ with self . assertRaises ( ValueError ) :
66
65
f (True )
67
- except ValueError :
68
- pass
66
+ self .assertEqual (1 , self .registry .get_sample_value ('c_total' ))
67
+
68
+ async def test_async_function_decorator (self ):
69
+ @self .counter .count_exceptions (ValueError )
70
+ async def f (r ):
71
+ if r :
72
+ raise ValueError
73
+ else :
74
+ raise TypeError
75
+
76
+ self .assertEqual ((["r" ], None , None , None ), getargspec (f ))
77
+
78
+ with self .assertRaises (TypeError ):
79
+ await f (False )
80
+
81
+ self .assertEqual (0 , self .registry .get_sample_value ('c_total' ))
82
+
83
+ with self .assertRaises (ValueError ):
84
+ await f (True )
85
+
69
86
self .assertEqual (1 , self .registry .get_sample_value ('c_total' ))
70
87
71
88
def test_block_decorator (self ):
72
89
with self .counter .count_exceptions ():
73
90
pass
74
91
self .assertEqual (0 , self .registry .get_sample_value ('c_total' ))
75
92
76
- raised = False
77
- try :
93
+ with self .assertRaises (ValueError ):
78
94
with self .counter .count_exceptions ():
79
95
raise ValueError
80
- except :
81
- raised = True
82
- self .assertTrue (raised )
83
96
self .assertEqual (1 , self .registry .get_sample_value ('c_total' ))
84
97
85
98
def test_count_exceptions_not_observable (self ):
@@ -115,7 +128,7 @@ def test_exemplar_too_long(self):
115
128
})
116
129
117
130
118
- class TestGauge (unittest . TestCase ):
131
+ class TestGauge (aiounittest . AsyncTestCase ):
119
132
def setUp (self ):
120
133
self .registry = CollectorRegistry ()
121
134
self .gauge = Gauge ('g' , 'help' , registry = self .registry )
@@ -160,6 +173,18 @@ def f():
160
173
f ()
161
174
self .assertEqual (0 , self .registry .get_sample_value ('g' ))
162
175
176
+ async def test_inprogress_async_function_decorator (self ):
177
+ self .assertEqual (0 , self .registry .get_sample_value ('g' ))
178
+
179
+ @self .gauge .track_inprogress ()
180
+ async def f ():
181
+ self .assertEqual (1 , self .registry .get_sample_value ('g' ))
182
+
183
+ self .assertEqual (([], None , None , None ), getargspec (f ))
184
+
185
+ await f ()
186
+ self .assertEqual (0 , self .registry .get_sample_value ('g' ))
187
+
163
188
def test_inprogress_block_decorator (self ):
164
189
self .assertEqual (0 , self .registry .get_sample_value ('g' ))
165
190
with self .gauge .track_inprogress ():
@@ -185,12 +210,24 @@ def test_time_function_decorator(self):
185
210
186
211
@self .gauge .time ()
187
212
def f ():
188
- time .sleep (.001 )
213
+ time .sleep (.05 )
189
214
190
215
self .assertEqual (([], None , None , None ), getargspec (f ))
191
216
192
217
f ()
193
- self .assertNotEqual (0 , self .registry .get_sample_value ('g' ))
218
+ self .assertTrue (0.05 <= self .registry .get_sample_value ('g' ) <= 0.1 )
219
+
220
+ async def test_time_async_function_decorator (self ):
221
+ self .assertEqual (0 , self .registry .get_sample_value ('g' ))
222
+
223
+ @self .gauge .time ()
224
+ async def f ():
225
+ await asyncio .sleep (.05 )
226
+
227
+ self .assertEqual (([], None , None , None ), getargspec (f ))
228
+
229
+ await f ()
230
+ self .assertTrue (0.05 <= self .registry .get_sample_value ('g' ) <= 0.1 )
194
231
195
232
def test_function_decorator_multithread (self ):
196
233
self .assertEqual (0 , self .registry .get_sample_value ('g' ))
@@ -239,7 +276,7 @@ def manager():
239
276
assert_not_observable (manager )
240
277
241
278
242
- class TestSummary (unittest . TestCase ):
279
+ class TestSummary (aiounittest . AsyncTestCase ):
243
280
def setUp (self ):
244
281
self .registry = CollectorRegistry ()
245
282
self .summary = Summary ('s' , 'help' , registry = self .registry )
@@ -264,12 +301,26 @@ def test_function_decorator(self):
264
301
265
302
@self .summary .time ()
266
303
def f ():
267
- pass
304
+ time . sleep ( .05 )
268
305
269
306
self .assertEqual (([], None , None , None ), getargspec (f ))
270
307
271
308
f ()
272
309
self .assertEqual (1 , self .registry .get_sample_value ('s_count' ))
310
+ self .assertTrue (.05 < self .registry .get_sample_value ('s_sum' ) < 0.1 )
311
+
312
+ async def test_async_function_decorator (self ):
313
+ self .assertEqual (0 , self .registry .get_sample_value ('s_count' ))
314
+
315
+ @self .summary .time ()
316
+ async def f ():
317
+ await asyncio .sleep (.05 )
318
+
319
+ self .assertEqual (([], None , None , None ), getargspec (f ))
320
+
321
+ await f ()
322
+ self .assertEqual (1 , self .registry .get_sample_value ('s_count' ))
323
+ self .assertTrue (.05 < self .registry .get_sample_value ('s_sum' ) < 0.1 )
273
324
274
325
def test_function_decorator_multithread (self ):
275
326
self .assertEqual (0 , self .registry .get_sample_value ('s_count' ))
@@ -343,7 +394,7 @@ def manager():
343
394
assert_not_observable (manager )
344
395
345
396
346
- class TestHistogram (unittest . TestCase ):
397
+ class TestHistogram (aiounittest . AsyncTestCase ):
347
398
def setUp (self ):
348
399
self .registry = CollectorRegistry ()
349
400
self .histogram = Histogram ('h' , 'help' , registry = self .registry )
@@ -417,13 +468,29 @@ def test_function_decorator(self):
417
468
418
469
@self .histogram .time ()
419
470
def f ():
420
- pass
471
+ time . sleep ( .05 )
421
472
422
473
self .assertEqual (([], None , None , None ), getargspec (f ))
423
474
424
475
f ()
425
476
self .assertEqual (1 , self .registry .get_sample_value ('h_count' ))
426
477
self .assertEqual (1 , self .registry .get_sample_value ('h_bucket' , {'le' : '+Inf' }))
478
+ self .assertTrue (.05 < self .registry .get_sample_value ('h_sum' ) < 0.1 )
479
+
480
+ async def test_async_function_decorator (self ):
481
+ self .assertEqual (0 , self .registry .get_sample_value ('h_count' ))
482
+ self .assertEqual (0 , self .registry .get_sample_value ('h_bucket' , {'le' : '+Inf' }))
483
+
484
+ @self .histogram .time ()
485
+ async def f ():
486
+ await asyncio .sleep (.05 )
487
+
488
+ self .assertEqual (([], None , None , None ), getargspec (f ))
489
+
490
+ await f ()
491
+ self .assertEqual (1 , self .registry .get_sample_value ('h_count' ))
492
+ self .assertEqual (1 , self .registry .get_sample_value ('h_bucket' , {'le' : '+Inf' }))
493
+ self .assertTrue (.05 < self .registry .get_sample_value ('h_sum' ) < 0.1 )
427
494
428
495
def test_function_decorator_multithread (self ):
429
496
self .assertEqual (0 , self .registry .get_sample_value ('h_count' ))
@@ -527,7 +594,7 @@ def test_labels(self):
527
594
self .assertRaises (ValueError , self .labels .state , 'a' )
528
595
529
596
def test_overlapping_labels (self ):
530
- with pytest . raises (ValueError ):
597
+ with self . assertRaises (ValueError ):
531
598
Enum ('e' , 'help' , registry = None , labelnames = ['e' ])
532
599
533
600
@@ -568,7 +635,7 @@ def test_incorrect_label_count_raises(self):
568
635
self .assertRaises (ValueError , self .counter .remove , 'a' , 'b' )
569
636
570
637
def test_labels_on_labels (self ):
571
- with pytest . raises (ValueError ):
638
+ with self . assertRaises (ValueError ):
572
639
self .counter .labels ('a' ).labels ('b' )
573
640
574
641
def test_labels_coerced_to_string (self ):
0 commit comments