From: Remi Gacogne Date: Wed, 27 Oct 2021 15:04:59 +0000 (+0200) Subject: dnsdist: Add 'InCsumErrors' UDP metric X-Git-Tag: rec-4.6.0-beta1~12^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=68c3e465c0e14e32763fd826327287cc1ccb7d13;p=thirdparty%2Fpdns.git dnsdist: Add 'InCsumErrors' UDP metric --- diff --git a/pdns/dnsdist-web.cc b/pdns/dnsdist-web.cc index d70d60c92c..3af31b21dc 100644 --- a/pdns/dnsdist-web.cc +++ b/pdns/dnsdist-web.cc @@ -152,6 +152,7 @@ const std::map MetricDefinitionStorage::metrics{ { "udp-noport-errors", MetricDefinition(PrometheusMetricType::counter, "From /proc/net/snmp NoPorts") }, { "udp-recvbuf-errors", MetricDefinition(PrometheusMetricType::counter, "From /proc/net/snmp RcvbufErrors") }, { "udp-sndbuf-errors", MetricDefinition(PrometheusMetricType::counter, "From /proc/net/snmp SndbufErrors") }, + { "udp-csum-errors", MetricDefinition(PrometheusMetricType::counter, "From /proc/net/snmp InCsumErrors") }, { "tcp-listen-overflows", MetricDefinition(PrometheusMetricType::counter, "From /proc/net/netstat ListenOverflows") }, { "proxy-protocol-invalid", MetricDefinition(PrometheusMetricType::counter, "Number of queries dropped because of an invalid Proxy Protocol header") }, }; diff --git a/pdns/dnsdist.hh b/pdns/dnsdist.hh index b27d8c1007..c0708d6a0e 100644 --- a/pdns/dnsdist.hh +++ b/pdns/dnsdist.hh @@ -402,9 +402,10 @@ struct DNSDistStats {"real-memory-usage", getRealMemoryUsage}, {"special-memory-usage", getSpecialMemoryUsage}, {"udp-in-errors", boost::bind(udpErrorStats, "udp-in-errors")}, - {"udp-noport-errors", boost::bind(udpErrorStats, "udp-noport-errors")}, - {"udp-recvbuf-errors", boost::bind(udpErrorStats, "udp-recvbuf-errors")}, - {"udp-sndbuf-errors", boost::bind(udpErrorStats, "udp-sndbuf-errors")}, + {"udp-noport-errors", std::bind(udpErrorStats, "udp-noport-errors")}, + {"udp-recvbuf-errors", std::bind(udpErrorStats, "udp-recvbuf-errors")}, + {"udp-sndbuf-errors", std::bind(udpErrorStats, "udp-sndbuf-errors")}, + {"udp-in-csum-errors", std::bind(udpErrorStats, "udp-in-csum-errors")}, {"tcp-listen-overflows", std::bind(tcpErrorStats, "ListenOverflows")}, {"noncompliant-queries", &nonCompliantQueries}, {"noncompliant-responses", &nonCompliantResponses}, diff --git a/pdns/misc.cc b/pdns/misc.cc index 8fdc84a46c..6b4c446212 100644 --- a/pdns/misc.cc +++ b/pdns/misc.cc @@ -1143,25 +1143,38 @@ uint64_t udpErrorStats(const std::string& str) { #ifdef __linux__ ifstream ifs("/proc/net/snmp"); - if(!ifs) + if (!ifs) { return 0; + } + string line; vector parts; - while(getline(ifs,line)) { - if(boost::starts_with(line, "Udp: ") && isdigit(line[5])) { + while (getline(ifs, line)) { + if (boost::starts_with(line, "Udp: ") && isdigit(line.at(5))) { stringtok(parts, line, " \n\t\r"); - if(parts.size() < 7) + + if (parts.size() < 7) { break; - if(str=="udp-rcvbuf-errors") - return std::stoull(parts[5]); - else if(str=="udp-sndbuf-errors") - return std::stoull(parts[6]); - else if(str=="udp-noport-errors") - return std::stoull(parts[2]); - else if(str=="udp-in-errors") - return std::stoull(parts[3]); - else + } + + if (str == "udp-rcvbuf-errors") { + return std::stoull(parts.at(5)); + } + else if (str == "udp-sndbuf-errors") { + return std::stoull(parts.at(6)); + } + else if (str == "udp-noport-errors") { + return std::stoull(parts.at(2)); + } + else if (str == "udp-in-errors") { + return std::stoull(parts.at(3)); + } + else if (parts.size() >= 8 && str == "udp-in-csum-errors") { + return std::stoull(parts.at(7)); + } + else { return 0; + } } } #endif diff --git a/regression-tests.dnsdist/test_API.py b/regression-tests.dnsdist/test_API.py index 99ed1eb33d..e065d2fae4 100644 --- a/regression-tests.dnsdist/test_API.py +++ b/regression-tests.dnsdist/test_API.py @@ -284,7 +284,7 @@ class TestAPIBasics(APITestsBase): 'noncompliant-responses', 'rdqueries', 'empty-queries', 'cache-hits', 'cache-misses', 'cpu-iowait', 'cpu-steal', 'cpu-sys-msec', 'cpu-user-msec', 'fd-usage', 'dyn-blocked', 'dyn-block-nmg-size', 'rule-servfail', 'rule-truncated', 'security-status', - 'udp-in-errors', 'udp-noport-errors', 'udp-recvbuf-errors', 'udp-sndbuf-errors', + 'udp-in-csum-errors', 'udp-in-errors', 'udp-noport-errors', 'udp-recvbuf-errors', 'udp-sndbuf-errors', 'doh-query-pipe-full', 'doh-response-pipe-full', 'proxy-protocol-invalid', 'tcp-listen-overflows', 'outgoing-doh-query-pipe-full', 'tcp-query-pipe-full', 'tcp-cross-protocol-query-pipe-full', 'tcp-cross-protocol-response-pipe-full']