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