]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: add frontend response statistics 7578/head
authorMatti Hiljanen <matti@hiljanen.com>
Thu, 14 Mar 2019 15:20:05 +0000 (17:20 +0200)
committerMatti Hiljanen <matti@hiljanen.com>
Mon, 18 Mar 2019 16:04:05 +0000 (18:04 +0200)
pdns/dnsdist-tcp.cc
pdns/dnsdist.cc
pdns/dnsdist.hh
pdns/dnsdistdist/docs/statistics.rst
regression-tests.dnsdist/test_API.py

index 777865ff162b5f130234964f0f21f6beadc58984..41465e16da06f86033d4e000ae73afd9e2b8140e 100644 (file)
@@ -467,6 +467,17 @@ void tcpClientThread(int pipefd)
 #endif
               handler.writeSizeAndMsg(cachedResponse, cachedResponseSize, g_tcpSendTimeout);
               g_stats.cacheHits++;
+              switch (dr.dh->rcode) {
+              case RCode::NXDomain:
+                ++g_stats.frontendNXDomain;
+                break;
+              case RCode::ServFail:
+                ++g_stats.frontendServFail;
+                break;
+              case RCode::NoError:
+                ++g_stats.frontendNoError;
+                break;
+              }
               continue;
             }
 
@@ -501,6 +512,17 @@ void tcpClientThread(int pipefd)
 #endif
             handler.writeSizeAndMsg(cachedResponse, cachedResponseSize, g_tcpSendTimeout);
             ++g_stats.cacheHits;
+            switch (dr.dh->rcode) {
+            case RCode::NXDomain:
+              ++g_stats.frontendNXDomain;
+              break;
+            case RCode::ServFail:
+              ++g_stats.frontendServFail;
+              break;
+            case RCode::NoError:
+              ++g_stats.frontendNoError;
+              break;
+            }
             continue;
           }
           ++g_stats.cacheMisses;
@@ -711,6 +733,17 @@ void tcpClientThread(int pipefd)
         }
 
         ++g_stats.responses;
+        switch (dr.dh->rcode) {
+        case RCode::NXDomain:
+           ++g_stats.frontendNXDomain;
+           break;
+        case RCode::ServFail:
+          ++g_stats.frontendServFail;
+          break;
+        case RCode::NoError:
+          ++g_stats.frontendNoError;
+          break;
+        }
         struct timespec answertime;
         gettime(&answertime);
         unsigned int udiff = 1000000.0*DiffTime(now,answertime);
