Add DTrace support for resolver queries

When `fctx_query()` is called, a DTrace probe (if enabled) prints the
fetch context address, the upstream server address and port, and the
latest known SRTT for the server.
This commit is contained in:
Colin Vidal 2026-05-13 09:53:35 +02:00
parent fe8f3d9e81
commit 844eee509b
4 changed files with 39 additions and 2 deletions

29
dtrace/resolver-trace.stp Executable file
View file

@ -0,0 +1,29 @@
#!/usr/bin/env stap
#
# resolver-trace.stp - trace resolver queries
#
# Prints every resolver query to an upstream DNS server, each trace is
# identified by the fetch context. The trace contains the server IP, port and
# SRTT value.
#
# Usage:
# sudo stap resolver-trace.stp /path/to/named
# sudo stap resolver-trace.stp /path/to/named -x <pid>
#
# Output columns: elapsed milliseconds, fetch context pointer, server socket
# address and SRTT.
global start_time
probe begin {
start_time = gettimeofday_ms()
printf("%-10s %-16s %-46s %s\n", "ms", "fctx", "server", "SRTT")
}
probe process(@1).mark("resolver_query") {
printf("%-10d %-16p %-46s %d\n",
gettimeofday_ms() - start_time,
$arg1,
user_string($arg2),
$arg3)
}

View file

@ -10,7 +10,7 @@
# information regarding copyright ownership.
probe_hdr = dtrace_header.process('probes-dns.d')
probe_src = [probe_hdr, files('deleg.c', 'xfrin.c')]
probe_src = [probe_hdr, files('deleg.c', 'resolver.c', 'xfrin.c')]
# dns_inc += include_directories('include')
dns_inc_p += include_directories('.')
@ -145,7 +145,6 @@ dns_srcset.add(
'remote.c',
'request.c',
'resconf.c',
'resolver.c',
'result.c',
'rootns.c',
'rpz.c',

View file

@ -38,4 +38,5 @@ provider libdns {
probe xfrin_recv_try_axfr(void *, char *, int);
probe xfrin_sent(void *, char *, int);
probe xfrin_start(void *, char *);
probe resolver_query(void *, char *, int);
};

View file

@ -81,6 +81,7 @@
#include <dns/zoneproperties.h>
#include "dns/view.h"
#include "probes-dns.h"
#ifdef WANT_QUERYTRACE
#define RTRACE(m) \
@ -2056,6 +2057,13 @@ fctx_query(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
FCTXTRACE("query");
if (LIBDNS_RESOLVER_QUERY_ENABLED()) {
char addrstr[ISC_SOCKADDR_FORMATSIZE];
isc_sockaddr_format(&addrinfo->sockaddr, addrstr,
sizeof(addrstr));
LIBDNS_RESOLVER_QUERY(fctx, addrstr, addrinfo->srtt);
}
res = fctx->res;
srtt = addrinfo->srtt;