Merge ~cgrabowski/maas:dns_performance into maas:master

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: 29d2a560306e1585b6f15fbbe2dad06a0a05d2fd
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:dns_performance
Merge into: maas:master
Diff against target: 217 lines (+135/-0)
6 files modified
src/maasperf/tests/maasserver/dns/__init__.py (+0/-0)
src/maasperf/tests/maasserver/dns/conftest.py (+29/-0)
src/maasperf/tests/maasserver/dns/test_config.py (+52/-0)
src/maasserver/dns/config.py (+7/-0)
src/provisioningserver/dns/zoneconfig.py (+21/-0)
src/provisioningserver/prometheus/metrics.py (+26/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Alberto Donato (community) Approve
Review via email: mp+435548@code.launchpad.net

Commit message

add DNS performance metrics

add DNS full reload perf test

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b dns_performance lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/1747/consoleText
COMMIT: ce24390ca5d5beae5e75b41bee720ff21f128ac0

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b dns_performance lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/1757/consoleText
COMMIT: 667eaadd29b3238d269cd031a402403654c29ae6

review: Needs Fixing
Revision history for this message
Alberto Donato (ack) wrote :

+1

minor comments inline

review: Approve
Revision history for this message
Christian Grabowski (cgrabowski) :
~cgrabowski/maas:dns_performance updated
036eb11... by Christian Grabowski

use monkeypatch to set env

Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b dns_performance lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/1780/consoleText
COMMIT: e89b0ea208c551bcb61e65e3a85d832e2692f3c5

review: Needs Fixing
~cgrabowski/maas:dns_performance updated
29d2a56... by Christian Grabowski

add missing metric update actions

Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b dns_performance lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/1782/consoleText
COMMIT: 29d2a560306e1585b6f15fbbe2dad06a0a05d2fd

review: Needs Fixing
Revision history for this message
Christian Grabowski (cgrabowski) wrote :

jenkins: !test

Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b dns_performance lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/1785/consoleText
COMMIT: 29d2a560306e1585b6f15fbbe2dad06a0a05d2fd

review: Needs Fixing
Revision history for this message
Christian Grabowski (cgrabowski) wrote :

jenkins: !test

Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b dns_performance lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 29d2a560306e1585b6f15fbbe2dad06a0a05d2fd

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasperf/tests/maasserver/dns/__init__.py b/src/maasperf/tests/maasserver/dns/__init__.py
2new file mode 100644
3index 0000000..e69de29
4--- /dev/null
5+++ b/src/maasperf/tests/maasserver/dns/__init__.py
6diff --git a/src/maasperf/tests/maasserver/dns/conftest.py b/src/maasperf/tests/maasserver/dns/conftest.py
7new file mode 100644
8index 0000000..796bbd5
9--- /dev/null
10+++ b/src/maasperf/tests/maasserver/dns/conftest.py
11@@ -0,0 +1,29 @@
12+# Copyright 2023 Canonical Ltd. This software is licensed under the
13+# GNU Affero General Public License version 3 (see the file LICENSE).
14+
15+from tempfile import mkdtemp
16+
17+import pytest
18+
19+from provisioningserver.testing.bindfixture import BINDServer
20+
21+
22+@pytest.fixture()
23+def dns_config_path(monkeypatch):
24+ path = mkdtemp(prefix="maas-dns-config")
25+ monkeypatch.setenv("MAAS_BIND_CONFIG_DIR", path)
26+ return path
27+
28+
29+@pytest.fixture()
30+def zone_file_config_path(monkeypatch):
31+ path = mkdtemp(prefix="maas-zonefile-config")
32+ monkeypatch.setenv("MAAS_ZONE_FILE_CONFIG_DIR", path)
33+ return path
34+
35+
36+@pytest.fixture()
37+def bind_server():
38+ bind = BINDServer()
39+ bind.setUp()
40+ return bind
41diff --git a/src/maasperf/tests/maasserver/dns/test_config.py b/src/maasperf/tests/maasserver/dns/test_config.py
42new file mode 100644
43index 0000000..7609cae
44--- /dev/null
45+++ b/src/maasperf/tests/maasserver/dns/test_config.py
46@@ -0,0 +1,52 @@
47+# Copyright 2023 Canonical Ltd. This software is licensed under the
48+# GNU Affero General Public License version 3 (see the file LICENSE).
49+
50+import pytest
51+
52+from maasserver.dns.config import (
53+ dns_update_all_zones,
54+ process_dns_update_notify,
55+)
56+from provisioningserver.dns.config import DynamicDNSUpdate
57+
58+
59+@pytest.mark.usefixtures("maasdb")
60+def test_perf_full_dns_reload(
61+ perf, dns_config_path, zone_file_config_path, bind_server, factory
62+):
63+ domains = [factory.make_Domain() for _ in range(5)]
64+ subnet = factory.make_Subnet(cidr="10.0.0.0/24")
65+ ips = [factory.make_StaticIPAddress(subnet=subnet) for _ in range(100)]
66+ [
67+ factory.make_DNSResource(domain=domains[i % 5], ip_addresses=[ips[i]])
68+ for i in range(100)
69+ ]
70+
71+ with perf.record("test_perf_full_dns_reload.zonefile_write"):
72+ dns_update_all_zones()
73+
74+ # zonefile already written, sends dynamic update instead
75+ with perf.record("test_perf_full_dns_reload.dynamic_update"):
76+ dns_update_all_zones()
77+
78+
79+@pytest.mark.usefixtures("maasdb")
80+def test_perf_generate_dns_updates(perf, factory):
81+ domain = factory.make_Domain()
82+ subnet = factory.make_Subnet(cidr="10.0.0.0/24")
83+ ips = [factory.make_StaticIPAddress(subnet=subnet) for _ in range(100)]
84+ records = [
85+ factory.make_DNSResource(domain=domain, ip_addresses=[ips[i]])
86+ for i in range(100)
87+ ]
88+
89+ with perf.record("test_perf_generate_dns_updates.forward"):
90+ for record in records:
91+ notify = f"INSERT {domain.name} {record.name} A 30 {record.ip_addresses.first()}"
92+ process_dns_update_notify(notify)
93+
94+ with perf.record("test_perf_generate_dns_updates.reverse"):
95+ for record in records:
96+ notify = f"INSERT {domain.name} {record.name} A 30 {record.ip_addresses.first()}"
97+ fwd, _ = process_dns_update_notify(notify)
98+ DynamicDNSUpdate.as_reverse_record_update(fwd[0], subnet.cidr)
99diff --git a/src/maasserver/dns/config.py b/src/maasserver/dns/config.py
100index a0390c0..571caf1 100644
101--- a/src/maasserver/dns/config.py
102+++ b/src/maasserver/dns/config.py
103@@ -33,6 +33,7 @@ from provisioningserver.dns.actions import (
104 )
105 from provisioningserver.dns.config import DynamicDNSUpdate
106 from provisioningserver.logger import get_maas_logger
107+from provisioningserver.prometheus.metrics import PROMETHEUS_METRICS
108 from provisioningserver.utils.shell import ExternalProcessError
109
110 maaslog = get_maas_logger("dns")
111@@ -66,6 +67,12 @@ def forward_domains_to_forwarded_zones(forward_domains):
112 ]
113
114
115+@PROMETHEUS_METRICS.record_call_latency(
116+ "maas_dns_update_latency",
117+ get_labels=lambda *args, **kwargs: {
118+ "update_type": "reload" if kwargs.get("requires_reload") else "dynamic"
119+ },
120+)
121 def dns_update_all_zones(
122 reload_retry=False,
123 reload_timeout=2,
124diff --git a/src/provisioningserver/dns/zoneconfig.py b/src/provisioningserver/dns/zoneconfig.py
125index 8dec9b6..dec6029 100644
126--- a/src/provisioningserver/dns/zoneconfig.py
127+++ b/src/provisioningserver/dns/zoneconfig.py
128@@ -18,6 +18,7 @@ from provisioningserver.dns.config import (
129 render_dns_template,
130 report_missing_config_dir,
131 )
132+from provisioningserver.prometheus.metrics import PROMETHEUS_METRICS
133 from provisioningserver.utils.fs import incremental_write
134 from provisioningserver.utils.network import (
135 intersect_iprange,
136@@ -330,6 +331,11 @@ class DNSForwardZoneConfig(DomainConfigBase):
137 )
138 if not self.force_config_write and self.zone_file_exists(zi):
139 self.dynamic_update(zi)
140+ PROMETHEUS_METRICS.update(
141+ "maas_dns_dynamic_update_count",
142+ "inc",
143+ labels={"zone": self.domain},
144+ )
145 else:
146 Path(f"{zi.target_path}.jnl").unlink(missing_ok=True)
147 self.requires_reload = True
148@@ -351,6 +357,11 @@ class DNSForwardZoneConfig(DomainConfigBase):
149 "generate_directives": {"A": generate_directives},
150 },
151 )
152+ PROMETHEUS_METRICS.update(
153+ "maas_dns_full_zonefile_write_count",
154+ "inc",
155+ labels={"zone": self.domain},
156+ )
157
158
159 class DNSReverseZoneConfig(DomainConfigBase):
160@@ -620,6 +631,11 @@ class DNSReverseZoneConfig(DomainConfigBase):
161 )
162 if not self.force_config_write and self.zone_file_exists(zi):
163 self.dynamic_update(zi)
164+ PROMETHEUS_METRICS.update(
165+ "maas_dns_dynamic_update_count",
166+ "inc",
167+ labels={"zone": self.domain},
168+ )
169 else:
170 Path(f"{zi.target_path}.jnl").unlink(missing_ok=True)
171 self.requires_reload = True
172@@ -643,3 +659,8 @@ class DNSReverseZoneConfig(DomainConfigBase):
173 },
174 },
175 )
176+ PROMETHEUS_METRICS.update(
177+ "maas_dns_full_zonefile_write_count",
178+ "inc",
179+ labels={"zone": self.domain},
180+ )
181diff --git a/src/provisioningserver/prometheus/metrics.py b/src/provisioningserver/prometheus/metrics.py
182index bc2e6bb..34fe068 100644
183--- a/src/provisioningserver/prometheus/metrics.py
184+++ b/src/provisioningserver/prometheus/metrics.py
185@@ -117,6 +117,32 @@ METRICS_DEFINITIONS = [
186 of connections
187 """,
188 ),
189+ MetricDefinition(
190+ "Counter",
191+ "maas_dns_full_zonefile_write_count",
192+ """
193+ counts the number of times MAAS writes
194+ to a zonefile rather than push a dynamic
195+ update per DNS zone
196+ """,
197+ ["zone"],
198+ ),
199+ MetricDefinition(
200+ "Counter",
201+ "maas_dns_dynamic_update_count",
202+ """
203+ counts the number of times MAAS pushes
204+ a dynamic update per DNS zone rather than
205+ writing a zonefile
206+ """,
207+ ["zone"],
208+ ),
209+ MetricDefinition(
210+ "Histogram",
211+ "maas_dns_update_latency",
212+ "the time it takes MAAS to update BIND",
213+ ["update_type"],
214+ ),
215 # Common metrics
216 *node_metrics_definitions(),
217 ]

Subscribers

People subscribed via source and target branches