]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add DTrace support for resolver queries 12010/head
authorColin Vidal <colin@isc.org>
Wed, 13 May 2026 07:53:35 +0000 (09:53 +0200)
committerColin Vidal <colin@isc.org>
Thu, 4 Jun 2026 11:55:56 +0000 (13:55 +0200)
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.

dtrace/resolver-trace.stp [new file with mode: 0755]
lib/dns/meson.build
lib/dns/probes-dns.d
lib/dns/resolver.c

diff --git a/dtrace/resolver-trace.stp b/dtrace/resolver-trace.stp
new file mode 100755 (executable)
index 0000000..55e47ac
--- /dev/null
@@ -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)
+}
index 007d4bb1b3e2070d4a6f1b3f6789cde33b09c282..8ba0a942e8ae8181235044597bc354430d67d416 100644 (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',
index ed5ea0b38660b7377c90817d3f5c38e5a828d1e5..e37baed61df7bfd7e2e05dd3444c06731e7a53bf 100644 (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);
 };
index 258b8bf076cbf7c703f62eb26084b3fe4b18a9c3..20b75dd25ef23f84d82f96b5e884398637917347 100644 (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;