index f2dfa39b218c0f3700345d9c20a9ece48c06d811..debcd584932b658f6c767154d0f9c3e717e3a03b 100644 (file)
@@ -567,8 +567,17 @@ try {
         gettime(&ts);
         g_rings.insertResponse(ts, ids->origRemote, ids->qname, ids->qtype, (unsigned int)udiff, (unsigned int)got, *dh, dss->remote);
 
-        if(dh->rcode == RCode::ServFail) {
+        switch (dh->rcode) {
+        case RCode::NXDomain:
+          ++g_stats.frontendNXDomain;
+          break;
+        case RCode::ServFail:
           ++g_stats.servfailResponses;
+          ++g_stats.frontendServFail;
+          break;
+        case RCode::NoError:
+          ++g_stats.frontendNoError;
+          break;
         }
         dss->latencyUsec = (127.0 * dss->latencyUsec / 128.0) + udiff/128.0;
 
@@ -1352,6 +1361,17 @@ static int sendAndEncryptUDPResponse(LocalHolders& holders, ClientState& cs, con
   if (cacheHit) {
     ++g_stats.cacheHits;
   }
+  switch (dr.dh->rcode) {
+  case RCode::NXDomain:
+    ++g_stats.frontendNXDomain;
+    break;
+  case RCode::ServFail:
+    ++g_stats.frontendServFail;
+    break;
+  case RCode::NoError:
+    ++g_stats.frontendNoError;
+    break;
+  }
   doLatencyStats(0);  // we're not going to measure this
   return 0;
 }
index 925d1d0d1d639218a1c44339b06d6abbf72e13a4..b51a42710c9dc1dddb94fda0ee73acfcf0e55013 100644 (file)
@@ -208,6 +208,9 @@ struct DNSDistStats
   stat_t responses{0};
   stat_t servfailResponses{0};
   stat_t queries{0};
+  stat_t frontendNXDomain{0};
+  stat_t frontendServFail{0};
+  stat_t frontendNoError{0};
   stat_t nonCompliantQueries{0};
   stat_t nonCompliantResponses{0};
   stat_t rdQueries{0};
@@ -235,6 +238,9 @@ struct DNSDistStats
     {"responses", &responses},
     {"servfail-responses", &servfailResponses},
     {"queries", &queries},
+    {"frontend-nxdomain", &frontendNXDomain},
+    {"frontend-servfail", &frontendServFail},
+    {"frontend-noerror", &frontendNoError},
     {"acl-drops", &aclDrops},
     {"rule-drop", &ruleDrop},
     {"rule-nxdomain", &ruleNXDomain},
@@ -324,6 +330,9 @@ struct MetricDefinitionStorage {
     { "responses",              MetricDefinition(PrometheusMetricType::counter, "Number of responses received from backends") },
     { "servfail-responses",     MetricDefinition(PrometheusMetricType::counter, "Number of SERVFAIL answers received from backends") },
     { "queries",                MetricDefinition(PrometheusMetricType::counter, "Number of received queries")},
+    { "frontend-nxdomain",      MetricDefinition(PrometheusMetricType::counter, "Number of NXDomain answers sent to clients")},
+    { "frontend-servfail",      MetricDefinition(PrometheusMetricType::counter, "Number of SERVFAIL answers sent to clients")},
+    { "frontend-noerror",       MetricDefinition(PrometheusMetricType::counter, "Number of NoError answers sent to clients")},
     { "acl-drops",              MetricDefinition(PrometheusMetricType::counter, "Number of packets dropped because of the ACL")},
     { "rule-drop",              MetricDefinition(PrometheusMetricType::counter, "Number of queries dropped because of a rule")},
     { "rule-nxdomain",          MetricDefinition(PrometheusMetricType::counter, "Number of NXDomain answers returned because of a rule")},
index a56e9e0fa8d83e663c0dfb6009afa4b92be9d9d9..10f7de4ff1ba49c53c23e7887f9bf64228a9cdc5 100644 (file)
@@ -67,6 +67,18 @@ fd-usage
 --------
 Number of currently used file descriptors.
 
+frontend-noerror
+----------------
+Number of NoError answers sent to clients.
+
+frontend-nxdomain
+-----------------
+Number of NXDomain answers sent to clients.
+
+frontend-servfail
+-----------------
+Number of ServFail answers sent to clients.
+
 latency-avg100
 --------------
 Average response latency in microseconds of the last 100 packets
index 00578a3e779b0fefcad922c0b99a2fcbbceb3cfb..05e13912878da6d00b2e0f0bf0fbdb92ecb3b36a 100644 (file)
@@ -226,6 +226,7 @@ class TestAPIBasics(DNSDistTest):
             values[entry['name']] = entry['value']
 
         expected = ['responses', 'servfail-responses', 'queries', 'acl-drops',
+                    'frontend-noerror', 'frontend-nxdomain', 'frontend-servfail',
                     'rule-drop', 'rule-nxdomain', 'rule-refused', 'self-answered', 'downstream-timeouts',
                     'downstream-send-errors', 'trunc-failures', 'no-policy', 'latency0-1',
                     'latency1-10', 'latency10-50', 'latency50-100', 'latency100-1000',
@@ -255,6 +256,7 @@ class TestAPIBasics(DNSDistTest):
         content = r.json()
 
         expected = ['responses', 'servfail-responses', 'queries', 'acl-drops',
+                    'frontend-noerror', 'frontend-nxdomain', 'frontend-servfail',
                     'rule-drop', 'rule-nxdomain', 'rule-refused', 'self-answered', 'downstream-timeouts',
                     'downstream-send-errors', 'trunc-failures', 'no-policy', 'latency0-1',
                     'latency1-10', 'latency10-50', 'latency50-100', 'latency100-1000',