Software /
code /
prosody
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; |