From: Remi Gacogne Date: Wed, 27 Oct 2021 15:59:48 +0000 (+0200) Subject: dnsdist: Add IPv6 UDP error metrics X-Git-Tag: rec-4.6.0-beta1~12^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=84d1d33ab46eeb164ea019ce5c66345915ffb859;p=thirdparty%2Fpdns.git dnsdist: Add IPv6 UDP error metrics --- diff --git a/pdns/dnsdist-web.cc b/pdns/dnsdist-web.cc index 3af31b21dc..5e551076cb 100644 --- a/pdns/dnsdist-web.cc +++ b/pdns/dnsdist-web.cc @@ -153,6 +153,11 @@ const std::map MetricDefinitionStorage::metrics{ { "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") }, + { "udp6-in-errors", MetricDefinition(PrometheusMetricType::counter, "From /proc/net/snmp6 Udp6InErrors") }, + { "udp6-recvbuf-errors", MetricDefinition(PrometheusMetricType::counter, "From /proc/net/snmp6 Udp6RcvbufErrors") }, + { "udp6-sndbuf-errors", MetricDefinition(PrometheusMetricType::counter, "From /proc/net/snmp6 Udp6SndbufErrors") }, + { "udp6-noport-errors", MetricDefinition(PrometheusMetricType::counter, "From /proc/net/snmp6 Udp6NoPorts") }, + { "udp6-in-csum-errors", MetricDefinition(PrometheusMetricType::counter, "From /proc/net/snmp6 Udp6InCsumErrors") }, { "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 c0708d6a0e..4998f12e0c 100644 --- a/pdns/dnsdist.hh +++ b/pdns/dnsdist.hh @@ -406,6 +406,11 @@ struct DNSDistStats {"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")}, + {"udp6-in-errors", std::bind(udp6ErrorStats, "udp6-in-errors")}, + {"udp6-recvbuf-errors", std::bind(udp6ErrorStats, "udp6-recvbuf-errors")}, + {"udp6-sndbuf-errors", std::bind(udp6ErrorStats, "udp6-sndbuf-errors")}, + {"udp6-noport-errors", std::bind(udp6ErrorStats, "udp6-noport-errors")}, + {"udp6-in-csum-errors", std::bind(udp6ErrorStats, "udp6-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 6b4c446212..1779729bf2 100644 --- a/pdns/misc.cc +++ b/pdns/misc.cc @@ -1148,9 +1148,9 @@ uint64_t udpErrorStats(const std::string& str) } string line; - vector parts; while (getline(ifs, line)) { if (boost::starts_with(line, "Udp: ") && isdigit(line.at(5))) { + vector parts; stringtok(parts, line, " \n\t\r"); if (parts.size() < 7) { @@ -1181,6 +1181,47 @@ uint64_t udpErrorStats(const std::string& str) return 0; } +uint64_t udp6ErrorStats(const std::string& str) +{ +#ifdef __linux__ + const std::map keys = { + { "udp6-in-errors", "Udp6InErrors" }, + { "udp6-recvbuf-errors", "Udp6RcvbufErrors" }, + { "udp6-sndbuf-errors", "Udp6SndbufErrors" }, + { "udp6-noport-errors", "Udp6NoPorts" }, + { "udp6-in-csum-errors", "Udp6InCsumErrors" } + }; + + auto key = keys.find(str); + if (key == keys.end()) { + return 0; + } + + ifstream ifs("/proc/net/snmp6"); + if (!ifs) { + return 0; + } + + std::string line; + while (getline(ifs, line)) { + if (!boost::starts_with(line, key->second)) { + continue; + } + + std::vector parts; + parts.clear(); + stringtok(parts, line, " \n\t\r"); + + if (parts.size() != 2) { + return 0; + } + + return std::stoull(parts.at(1)); + } +#endif + return 0; +} + uint64_t tcpErrorStats(const std::string& str) { #ifdef __linux__ diff --git a/pdns/misc.hh b/pdns/misc.hh index 734d019141..f08be7591c 100644 --- a/pdns/misc.hh +++ b/pdns/misc.hh @@ -567,6 +567,7 @@ size_t getPipeBufferSize(int fd); bool setPipeBufferSize(int fd, size_t size); uint64_t udpErrorStats(const std::string& str); +uint64_t udp6ErrorStats(const std::string& str); uint64_t tcpErrorStats(const std::string& str); uint64_t getRealMemoryUsage(const std::string&); uint64_t getSpecialMemoryUsage(const std::string&); diff --git a/regression-tests.dnsdist/test_API.py b/regression-tests.dnsdist/test_API.py index e065d2fae4..98141fdc0d 100644 --- a/regression-tests.dnsdist/test_API.py +++ b/regression-tests.dnsdist/test_API.py @@ -285,6 +285,7 @@ class TestAPIBasics(APITestsBase): '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-csum-errors', 'udp-in-errors', 'udp-noport-errors', 'udp-recvbuf-errors', 'udp-sndbuf-errors', + 'udp6-in-errors', 'udp6-recvbuf-errors', 'udp6-sndbuf-errors', 'udp6-noport-errors', 'udp6-in-csum-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']