diff options
author | Simon Kelley <simon@thekelleys.org.uk> | 2022-09-15 23:22:02 +0100 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2022-09-15 23:22:02 +0100 |
commit | a2ee2426bfd244e7f401fe3260f696a33104bfaa (patch) | |
tree | 9876c7389072372744d92284952cd9b9841b6149 | |
parent | 84bd46ddd7a639b457daf74722f3bcc0c11e65df (diff) | |
download | dnsmasq-a2ee2426bfd244e7f401fe3260f696a33104bfaa.tar.gz |
Keep a per-DNS-server moving average of query latency.
-rw-r--r-- | src/cache.c | 13 | ||||
-rw-r--r-- | src/dbus.c | 7 | ||||
-rw-r--r-- | src/dnsmasq.h | 1 | ||||
-rw-r--r-- | src/forward.c | 9 |
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)) @@ -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) && |