Skip to content

Commit

Permalink
dnsdist: Stop reporting timeouts in topSlow(), add topTimeouts()
Browse files Browse the repository at this point in the history
Until this commit `topSlow()` returned queries that timed out, which
is not very helpful. This was happening because timeouts are internally
recorded with a very high response time.
With this change, `topSlow()` now ignores queries that timed out, and
a new command is added to look into these: `topTimeouts()`.
  • Loading branch information
rgacogne committed Aug 20, 2024
1 parent 5dd2221 commit 706b4e4
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 4 deletions.
3 changes: 2 additions & 1 deletion pdns/dnsdistdist/dnsdist-console.cc
Original file line number Diff line number Diff line change
Expand Up @@ -844,7 +844,8 @@ static const std::vector<dnsdist::console::ConsoleKeyword> s_consoleKeywords
{"topResponseRules", true, "[top][, vars]", "show `top` response rules"},
{"topRules", true, "[top][, vars]", "show `top` rules"},
{"topSelfAnsweredResponseRules", true, "[top][, vars]", "show `top` self-answered response rules"},
{"topSlow", true, "[top][, limit][, labels]", "show `top` queries slower than `limit` milliseconds, grouped by last `labels` labels"},
{"topSlow", true, "[top][, limit][, labels]", "show `top` queries slower than `limit` milliseconds (timeouts excepted), grouped by last `labels` labels"},
{"topTimeouts", true, "[top][, labels]", "show `top` queries that timed out, grouped by last `labels` labels"},
{"TrailingDataRule", true, "", "Matches if the query has trailing data"},
{"truncateTC", true, "bool", "if set (defaults to no starting with dnsdist 1.2.0) truncate TC=1 answers so they are actually empty. Fixes an issue for PowerDNS Authoritative Server 2.9.22. Note: turning this on breaks compatibility with RFC 6891."},
{"unregisterDynBPFFilter", true, "DynBPFFilter", "unregister this dynamic BPF filter"},
Expand Down
13 changes: 10 additions & 3 deletions pdns/dnsdistdist/dnsdist-lua-inspection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -518,11 +518,18 @@ void setupLuaInspection(LuaContext& luaCtx)

luaCtx.executeCode(R"(function topResponses(top, kind, labels) top = top or 10; kind = kind or 0; for k,v in ipairs(getTopResponses(top, kind, labels)) do show(string.format("%4d %-40s %4d %4.1f%%",k,v[1],v[2],v[3])) end end)");

luaCtx.writeFunction("getSlowResponses", [](uint64_t top, uint64_t msec, boost::optional<int> labels) {
return getGenResponses(top, labels, [msec](const Rings::Response& resp) { return resp.usec > msec * 1000; });
luaCtx.writeFunction("getSlowResponses", [](uint64_t top, uint64_t msec, boost::optional<int> labels, boost::optional<bool> timeouts) {
return getGenResponses(top, labels, [msec,timeouts](const Rings::Response& resp) {
if (timeouts && *timeouts) {
return resp.usec == std::numeric_limits<unsigned int>::max();
}
return resp.usec > msec * 1000 && resp.usec != std::numeric_limits<unsigned int>::max();
});
});

luaCtx.executeCode(R"(function topSlow(top, msec, labels) top = top or 10; msec = msec or 500; for k,v in ipairs(getSlowResponses(top, msec, labels)) do show(string.format("%4d %-40s %4d %4.1f%%",k,v[1],v[2],v[3])) end end)");
luaCtx.executeCode(R"(function topSlow(top, msec, labels) top = top or 10; msec = msec or 500; for k,v in ipairs(getSlowResponses(top, msec, labels, false)) do show(string.format("%4d %-40s %4d %4.1f%%",k,v[1],v[2],v[3])) end end)");

luaCtx.executeCode(R"(function topTimeouts(top, labels) top = top or 10; for k,v in ipairs(getSlowResponses(top, 0, labels, true)) do show(string.format("%4d %-40s %4d %4.1f%%",k,v[1],v[2],v[3])) end end)");

luaCtx.writeFunction("getTopBandwidth", [](uint64_t top) {
setLuaNoSideEffect();
Expand Down
13 changes: 13 additions & 0 deletions pdns/dnsdistdist/docs/reference/config.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1504,13 +1504,26 @@ Status, Statistics and More

.. function:: topSlow([num[, limit[, labels]]])

.. versionchanged:: 1.9.7
queries that timed out are no longer reported by ``topSlow``, see :func:`topTimeouts` instead

Print the ``num`` slowest queries that are slower than ``limit`` milliseconds.
Optionally grouped by the rightmost ``labels`` DNS labels.

:param int num: Number to show, defaults to 10
:param int limit: Show queries slower than this amount of milliseconds, defaults to 2000
:param int label: Number of labels to cut down to

.. function:: topTimeouts([num[, labels]])

.. versionadded:: 1.9.7

Print the ``num`` queries that timed out the most.
Optionally grouped by the rightmost ``labels`` DNS labels.

:param int num: Number to show, defaults to 10
:param int label: Number of labels to cut down to

.. _dynblocksref:

Dynamic Blocks
Expand Down

0 comments on commit 706b4e4

Please sign in to comment.