Comparison

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
comparison
equal deleted inserted replaced
13658:33806569d7c5 13659:5abdcad8c2e0
18 local net_server = require "prosody.net.server"; 18 local net_server = require "prosody.net.server";
19 local libunbound = require"lunbound"; 19 local libunbound = require"lunbound";
20 local promise = require"prosody.util.promise"; 20 local promise = require"prosody.util.promise";
21 local new_id = require "prosody.util.id".short; 21 local new_id = require "prosody.util.id".short;
22 22
23 local gettime = require"socket".gettime;
24 local dns_utils = require"prosody.util.dns"; 23 local dns_utils = require"prosody.util.dns";
25 local classes, types, errors = dns_utils.classes, dns_utils.types, dns_utils.errors; 24 local classes, types, errors = dns_utils.classes, dns_utils.types, dns_utils.errors;
26 local parsers = dns_utils.parsers; 25 local parsers = dns_utils.parsers;
27 26
28 local builtin_defaults = { hoststxt = false } 27 local builtin_defaults = { hoststxt = false }
114 end 113 end
115 end 114 end
116 return setmetatable(a, answer_mt); 115 return setmetatable(a, answer_mt);
117 end 116 end
118 117
118 local function measure(_qclass, _qtype)
119 return measure;
120 end
121
119 local function lookup(callback, qname, qtype, qclass) 122 local function lookup(callback, qname, qtype, qclass)
120 if not unbound then initialize(); end 123 if not unbound then initialize(); end
121 qtype = qtype and s_upper(qtype) or "A"; 124 qtype = qtype and s_upper(qtype) or "A";
122 qclass = qclass and s_upper(qclass) or "IN"; 125 qclass = qclass and s_upper(qclass) or "IN";
123 local ntype, nclass = types[qtype], classes[qclass]; 126 local ntype, nclass = types[qtype], classes[qclass];
124 local startedat = gettime(); 127
128 local m;
125 local ret; 129 local ret;
126 local log_query = logger.init("unbound.query"..new_id()); 130 local log_query = logger.init("unbound.query"..new_id());
127 local function callback_wrapper(a, err) 131 local function callback_wrapper(a, err)
128 local gotdataat = gettime(); 132 m();
129 waiting_queries[ret] = nil; 133 waiting_queries[ret] = nil;
130 if a then 134 if a then
131 prep_answer(a); 135 prep_answer(a);
132 log_query("debug", "Results for %s %s %s: %s (%s, %f sec)", qname, qclass, qtype, a.rcode == 0 and (#a .. " items") or a.status, 136 log_query("debug", "Results for %s %s %s: %s (%s)", qname, qclass, qtype, a.rcode == 0 and (#a .. " items") or a.status,
133 a.secure and "Secure" or a.bogus or "Insecure", gotdataat - startedat); -- Insecure as in unsigned 137 a.secure and "Secure" or a.bogus or "Insecure"); -- Insecure as in unsigned
134 else 138 else
135 log_query("error", "Results for %s %s %s: %s", qname, qclass, qtype, tostring(err)); 139 log_query("error", "Results for %s %s %s: %s", qname, qclass, qtype, tostring(err));
136 end 140 end
137 local ok, cerr = pcall(callback, a, err); 141 local ok, cerr = pcall(callback, a, err);
138 if not ok then log_query("error", "Error in callback: %s", cerr); end 142 if not ok then log_query("error", "Error in callback: %s", cerr); end
139 end 143 end
140 log_query("debug", "Resolve %s %s %s", qname, qclass, qtype); 144 log_query("debug", "Resolve %s %s %s", qname, qclass, qtype);
145 m = measure(qclass, qtype);
141 local err; 146 local err;
142 ret, err = unbound:resolve_async(callback_wrapper, qname, ntype, nclass); 147 ret, err = unbound:resolve_async(callback_wrapper, qname, ntype, nclass);
143 if ret then 148 if ret then
144 waiting_queries[ret] = callback; 149 waiting_queries[ret] = callback;
145 else 150 else
223 settimeout = function () end; 228 settimeout = function () end;
224 closeall = function () end; 229 closeall = function () end;
225 }; 230 };
226 } 231 }
227 232
233 _M.instrument = function(measure_) measure = measure_; end;
234
228 function _M.resolver() return wrapper; end 235 function _M.resolver() return wrapper; end
229 236
230 return _M; 237 return _M;