]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Unify histogram updates
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 22 Dec 2025 10:23:12 +0000 (11:23 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 22 Dec 2025 10:25:25 +0000 (11:25 +0100)
Signed-off-by: Remi Gacogne <remi.gacogne@powerdns.com>
pdns/dnsdistdist/dnsdist-healthchecks.cc
pdns/dnsdistdist/dnsdist-metrics.hh
pdns/dnsdistdist/dnsdist.cc

index 52b028ee5b989bd7c6a5f9f524e0e88eb866f257..9db5de80242a8bac01aad5641f5806ab2ef19081 100644 (file)
@@ -63,30 +63,12 @@ struct HealthCheckData
 
 static void updateLatencyMetrics(DownstreamState& downstream, int elapsed /* microseconds */)
 {
-  auto& histo = downstream.d_healthCheckLatencyHisto;
-  downstream.d_healthCheckLatency.store(elapsed);
+  if (elapsed >= 0) {
+    downstream.d_healthCheckLatency.store(elapsed);
 
-  if (elapsed < 1000) {
-    ++histo.latency0_1;
+    auto& histo = downstream.d_healthCheckLatencyHisto;
+    dnsdist::metrics::updateLatencyHistogram(histo, static_cast<uint64_t>(elapsed));
   }
-  else if (elapsed < 10000) {
-    ++histo.latency1_10;
-  }
-  else if (elapsed < 50000) {
-    ++histo.latency10_50;
-  }
-  else if (elapsed < 100000) {
-    ++histo.latency50_100;
-  }
-  else if (elapsed < 1000000) {
-    ++histo.latency100_1000;
-  }
-  else {
-    ++histo.latencySlow;
-  }
-
-  histo.latencySum += static_cast<unsigned long>(elapsed) / 1000;
-  ++histo.latencyCount;
 }
 
 static bool handleResponse(std::shared_ptr<HealthCheckData>& data)
index 7842bb2205d232e02498f261d3251aee4d807f89..8a82bac5f37c16327ef97698d6a5173a161f8b37 100644 (file)
@@ -103,4 +103,31 @@ struct Stats
 };
 
 extern struct Stats g_stats;
+
+template <class T>
+static inline void updateLatencyHistogram(T& container, uint64_t elapsed /* microseconds */)
+{
+  if (elapsed < 1000U) {
+    ++container.latency0_1;
+  }
+  else if (elapsed < 10000U) {
+    ++container.latency1_10;
+  }
+  else if (elapsed < 50000U) {
+    ++container.latency10_50;
+  }
+  else if (elapsed < 100000U) {
+    ++container.latency50_100;
+  }
+  else if (elapsed < 1000000U) {
+    ++container.latency100_1000;
+  }
+  else {
+    ++container.latencySlow;
+  }
+
+  container.latencySum += elapsed / 1000U;
+  ++container.latencyCount;
+}
+
 }
index 4e85d911b029b1cd560e95b04932f6a8ab3873f2..8442944d9809aa4ca8d0813f993b3cf0e554f292 100644 (file)
@@ -204,27 +204,7 @@ static void doLatencyStats(dnsdist::Protocol protocol, double udiff)
   };
 
   if (protocol == dnsdist::Protocol::DoUDP || protocol == dnsdist::Protocol::DNSCryptUDP) {
-    if (udiff < 1000) {
-      ++dnsdist::metrics::g_stats.latency0_1;
-    }
-    else if (udiff < 10000) {
-      ++dnsdist::metrics::g_stats.latency1_10;
-    }
-    else if (udiff < 50000) {
-      ++dnsdist::metrics::g_stats.latency10_50;
-    }
-    else if (udiff < 100000) {
-      ++dnsdist::metrics::g_stats.latency50_100;
-    }
-    else if (udiff < 1000000) {
-      ++dnsdist::metrics::g_stats.latency100_1000;
-    }
-    else {
-      ++dnsdist::metrics::g_stats.latencySlow;
-    }
-
-    dnsdist::metrics::g_stats.latencySum += static_cast<unsigned long>(udiff) / 1000;
-    ++dnsdist::metrics::g_stats.latencyCount;
+    dnsdist::metrics::updateLatencyHistogram(dnsdist::metrics::g_stats, static_cast<uint64_t>(udiff));
 
     doAvg(dnsdist::metrics::g_stats.latencyAvg100, udiff, 100);
     doAvg(dnsdist::metrics::g_stats.latencyAvg1000, udiff, 1000);