--- /dev/null
+#!/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)
+}
# 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('.')
'remote.c',
'request.c',
'resconf.c',
- 'resolver.c',
'result.c',
'rootns.c',
'rpz.c',
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);
};
#include <dns/zoneproperties.h>
#include "dns/view.h"
+#include "probes-dns.h"
#ifdef WANT_QUERYTRACE
#define RTRACE(m) \
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;