]> git.ipfire.org Git - thirdparty/pdns.git/blame - regression-tests.ixfrdist/test_Stats.py
grammar: oxford comma
[thirdparty/pdns.git] / regression-tests.ixfrdist / test_Stats.py
CommitLineData
c714b508
PL
1from ixfrdisttests import IXFRDistTest
2from xfrserver.xfrserver import AXFRServer
3import time
4import requests
5
6zones = {
7 1: """
8$ORIGIN example.
9@ 86400 SOA foo bar 1 2 3 4 5
10@ 4242 NS ns1.example.
11@ 4242 NS ns2.example.
12ns1.example. 4242 A 192.0.2.1
13ns2.example. 4242 A 192.0.2.2
14"""}
15
16xfrServerPort = 4244
17xfrServer = AXFRServer(xfrServerPort, zones)
18
19class IXFRDistStatsTest(IXFRDistTest):
20 """
21 This test makes sure we have statistics in ixfrdist
22 """
23
24 webserver_address = '127.0.0.1:8080'
25
26 _config_params = ['_ixfrDistPort', 'webserver_address']
27
28 _config_template = """
29listen:
30 - '127.0.0.1:%d'
31acl:
32 - '127.0.0.0/8'
33axfr-timeout: 20
34keep: 20
35tcp-in-threads: 1
36work-dir: 'ixfrdist.dir'
37failed-soa-retry: 3
38webserver-address: %s
39"""
40
41 _config_domains = {'example': '127.0.0.1:' + str(xfrServerPort)}
42
43 metric_prog_stats = ["ixfrdist_uptime_seconds", "ixfrdist_domains"]
44 metric_domain_stats = ["ixfrdist_soa_serial", "ixfrdist_soa_checks",
45 "ixfrdist_soa_checks_failed",
46 "ixfrdist_soa_inqueries",
47 "ixfrdist_axfr_inqueries", "ixfrdist_axfr_failures",
48 "ixfrdist_ixfr_inqueries", "ixfrdist_ixfr_failures"]
49
50 @classmethod
51 def setUpClass(cls):
52 cls.startIXFRDist()
53 cls.setUpSockets()
54 time.sleep(3)
55
56 @classmethod
57 def tearDownClass(cls):
58 cls.tearDownIXFRDist()
59
60 def test_program_stats_exist(self):
61 res = requests.get('http://{}/metrics'.format(self.webserver_address))
62 self.assertEqual(res.status_code, 200)
63 for line in res.text.splitlines():
64 if line[0] == "#":
65 continue
66 if "{" in line:
67 continue
68 self.assertIn(line.split(" ")[0],
69 self.metric_prog_stats + self.metric_domain_stats)
70
71 def test_registered(self):
72 res = requests.get('http://{}/metrics'.format(self.webserver_address))
73 self.assertEqual(res.status_code, 200)
74 for line in res.text.splitlines():
75 if line.startswith('ixfrdist_domains'):
76 self.assertEqual(line, 'ixfrdist_domains 1')
77 continue
78 if line[0] == "#":
79 continue
80 if "{" not in line:
81 continue
82 self.assertIn('{domain=example}', line)
83 self.assertIn(line.split("{")[0], self.metric_domain_stats)
84
85 def test_metrics_have_help(self):
86 res = requests.get('http://{}/metrics'.format(self.webserver_address))
87 self.assertEqual(res.status_code, 200)
88 for s in self.metric_prog_stats + self.metric_domain_stats:
89 self.assertIn('# HELP {}'.format(s), res.text)
90
91 def test_metrics_have_type(self):
92 res = requests.get('http://{}/metrics'.format(self.webserver_address))
93 self.assertEqual(res.status_code, 200)
94 for s in self.metric_prog_stats + self.metric_domain_stats:
95 self.assertIn('# TYPE {}'.format(s), res.text)
96
97 def test_missing_metrics(self):
98 all_metrics = set()
99
100 res = requests.get('http://{}/metrics'.format(self.webserver_address))
101 self.assertEqual(res.status_code, 200)
102
103 for line in res.text.splitlines():
104 if line[0] == "#":
105 all_metrics.add(line.split(" ")[2])
106 continue
107 if "{" in line:
108 all_metrics.add(line.split("{")[0])
109 continue
110 all_metrics.add(line.split(" ")[0])
111
112 should_have_metrics = set(self.metric_prog_stats +
113 self.metric_domain_stats)
114
115 unknown_metrics = all_metrics - should_have_metrics
116
117 self.assertSetEqual(unknown_metrics, set())