]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add a metric for TCP listen queue full events 10184/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 17 Mar 2021 10:19:27 +0000 (11:19 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 17 Mar 2021 10:22:34 +0000 (11:22 +0100)
pdns/dnsdist-web.cc
pdns/dnsdist.hh
pdns/dnsdistdist/docs/statistics.rst
pdns/misc.cc
pdns/misc.hh
regression-tests.dnsdist/test_API.py

index eec18b202273f2381ca3f3226c70395116a3330b..096b5cabf8b4a3ad6a54511ae5303cbd12411fa1 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") },
+  { "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 0c00d2c831813a83b4ff949159dc686faba00765..e101d0815b0888a5b74a12be64aceb95e16ace25 100644 (file)
@@ -369,6 +369,7 @@ struct DNSDistStats
     {"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")},
+    {"tcp-listen-overflows", std::bind(tcpErrorStats, "ListenOverflows")},
     {"noncompliant-queries", &nonCompliantQueries},
     {"noncompliant-responses", &nonCompliantResponses},
     {"proxy-protocol-invalid", &proxyProtocolInvalid},
index b1246e47c0ec47f9b6c996594e9d7366980f831c..194fdc8ce40e4e767178255ca934095b3c76a38b 100644 (file)
@@ -227,6 +227,12 @@ servfail-responses
 ------------------
 Number of servfail answers received from backends.
 
+tcp-listen-overflows
+--------------------
+.. versionadded:: 1.6.0
+
+From /proc/net/netstat ListenOverflows.
+
 trunc-failures
 --------------
 Number of errors encountered while truncating an answer.
index de9e003eb9b725a2714be5cdd6f5e94dbe742219..cd8725e8a093f8fe3f2a963e03ed54ab93bed608 100644 (file)
@@ -1147,6 +1147,31 @@ uint64_t udpErrorStats(const std::string& str)
   return 0;
 }
 
+uint64_t tcpErrorStats(const std::string& str)
+{
+#ifdef __linux__
+  ifstream ifs("/proc/net/netstat");
+  if (!ifs) {
+    return 0;
+  }
+
+  string line;
+  vector<string> parts;
+  while (getline(ifs,line)) {
+    if (line.size() > 9 && boost::starts_with(line, "TcpExt: ") && isdigit(line.at(8))) {
+      stringtok(parts, line, " \n\t\r");
+
+      if (parts.size() < 21) {
+        break;
+      }
+
+      return std::stoull(parts.at(20));
+    }
+  }
+#endif
+  return 0;
+}
+
 uint64_t getCPUIOWait(const std::string& str)
 {
 #ifdef __linux__
index 3ee14f8ad782771bee9aae4d1d174946de40562f..83ca2178dddf0078baa37228c6b631e0a280a4ae 100644 (file)
@@ -561,6 +561,7 @@ size_t getPipeBufferSize(int fd);
 bool setPipeBufferSize(int fd, size_t size);
 
 uint64_t udpErrorStats(const std::string& str);
+uint64_t tcpErrorStats(const std::string& str);
 uint64_t getRealMemoryUsage(const std::string&);
 uint64_t getSpecialMemoryUsage(const std::string&);
 uint64_t getOpenFileDescriptors(const std::string&);
index 461dc554f6a0aeb58552b61842273b97c74d7386..90693dacf18892eedf772264b0c872ce563d416f 100644 (file)
@@ -240,7 +240,7 @@ class TestAPIBasics(DNSDistTest):
                     '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',
-                    'doh-query-pipe-full', 'doh-response-pipe-full', 'proxy-protocol-invalid']
+                    'doh-query-pipe-full', 'doh-response-pipe-full', 'proxy-protocol-invalid', 'tcp-listen-overflows']
 
         for key in expected:
             self.assertIn(key, values)