const string base = "dnsdist." + hostname + ".main.servers." + serverName + ".";
str<<base<<"queries" << ' ' << s->queries.load() << " " << now << "\r\n";
str<<base<<"drops" << ' ' << s->reuseds.load() << " " << now << "\r\n";
- str<<base<<"latency" << ' ' << s->latencyUsec/1000.0 << " " << now << "\r\n";
+ str<<base<<"latency" << ' ' << (s->availability != DownstreamState::Availability::Down ? s->latencyUsec/1000.0 : 0) << " " << now << "\r\n";
str<<base<<"senderrors" << ' ' << s->sendErrors.load() << " " << now << "\r\n";
str<<base<<"outstanding" << ' ' << s->outstanding.load() << " " << now << "\r\n";
}
{"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);
}
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