]> git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.ixfrdist/test_Stats.py
Merge pull request #7148 from Habbie/sdig-class-in
[thirdparty/pdns.git] / regression-tests.ixfrdist / test_Stats.py
1 from ixfrdisttests import IXFRDistTest
2 from xfrserver.xfrserver import AXFRServer
3 import time
4 import requests
5
6 zones = {
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.
12 ns1.example. 4242 A 192.0.2.1
13 ns2.example. 4242 A 192.0.2.2
14 """}
15
16 xfrServerPort = 4244
17 xfrServer = AXFRServer(xfrServerPort, zones)
18
19 class 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 = """
29 listen:
30 - '127.0.0.1:%d'
31 acl:
32 - '127.0.0.0/8'
33 axfr-timeout: 20
34 keep: 20
35 tcp-in-threads: 1
36 work-dir: 'ixfrdist.dir'
37 failed-soa-retry: 3
38 webserver-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())