From: Remi Gacogne Date: Fri, 3 Mar 2023 13:01:43 +0000 (+0100) Subject: dnsdist: Add a `XskSocket::getMetrics()` binding X-Git-Tag: dnsdist-1.9.0-rc1^2~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=57131ee948ed9bef99470bd0bf598f863f0a95c0;p=thirdparty%2Fpdns.git dnsdist: Add a `XskSocket::getMetrics()` binding --- diff --git a/pdns/dnsdist-lua-bindings.cc b/pdns/dnsdist-lua-bindings.cc index 130a71153d..6a3644d672 100644 --- a/pdns/dnsdist-lua-bindings.cc +++ b/pdns/dnsdist-lua-bindings.cc @@ -762,6 +762,13 @@ void setupLuaBindings(LuaContext& luaCtx, bool client, bool configCheck) g_xsk.push_back(socket); return socket; }); + luaCtx.registerFunction::*)()const>("getMetrics", [](const std::shared_ptr& xsk) { + std::string result; + if (!xsk) { + return result; + } + return xsk->getMetrics(); + }); #endif /* HAVE_XSK */ /* EDNSOptionView */ luaCtx.registerFunction("count", [](const EDNSOptionView& option) { diff --git a/pdns/xsk.cc b/pdns/xsk.cc index 722d823ae2..f8c73d8c88 100644 --- a/pdns/xsk.cc +++ b/pdns/xsk.cc @@ -256,6 +256,28 @@ void XskSocket::XskUmem::umemInit(size_t memSize, xsk_ring_cons* cq, xsk_ring_pr } } +std::string XskSocket::getMetrics() const +{ + struct xdp_statistics stats; + socklen_t optlen = sizeof(stats); + int err = getsockopt(xskFd(), SOL_XDP, XDP_STATISTICS, &stats, &optlen); + if (err) { + return ""; + } + if (optlen != sizeof(struct xdp_statistics)) { + return ""; + } + + ostringstream ret; + ret << "RX dropped: " << std::to_string(stats.rx_dropped) << std::endl; + ret << "RX invalid descs: " << std::to_string(stats.rx_invalid_descs) << std::endl; + ret << "TX invalid descs: " << std::to_string(stats.tx_invalid_descs) << std::endl; + ret << "RX ring full: " << std::to_string(stats.rx_ring_full) << std::endl; + ret << "RX fill ring empty descs: " << std::to_string(stats.rx_fill_ring_empty_descs) << std::endl; + ret << "RX ring empty descs: " << std::to_string(stats.tx_ring_empty_descs) << std::endl; + return ret.str(); +} + XskSocket::XskUmem::~XskUmem() { if (umem) { diff --git a/pdns/xsk.hh b/pdns/xsk.hh index 4f9d5cc389..026417d6f3 100644 --- a/pdns/xsk.hh +++ b/pdns/xsk.hh @@ -144,6 +144,7 @@ public: // look at incoming packets in rx, return them if parsing succeeeded std::vector recv(uint32_t recvSizeMax, uint32_t* failedCount); void addWorker(std::shared_ptr s, const ComboAddress& dest, bool isTCP); + std::string getMetrics() const; }; class XskPacket {