@@ -630,6 +630,36 @@ def test_labels_coerced_to_string(self):
630630 self .counter .remove (None )
631631 self .assertEqual (None , self .registry .get_sample_value ('c_total' , {'l' : 'None' }))
632632
633+ def test_remove_matching (self ):
634+ from prometheus_client import Counter
635+
636+ c = Counter ('c2' , 'help' , ['tenant' , 'endpoint' ], registry = self .registry )
637+ c .labels ('acme' , '/' ).inc ()
638+ c .labels ('acme' , '/checkout' ).inc ()
639+ c .labels ('globex' , '/' ).inc ()
640+
641+
642+ deleted = c .remove_matching ({'tenant' : 'acme' })
643+ self .assertEqual (2 , deleted )
644+
645+ self .assertIsNone (self .registry .get_sample_value ('c2_total' , {'tenant' : 'acme' , 'endpoint' : '/' }))
646+ self .assertIsNone (self .registry .get_sample_value ('c2_total' , {'tenant' : 'acme' , 'endpoint' : '/checkout' }))
647+ self .assertEqual (1 , self .registry .get_sample_value ('c2_total' , {'tenant' : 'globex' , 'endpoint' : '/' }))
648+
649+ def test_remove_matching_invalid_label_name (self ):
650+ from prometheus_client import Counter
651+ c = Counter ('c3' , 'help' , ['tenant' , 'endpoint' ], registry = self .registry )
652+ c .labels ('acme' , '/' ).inc ()
653+ with self .assertRaises (ValueError ):
654+ c .remove_matching ({'badkey' : 'x' })
655+
656+ def test_remove_matching_empty_is_noop (self ):
657+ from prometheus_client import Counter
658+ c = Counter ('c4' , 'help' , ['tenant' , 'endpoint' ], registry = self .registry )
659+ c .labels ('acme' , '/' ).inc ()
660+ self .assertEqual (0 , c .remove_matching ({}))
661+ self .assertEqual (1 , self .registry .get_sample_value ('c4_total' , {'tenant' : 'acme' , 'endpoint' : '/' }))
662+
633663 def test_non_string_labels_raises (self ):
634664 class Test :
635665 __str__ = None
0 commit comments