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

index d70d60c92c862507b248e03e9f7c0b94b77e41aa..3af31b21dc4f96a527efe5d8cf1e4b0a35808928 100644 (file)
@@ -152,6 +152,7 @@ const std::map<std::string, MetricDefinition> 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") },
 };
index b27d8c1007c4af8c4b8c7ebdca6bba13a82a12a0..c0708d6a0e6211858128c3759b0759883498a861 100644 (file)
@@ -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},
index 8fdc84a46c33543d529a1f2091b451395502f701..6b4c446212e3fcffe9af4f851c42176e3dbab559 100644 (file)
@@ -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<string> 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
index 99ed1eb33d7f4ae4688052522001feecbc344243..e065d2fae416c475f6ca940dc2eeefa7dc68a2ac 100644 (file)
@@ -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']