]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add IPv6 UDP error metrics
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 27 Oct 2021 15:59:48 +0000 (17:59 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 3 Nov 2021 14:19:01 +0000 (15:19 +0100)
pdns/dnsdist-web.cc
pdns/dnsdist.hh
pdns/misc.cc
pdns/misc.hh
regression-tests.dnsdist/test_API.py

index 3af31b21dc4f96a527efe5d8cf1e4b0a35808928..5e551076cbcce2c7c72edab4f2b0758a15c751b4 100644 (file)
@@ -153,6 +153,11 @@ const std::map<std::string, MetricDefinition> 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") },
 };
index c0708d6a0e6211858128c3759b0759883498a861..4998f12e0c52dbf168291253c9b4742a1eb9832a 100644 (file)
@@ -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},
index 6b4c446212e3fcffe9af4f851c42176e3dbab559..1779729bf29b15d6d5fda066d0c159b110ac0a9e 100644 (file)
@@ -1148,9 +1148,9 @@ uint64_t udpErrorStats(const std::string& str)
   }
 
   string line;
-  vector<string> parts;
   while (getline(ifs, line)) {
     if (boost::starts_with(line, "Udp: ") && isdigit(line.at(5))) {
+      vector<string> 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<std::string, std::string> 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<std::string> 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__
index 734d0191416c83a21a98ef17e8c00582375fe91b..f08be7591c0d67fdb166751f78c54fca8e56a116 100644 (file)
@@ -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&);
index e065d2fae416c475f6ca940dc2eeefa7dc68a2ac..98141fdc0de68fa396e3bc66086025ffc7e06d7d 100644 (file)
@@ -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']