]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add a `XskSocket::getMetrics()` binding
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 3 Mar 2023 13:01:43 +0000 (14:01 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 23 Jan 2024 11:54:15 +0000 (12:54 +0100)
pdns/dnsdist-lua-bindings.cc
pdns/xsk.cc
pdns/xsk.hh

index 130a71153ddf9ef0e608ba2d7bde5b19ca4a67b4..6a3644d672f0b6f05d983972aab810fa367f4e58 100644 (file)
@@ -762,6 +762,13 @@ void setupLuaBindings(LuaContext& luaCtx, bool client, bool configCheck)
     g_xsk.push_back(socket); 
     return socket;
   });
+  luaCtx.registerFunction<std::string(std::shared_ptr<XskSocket>::*)()const>("getMetrics", [](const std::shared_ptr<XskSocket>& xsk) {
+    std::string result;
+    if (!xsk) {
+      return result;
+    }
+    return xsk->getMetrics();
+  });
 #endif /* HAVE_XSK */
   /* EDNSOptionView */
   luaCtx.registerFunction<size_t(EDNSOptionView::*)()const>("count", [](const EDNSOptionView& option) {
index 722d823ae2203decefdf3f4be6075e263067d6d3..f8c73d8c8815ba1611b25136913dedaa4c55f0b8 100644 (file)
@@ -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) {
index 4f9d5cc389c6ee750d04a95634fcf57a0ca49dfc..026417d6f34099f26cb7a8cd8706314c30083b7e 100644 (file)
@@ -144,6 +144,7 @@ public:
   // look at incoming packets in rx, return them if parsing succeeeded
   std::vector<XskPacketPtr> recv(uint32_t recvSizeMax, uint32_t* failedCount);
   void addWorker(std::shared_ptr<XskWorker> s, const ComboAddress& dest, bool isTCP);
+  std::string getMetrics() const;
 };
 class XskPacket
 {