]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
chore(dnsdist): move doLatencyStats to dnsdist::metrics
authorPieter Lexis <pieter.lexis@powerdns.com>
Thu, 23 Oct 2025 08:12:39 +0000 (10:12 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Mon, 1 Jun 2026 10:52:27 +0000 (12:52 +0200)
pdns/dnsdistdist/dnsdist-metrics.cc
pdns/dnsdistdist/dnsdist-metrics.hh
pdns/dnsdistdist/dnsdist.cc

index cbb237ed0b845e92482e9d26b4c535616c8c9150..00e217cd260904f26c0f342063fcd7cc625ba689 100644 (file)
@@ -342,4 +342,52 @@ std::variant<double, Error> getCustomMetric(const std::string_view& name, const
   }
   return std::string("Unable to get metric '") + std::string(name) + "': no such metric";
 }
+
+void doLatencyStats(dnsdist::Protocol protocol, double latencyUs)
+{
+  constexpr auto doAvg = [](pdns::stat_double_t& var, double n, double weight) {
+    var.store((weight - 1) * var.load() / weight + n / weight);
+  };
+
+  if (protocol == dnsdist::Protocol::DoUDP || protocol == dnsdist::Protocol::DNSCryptUDP) {
+    if (latencyUs >= 0) {
+      dnsdist::metrics::updateLatencyHistogram(g_stats, static_cast<uint64_t>(latencyUs));
+    }
+
+    doAvg(dnsdist::metrics::g_stats.latencyAvg100, latencyUs, 100);
+    doAvg(dnsdist::metrics::g_stats.latencyAvg1000, latencyUs, 1000);
+    doAvg(dnsdist::metrics::g_stats.latencyAvg10000, latencyUs, 10000);
+    doAvg(dnsdist::metrics::g_stats.latencyAvg1000000, latencyUs, 1000000);
+  }
+  else if (protocol == dnsdist::Protocol::DoTCP || protocol == dnsdist::Protocol::DNSCryptTCP) {
+    doAvg(dnsdist::metrics::g_stats.latencyTCPAvg100, latencyUs, 100);
+    doAvg(dnsdist::metrics::g_stats.latencyTCPAvg1000, latencyUs, 1000);
+    doAvg(dnsdist::metrics::g_stats.latencyTCPAvg10000, latencyUs, 10000);
+    doAvg(dnsdist::metrics::g_stats.latencyTCPAvg1000000, latencyUs, 1000000);
+  }
+  else if (protocol == dnsdist::Protocol::DoT) {
+    doAvg(dnsdist::metrics::g_stats.latencyDoTAvg100, latencyUs, 100);
+    doAvg(dnsdist::metrics::g_stats.latencyDoTAvg1000, latencyUs, 1000);
+    doAvg(dnsdist::metrics::g_stats.latencyDoTAvg10000, latencyUs, 10000);
+    doAvg(dnsdist::metrics::g_stats.latencyDoTAvg1000000, latencyUs, 1000000);
+  }
+  else if (protocol == dnsdist::Protocol::DoH) {
+    doAvg(dnsdist::metrics::g_stats.latencyDoHAvg100, latencyUs, 100);
+    doAvg(dnsdist::metrics::g_stats.latencyDoHAvg1000, latencyUs, 1000);
+    doAvg(dnsdist::metrics::g_stats.latencyDoHAvg10000, latencyUs, 10000);
+    doAvg(dnsdist::metrics::g_stats.latencyDoHAvg1000000, latencyUs, 1000000);
+  }
+  else if (protocol == dnsdist::Protocol::DoQ) {
+    doAvg(dnsdist::metrics::g_stats.latencyDoQAvg100, latencyUs, 100);
+    doAvg(dnsdist::metrics::g_stats.latencyDoQAvg1000, latencyUs, 1000);
+    doAvg(dnsdist::metrics::g_stats.latencyDoQAvg10000, latencyUs, 10000);
+    doAvg(dnsdist::metrics::g_stats.latencyDoQAvg1000000, latencyUs, 1000000);
+  }
+  else if (protocol == dnsdist::Protocol::DoH3) {
+    doAvg(dnsdist::metrics::g_stats.latencyDoH3Avg100, latencyUs, 100);
+    doAvg(dnsdist::metrics::g_stats.latencyDoH3Avg1000, latencyUs, 1000);
+    doAvg(dnsdist::metrics::g_stats.latencyDoH3Avg10000, latencyUs, 10000);
+    doAvg(dnsdist::metrics::g_stats.latencyDoH3Avg1000000, latencyUs, 1000000);
+  }
+}
 }
index 2bd91fc072598f06db9c7b71b24f1eae03df854b..192d41a5d2d5e7f57cbd000c5b5424a99c3e7563 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "lock.hh"
 #include "stat_t.hh"
+#include "dnsdist-protocols.hh"
 
 namespace dnsdist::metrics
 {
@@ -103,6 +104,8 @@ struct Stats
   SharedLockGuarded<std::vector<EntryTriple>> entries;
 };
 
