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)
};
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;
+}
+
}
};
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);