diff --git a/dtrace/resolver-trace.stp b/dtrace/resolver-trace.stp new file mode 100755 index 0000000000..55e47ac98c --- /dev/null +++ b/dtrace/resolver-trace.stp @@ -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 +# +# 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) +} diff --git a/lib/dns/meson.build b/lib/dns/meson.build index 007d4bb1b3..8ba0a942e8 100644 --- a/lib/dns/meson.build +++ b/lib/dns/meson.build @@ -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', diff --git a/lib/dns/probes-dns.d b/lib/dns/probes-dns.d index ed5ea0b386..e37baed61d 100644 --- a/lib/dns/probes-dns.d +++ b/lib/dns/probes-dns.d @@ -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); }; diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 258b8bf076..20b75dd25e 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -81,6 +81,7 @@ #include #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;