+void doLatencyStats(dnsdist::Protocol protocol, double latencyUs);
+
 extern struct Stats g_stats;
 
 template <class T>
index c84a51574e0ea44ff1029510bc990153eda56584..8ccf74639c789d50023a0950670aa9090e634ae6 100644 (file)
@@ -147,54 +147,6 @@ struct DelayedPacket
 static std::unique_ptr<DelayPipe<DelayedPacket>> g_delay{nullptr};
 #endif /* DISABLE_DELAY_PIPE */
 
-static void doLatencyStats(dnsdist::Protocol protocol, double latencyUs)
-{
-  constexpr auto doAvg = [](pdns::stat_double_t& var, double n, double weight) {
-    var.store((weight - 1) * var.load() / weight + n / weight);
-  };
-
-  if (protocol == dnsdist::Protocol::DoUDP || protocol == dnsdist::Protocol::DNSCryptUDP) {
-    if (latencyUs >= 0) {
-      dnsdist::metrics::updateLatencyHistogram(dnsdist::metrics::g_stats, static_cast<uint64_t>(latencyUs));
-    }
-
-    doAvg(dnsdist::metrics::g_stats.latencyAvg100, latencyUs, 100);
-    doAvg(dnsdist::metrics::g_stats.latencyAvg1000, latencyUs, 1000);
-    doAvg(dnsdist::metrics::g_stats.latencyAvg10000, latencyUs, 10000);
-    doAvg(dnsdist::metrics::g_stats.latencyAvg1000000, latencyUs, 1000000);
-  }
-  else if (protocol == dnsdist::Protocol::DoTCP || protocol == dnsdist::Protocol::DNSCryptTCP) {
-    doAvg(dnsdist::metrics::g_stats.latencyTCPAvg100, latencyUs, 100);
-    doAvg(dnsdist::metrics::g_stats.latencyTCPAvg1000, latencyUs, 1000);
-    doAvg(dnsdist::metrics::g_stats.latencyTCPAvg10000, latencyUs, 10000);
-    doAvg(dnsdist::metrics::g_stats.latencyTCPAvg1000000, latencyUs, 1000000);
-  }
-  else if (protocol == dnsdist::Protocol::DoT) {
-    doAvg(dnsdist::metrics::g_stats.latencyDoTAvg100, latencyUs, 100);
-    doAvg(dnsdist::metrics::g_stats.latencyDoTAvg1000, latencyUs, 1000);
-    doAvg(dnsdist::metrics::g_stats.latencyDoTAvg10000, latencyUs, 10000);
-    doAvg(dnsdist::metrics::g_stats.latencyDoTAvg1000000, latencyUs, 1000000);
-  }
-  else if (protocol == dnsdist::Protocol::DoH) {
-    doAvg(dnsdist::metrics::g_stats.latencyDoHAvg100, latencyUs, 100);
-    doAvg(dnsdist::metrics::g_stats.latencyDoHAvg1000, latencyUs, 1000);
-    doAvg(dnsdist::metrics::g_stats.latencyDoHAvg10000, latencyUs, 10000);
-    doAvg(dnsdist::metrics::g_stats.latencyDoHAvg1000000, latencyUs, 1000000);
-  }
-  else if (protocol == dnsdist::Protocol::DoQ) {
-    doAvg(dnsdist::metrics::g_stats.latencyDoQAvg100, latencyUs, 100);
-    doAvg(dnsdist::metrics::g_stats.latencyDoQAvg1000, latencyUs, 1000);
-    doAvg(dnsdist::metrics::g_stats.latencyDoQAvg10000, latencyUs, 10000);
-    doAvg(dnsdist::metrics::g_stats.latencyDoQAvg1000000, latencyUs, 1000000);
-  }
-  else if (protocol == dnsdist::Protocol::DoH3) {
-    doAvg(dnsdist::metrics::g_stats.latencyDoH3Avg100, latencyUs, 100);
-    doAvg(dnsdist::metrics::g_stats.latencyDoH3Avg1000, latencyUs, 1000);
-    doAvg(dnsdist::metrics::g_stats.latencyDoH3Avg10000, latencyUs, 10000);
-    doAvg(dnsdist::metrics::g_stats.latencyDoH3Avg1000000, latencyUs, 1000000);
-  }
-}
-
 bool responseContentMatches(const PacketBuffer& response, const DNSName& qname, const uint16_t qtype, const uint16_t qclass, const std::shared_ptr<DownstreamState>& remote, bool allowEmptyResponse)
 {
   if (response.size() < sizeof(dnsheader)) {
@@ -596,7 +548,7 @@ void handleResponseSent(DNSName&& qname, const QType& qtype, double latencyUs, c
     break;
   }
 
-  doLatencyStats(incomingProtocol, latencyUs);
+  dnsdist::metrics::doLatencyStats(incomingProtocol, latencyUs);
 }
 
 static void handleResponseTC4UDPClient(DNSQuestion& dnsQuestion, uint16_t udpPayloadSize, PacketBuffer& response)