summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelley <simon@thekelleys.org.uk>2022-09-15 23:22:02 +0100
committerSimon Kelley <simon@thekelleys.org.uk>2022-09-15 23:22:02 +0100
commita2ee2426bfd244e7f401fe3260f696a33104bfaa (patch)
tree9876c7389072372744d92284952cd9b9841b6149
parent84bd46ddd7a639b457daf74722f3bcc0c11e65df (diff)
downloaddnsmasq-a2ee2426bfd244e7f401fe3260f696a33104bfaa.tar.gz
Keep a per-DNS-server moving average of query latency.
-rw-r--r--src/cache.c13
-rw-r--r--src/dbus.c7
-rw-r--r--src/dnsmasq.h1
-rw-r--r--src/forward.c9
4 files changed, 22 insertions, 8 deletions
diff --git a/src/cache.c b/src/cache.c
index 689451c..437e777 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -1664,19 +1664,18 @@ int cache_make_stat(struct txt_record *t)
{
char *new, *lenp;
int port, newlen, bytes_avail, bytes_needed;
- unsigned int queries = 0, failed_queries = 0, nxdomain_replies = 0;
+ unsigned int queries = 0, failed_queries = 0;
for (serv1 = serv; serv1; serv1 = serv1->next)
if (!(serv1->flags & SERV_MARK) && sockaddr_isequal(&serv->addr, &serv1->addr))
{
serv1->flags |= SERV_MARK;
queries += serv1->queries;
failed_queries += serv1->failed_queries;
- nxdomain_replies += serv1->nxdomain_replies;
}
port = prettyprint_addr(&serv->addr, daemon->addrbuff);
lenp = p++; /* length */
bytes_avail = bufflen - (p - buff );
- bytes_needed = snprintf(p, bytes_avail, "%s#%d %u %u %u", daemon->addrbuff, port, queries, failed_queries, nxdomain_replies);
+ bytes_needed = snprintf(p, bytes_avail, "%s#%d %u %u", daemon->addrbuff, port, queries, failed_queries);
if (bytes_needed >= bytes_avail)
{
/* expand buffer if necessary */
@@ -1747,6 +1746,8 @@ void dump_cache(time_t now)
{
int port;
unsigned int queries = 0, failed_queries = 0, nxdomain_replies = 0;
+ unsigned int sigma_latency = 0, count_latency = 0;
+
for (serv1 = serv; serv1; serv1 = serv1->next)
if (!(serv1->flags & SERV_MARK) && sockaddr_isequal(&serv->addr, &serv1->addr))
{
@@ -1754,10 +1755,12 @@ void dump_cache(time_t now)
queries += serv1->queries;
failed_queries += serv1->failed_queries;
nxdomain_replies += serv1->nxdomain_replies;
+ sigma_latency += serv1->query_latency;
+ count_latency++;
}
port = prettyprint_addr(&serv->addr, daemon->addrbuff);
- my_syslog(LOG_INFO, _("server %s#%d: queries sent %u, retried or failed %u, nxdomain replies %u"),
- daemon->addrbuff, port, queries, failed_queries, nxdomain_replies);
+ my_syslog(LOG_INFO, _("server %s#%d: queries sent %u, retried or failed %u, nxdomain replies %u, avg. latency %ums"),
+ daemon->addrbuff, port, queries, failed_queries, nxdomain_replies, sigma_latency/count_latency);
}
if (option_bool(OPT_DEBUG) || option_bool(OPT_LOG))
diff --git a/src/dbus.c b/src/dbus.c
index 782fdc9..ebd8d7f 100644
--- a/src/dbus.c
+++ b/src/dbus.c
@@ -682,6 +682,8 @@ static DBusMessage *dbus_get_server_metrics(DBusMessage* message)
{
unsigned int port;
unsigned int queries = 0, failed_queries = 0, nxdomain_replies = 0;
+ unsigned int sigma_latency = 0, count_latency = 0;
+
struct server *serv1;
for (serv1 = serv; serv1; serv1 = serv1->next)
@@ -691,6 +693,8 @@ static DBusMessage *dbus_get_server_metrics(DBusMessage* message)
queries += serv1->queries;
failed_queries += serv1->failed_queries;
nxdomain_replies += serv1->nxdomain_replies;
+ sigma_latency += serv1->query_latency;
+ count_latency++;
}
dbus_message_iter_open_container(&server_array, DBUS_TYPE_ARRAY, "{ss}", &dict_array);
@@ -702,7 +706,8 @@ static DBusMessage *dbus_get_server_metrics(DBusMessage* message)
add_dict_int(&dict_array, "queries", serv->queries);
add_dict_int(&dict_array, "failed_queries", serv->failed_queries);
add_dict_int(&dict_array, "nxdomain", serv->nxdomain_replies);
-
+ add_dict_int(&dict_array, "latency", sigma_latency/count_latency;
+
dbus_message_iter_close_container(&server_array, &dict_array);
}
diff --git a/src/dnsmasq.h b/src/dnsmasq.h
index ef412b5..f8d7c55 100644
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
@@ -587,6 +587,7 @@ struct server {
int tcpfd, edns_pktsz;
time_t pktsz_reduced;
unsigned int queries, failed_queries, nxdomain_replies;
+ unsigned int query_latency, mma_latency;
time_t forwardtime;
int forwardcount;
#ifdef HAVE_LOOP
diff --git a/src/forward.c b/src/forward.c
index 2134528..e1ec30a 100644
--- a/src/forward.c
+++ b/src/forward.c
@@ -553,8 +553,7 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
if (forwarded || is_dnssec)
{
- if (daemon->fast_retry_time != 0)
- forward->forward_timestamp = dnsmasq_milliseconds();
+ forward->forward_timestamp = dnsmasq_milliseconds();
return 1;
}
@@ -1237,6 +1236,12 @@ void reply_query(int fd, time_t now)
answers, to conserve file descriptors, and to save work reading and
discarding answers for other upstreams. */
free_rfds(&forward->rfds);
+
+ /* calculate modified moving average of server latency */
+ server->mma_latency += dnsmasq_milliseconds() - forward->forward_timestamp - server->query_latency;
+ /* denominator controls how many queries we average over. */
+ server->query_latency = server->mma_latency/128;
+
#ifdef HAVE_DNSSEC
if ((forward->sentto->flags & SERV_DO_DNSSEC) &&