Comparison

net/adns.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 12974:ba409c67353b
comparison
equal deleted inserted replaced
13658:33806569d7c5 13659:5abdcad8c2e0
72 return sock:send(data); 72 return sock:send(data);
73 end 73 end
74 return handler; 74 return handler;
75 end 75 end
76 76
77 local function measure(_qclass, _qtype)
78 return measure;
79 end
80
77 function async_resolver_methods:lookup(handler, qname, qtype, qclass) 81 function async_resolver_methods:lookup(handler, qname, qtype, qclass)
78 local resolver = self._resolver; 82 local resolver = self._resolver;
83 local m = measure(qclass or "IN", qtype or "A");
79 return coroutine.wrap(function (peek) 84 return coroutine.wrap(function (peek)
80 if peek then 85 if peek then
81 log("debug", "Records for %s already cached, using those...", qname); 86 log("debug", "Records for %s already cached, using those...", qname);
87 m();
82 handler(peek); 88 handler(peek);
83 return; 89 return;
84 end 90 end
85 log("debug", "Records for %s not in cache, sending query (%s)...", qname, coroutine.running()); 91 log("debug", "Records for %s not in cache, sending query (%s)...", qname, coroutine.running());
86 local ok, err = resolver:query(qname, qtype, qclass); 92 local ok, err = resolver:query(qname, qtype, qclass);
87 if ok then 93 if ok then
88 coroutine.yield(setmetatable({ resolver, qclass or "IN", qtype or "A", qname, coroutine.running()}, query_mt)); -- Wait for reply 94 coroutine.yield(setmetatable({ resolver, qclass or "IN", qtype or "A", qname, coroutine.running()}, query_mt)); -- Wait for reply
89 log("debug", "Reply for %s (%s)", qname, coroutine.running()); 95 log("debug", "Reply for %s (%s)", qname, coroutine.running());
90 end 96 end
91 if ok then 97 if ok then
98 m();
92 ok, err = pcall(handler, resolver:peek(qname, qtype, qclass)); 99 ok, err = pcall(handler, resolver:peek(qname, qtype, qclass));
93 else 100 else
94 log("error", "Error sending DNS query: %s", err); 101 log("error", "Error sending DNS query: %s", err);
95 ok, err = pcall(handler, nil, err); 102 ok, err = pcall(handler, nil, err);
96 end 103 end
127 lookup = function (...) 134 lookup = function (...)
128 return new_async_resolver():lookup(...); 135 return new_async_resolver():lookup(...);
129 end; 136 end;
130 resolver = new_async_resolver; 137 resolver = new_async_resolver;
131 new_async_socket = new_async_socket; 138 new_async_socket = new_async_socket;
139 instrument = function(measure_) measure = measure_; end;
132 }; 140 };