diff --git a/test_all.py b/test_all.py index ef4e26a26c0cd0605a4489870b325f9f7d77a3c9..5cc31218e8e3cb8018fba13ced03610f45d02348 100644 --- a/test_all.py +++ b/test_all.py @@ -8,6 +8,7 @@ from time import sleep import requests import signal import re +from prometheus_client.registry import REGISTRY as pc class TestVC(TestCase): @@ -20,7 +21,6 @@ class TestVC(TestCase): self.assertEqual(c, '.') self.assertEqual(r, 3) - def test_singular(self): f = vcheck.tfoot(1, 0, 0) r = re.compile('>1 program<') @@ -40,12 +40,15 @@ class TestVC(TestCase): self.assertNotEqual(err, '') def test_run(self): - self.server = threading.Thread(target = vcheck.run, args = [8080, './testconf', 30]) + self.server = threading.Thread(target = vcheck.run, args = [8080, './testconf', 2]) self.server.start() - sleep(3) + sleep(2) + self.assertNotEqual(requests.get('http://localhost:8080/metrics'), '') + self.assertNotEqual(requests.get('http://localhost:8080'), '') self.assertTrue(self.server.is_alive()) + sleep(3) vcheck.shutdown(2, None) - sleep(2) + sleep(1) self.assertFalse(self.server.is_alive()) self.server.join() @@ -53,12 +56,3 @@ class TestVC(TestCase): c = { 'name': 'something', 'a': '1', 'b': '2' } self.assertIsNone(vcheck.missing(c, 'a', 'b')) self.assertIsNotNone(vcheck.missing(c, 'c')) - - def test_serve(self): - self.server = threading.Thread(target = vcheck.run, args = [8080, './testconf', 3]) - self.server.start() - sleep(1) - self.assertNotEqual(requests.get('http://localhost:8080/metrics'), '') - self.assertNotEqual(requests.get('http://localhost:8080'), '') - vcheck.shutdown(2, None) - self.server.join() diff --git a/vcheck.py b/vcheck.py index a1aa328d91831c0086ac9ce9e20fa1210e30e88d..ef79aa53d11425db49a4c908db5300ec60d1234b 100755 --- a/vcheck.py +++ b/vcheck.py @@ -129,6 +129,7 @@ html_end = """</table> global content global running + def td(name, running, latest, status): return f""" <tr class="{status}"> @@ -151,6 +152,16 @@ def tfoot(total, ood, err): </tr></tfoot>""" +def remove_by_label(g, p): + for sample in g.collect()[0].samples: + match = True + for (v, k) in p.items(): + if sample.labels[v] != k: + match = False + if match: + g.remove(*sample.labels.values()) + + def latest(versions, pattern): p = re.compile(pattern) v = [ v for v in versions if p.search(v) ] @@ -267,11 +278,13 @@ def check(confd, v): if not current: res += td(c['name'], c['version'], f'UNKNOWN: {error}', 'unknown') + remove_by_label(v, {'name': c['name']}) v.labels(name=c['name'], running=c['version'], latest=current).set(2) err += 1 else: uptodate = not c['version'] == current res += td(c['name'], c['version'], current, 'uptodate' if uptodate else 'outofdate') + remove_by_label(v, {'name': c['name']}) v.labels(name=c['name'], running=c['version'], latest=current).set(uptodate) ood += not uptodate