From: Remi Gacogne Date: Mon, 19 Dec 2016 09:50:54 +0000 (+0100) Subject: dnsdist: Send a latency of 0 over carbon, null over API for down servers X-Git-Tag: rec-4.1.0-alpha1~321^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3692780035181cac9c40da4bffce8db7bbcfa44b;p=thirdparty%2Fpdns.git dnsdist: Send a latency of 0 over carbon, null over API for down servers --- diff --git a/pdns/dnsdist-carbon.cc b/pdns/dnsdist-carbon.cc index 6fb8b43d08..41f32c577e 100644 --- a/pdns/dnsdist-carbon.cc +++ b/pdns/dnsdist-carbon.cc @@ -89,7 +89,7 @@ try const string base = "dnsdist." + hostname + ".main.servers." + serverName + "."; str<queries.load() << " " << now << "\r\n"; str<reuseds.load() << " " << now << "\r\n"; - str<latencyUsec/1000.0 << " " << now << "\r\n"; + str<availability != DownstreamState::Availability::Down ? s->latencyUsec/1000.0 : 0) << " " << now << "\r\n"; str<sendErrors.load() << " " << now << "\r\n"; str<outstanding.load() << " " << now << "\r\n"; } diff --git a/pdns/dnsdist-web.cc b/pdns/dnsdist-web.cc index 58ef982f03..530fc44012 100644 --- a/pdns/dnsdist-web.cc +++ b/pdns/dnsdist-web.cc @@ -354,6 +354,11 @@ static void connectionThread(int sock, ComboAddress remote, string password, str {"latency", (int)(a->latencyUsec/1000.0)}, {"queries", (int)a->queries}}; + /* sending a latency for a DOWN server doesn't make sense */ + if (a->availability == DownstreamState::Availability::Down) { + server["latency"] = nullptr; + } + servers.push_back(server); } diff --git a/regression-tests.dnsdist/test_API.py b/regression-tests.dnsdist/test_API.py index 95b353b5d3..fd4a323812 100644 --- a/regression-tests.dnsdist/test_API.py +++ b/regression-tests.dnsdist/test_API.py @@ -248,6 +248,35 @@ class TestAPIBasics(DNSDistTest): for key in ['blocks']: self.assertTrue(content[key] >= 0) +class TestAPIServerDown(DNSDistTest): + + _webTimeout = 2.0 + _webServerPort = 8083 + _webServerBasicAuthPassword = 'secret' + _webServerAPIKey = 'apisecret' + # paths accessible using the API key + _config_params = ['_testServerPort', '_webServerPort', '_webServerBasicAuthPassword', '_webServerAPIKey'] + _config_template = """ + setACL({"127.0.0.1/32", "::1/128"}) + newServer{address="127.0.0.1:%s"} + getServer(0):setDown() + webserver("127.0.0.1:%s", "%s", "%s") + """ + + def testServerDownNoLatencyLocalhost(self): + """ + API: /api/v1/servers/localhost, no latency for a down server + """ + headers = {'x-api-key': self._webServerAPIKey} + url = 'http://127.0.0.1:' + str(self._webServerPort) + '/api/v1/servers/localhost' + r = requests.get(url, headers=headers, timeout=self._webTimeout) + self.assertTrue(r) + self.assertEquals(r.status_code, 200) + self.assertTrue(r.json()) + content = r.json() + + self.assertEquals(content['servers'][0]['latency'], None) + class TestAPIWritable(DNSDistTest): _webTimeout = 2.0