Diff

net/unbound.lua @ 13659:5abdcad8c2e0

net.adns: Collect DNS lookup timing metrics Nice to have this in OpenMetricts instead of debug logs
author Kim Alvefur <zash@zash.se>
date Fri, 07 Feb 2025 09:22:52 +0100
parent 13479:d1b7edf4e2de
line wrap: on
line diff
--- a/net/unbound.lua	Thu Feb 06 17:37:59 2025 +0000
+++ b/net/unbound.lua	Fri Feb 07 09:22:52 2025 +0100
@@ -20,7 +20,6 @@
 local promise = require"prosody.util.promise";
 local new_id = require "prosody.util.id".short;
 
-local gettime = require"socket".gettime;
 local dns_utils = require"prosody.util.dns";
 local classes, types, errors = dns_utils.classes, dns_utils.types, dns_utils.errors;
 local parsers = dns_utils.parsers;
@@ -116,21 +115,26 @@
 	return setmetatable(a, answer_mt);
 end
 
+local function measure(_qclass, _qtype)
+	return measure;
+end
+
 local function lookup(callback, qname, qtype, qclass)
 	if not unbound then initialize(); end
 	qtype = qtype and s_upper(qtype) or "A";
 	qclass = qclass and s_upper(qclass) or "IN";
 	local ntype, nclass = types[qtype], classes[qclass];
-	local startedat = gettime();
+
+	local m;
 	local ret;
 	local log_query = logger.init("unbound.query"..new_id());
 	local function callback_wrapper(a, err)
-		local gotdataat = gettime();
+		m();
 		waiting_queries[ret] = nil;
 		if a then
 			prep_answer(a);
-			log_query("debug", "Results for %s %s %s: %s (%s, %f sec)", qname, qclass, qtype, a.rcode == 0 and (#a .. " items") or a.status,
-				a.secure and "Secure" or a.bogus or "Insecure", gotdataat - startedat); -- Insecure as in unsigned
+			log_query("debug", "Results for %s %s %s: %s (%s)", qname, qclass, qtype, a.rcode == 0 and (#a .. " items") or a.status,
+				a.secure and "Secure" or a.bogus or "Insecure"); -- Insecure as in unsigned
 		else
 			log_query("error", "Results for %s %s %s: %s", qname, qclass, qtype, tostring(err));
 		end
@@ -138,6 +142,7 @@
 		if not ok then log_query("error", "Error in callback: %s", cerr); end
 	end
 	log_query("debug", "Resolve %s %s %s", qname, qclass, qtype);
+	m = measure(qclass, qtype);
 	local err;
 	ret, err = unbound:resolve_async(callback_wrapper, qname, ntype, nclass);
 	if ret then
@@ -225,6 +230,8 @@
 	};
 }
 
+_M.instrument = function(measure_) measure = measure_; end;
+
 function _M.resolver() return wrapper; end
 
 return _M;