]> granicus.if.org Git - pdns/commitdiff
Centralize response statistics gathering
authorPieter Lexis <pieter.lexis@powerdns.com>
Wed, 15 Jul 2015 10:21:36 +0000 (12:21 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Wed, 15 Jul 2015 14:06:27 +0000 (16:06 +0200)
* Add `tcp-answers-bytes` counter
* Update documentation
* Add newly needed files to recursor distribution

Closes #2576
Closes #1412 (or was already fixed)

build-scripts/dist-recursor
docs/markdown/authoritative/performance.md
pdns/Makefile.am
pdns/common_startup.cc
pdns/nameserver.cc
pdns/pdns_recursor.cc
pdns/responsestats-auth.cc [new file with mode: 0644]
pdns/responsestats.cc
pdns/responsestats.hh
pdns/tcpreceiver.cc

index dc61002667ca3e7834fe2255cebcb37c0c05791b..c5b5aae7da49c258fb44af1c9004eb426eb37384 100755 (executable)
@@ -35,7 +35,7 @@ mplexer.hh pubsuffix.hh \
 dns_random.hh lua-pdns.hh lua-recursor.hh namespaces.hh \
 recpacketcache.hh base32.hh cachecleaner.hh json.hh version.hh \
 ws-recursor.hh ws-api.hh secpoll-recursor.hh \
-responsestats.hh webserver.hh dnsname.hh"
+responsestats.hh webserver.hh dnsname.hh dnspacket.hh ednssubnet.hh"
 
 CFILES="syncres.cc iputils.cc  misc.cc unix_utility.cc qtype.cc \
 logger.cc arguments.cc  lwres.cc pdns_recursor.cc lua-iputils.cc \
index 557dff9b6a12922fea07c794094346485fdfa21c..804db53d17860ec0984cb8462e85740e2efc6fe2 100644 (file)
@@ -73,11 +73,16 @@ daemon.
 * `signatures`: Number of DNSSEC signatures created
 * `sys-msec`: Number of CPU miliseconds sent in system time
 * `tcp-answers`: Number of answers sent out over TCP
-* `tcp-questions`: Number of questions received over TCP
+* `tcp-answers-bytes`: Total number of answer bytes sent over TCP (since 4.0.0)
+* `tcp-queries`: Number of questions received over TCP
+* `tcp4-answers`: Number of answers sent out over TCPv4
+* `tcp4-queries`: Number of questions received over TCPv4
+* `tcp6-answers`: Number of answers sent out over TCPv6
+* `tcp6-queries`: Number of questions received over TCPv6
 * `timedout-questions`: Amount of packets that were dropped because they had to wait too long internally
 * `udp-answers`: Number of answers sent out over UDP
-* `udp-queries`: Number of questions received over UDP
 * `udp-answers-bytes`: Total number of answer bytes sent over UDP
+* `udp-queries`: Number of questions received over UDP
 * `udp-do-queries`: Number of queries received with the DO (DNSSEC OK) bit set
 * `udp-in-errors`: Number of packets, received faster than the OS could process them
 * `udp-noport-errors`: Number of UDP packets where an ICMP response was received that the remote port was not listening
index 49acfc01414977f70f5a25d5a1f73ed340d012be..8bdf2a9049e905b33a0606abb7e6bd2e60decede 100644 (file)
@@ -177,7 +177,7 @@ pdns_server_SOURCES = \
        rcpgenerator.cc \
        receiver.cc \
        resolver.cc resolver.hh \
-       responsestats.cc responsestats.hh \
+       responsestats.cc responsestats.hh responsestats-auth.cc \
        rfc2136handler.cc \
        secpoll-auth.cc secpoll-auth.hh \
        serialtweaker.cc \
index 1894bcf36ec67ac4db843e7164532c3d1b4b980e..fb0ade2fb01a17d6c3b8e5c8d3726e8d12c05bb0 100644 (file)
@@ -241,6 +241,7 @@ void declareStats(void)
   S.declare("signatures", "Number of DNSSEC signatures made");
   S.declare("tcp-queries","Number of TCP queries received");
   S.declare("tcp-answers","Number of answers sent out over TCP");
+  S.declare("tcp-answers-bytes","Total size of answers sent out over TCP");
   S.declare("tcp4-queries","Number of IPv4 TCP queries received");
   S.declare("tcp4-answers","Number of IPv4 answers sent out over TCP");
   
index 6a6819392ff110d2bc5d08751533c1b7eee7c8d7..c5539af22c7eb888b830cd54bbc7684882f42039 100644 (file)
@@ -275,39 +275,15 @@ UDPNameserver::UDPNameserver( bool additional_socket )
     L<<Logger::Critical<<"PDNS is deaf and mute! Not listening on any interfaces"<<endl;    
 }
 
-ResponseStats g_rs;
-
 void UDPNameserver::send(DNSPacket *p)
 {
-  const string& buffer=p->getString();
-  static AtomicCounter &numanswered=*S.getPointer("udp-answers");
-  static AtomicCounter &numanswered4=*S.getPointer("udp4-answers");
-  static AtomicCounter &numanswered6=*S.getPointer("udp6-answers");
-  static AtomicCounter &bytesanswered=*S.getPointer("udp-answers-bytes");
-
-  g_rs.submitResponse(p->qtype.getCode(), buffer.length(), true);
+  string buffer=p->getString();
+  g_rs.submitResponse(*p, true);
 
   struct msghdr msgh;
   struct iovec iov;
   char cbuf[256];
 
-  /* Query statistics */
-  if(p->d.aa) {
-    if (p->d.rcode==RCode::NXDomain)
-      S.ringAccount("nxdomain-queries",p->qdomain.toString()+"/"+p->qtype.getName());
-  } else if (p->isEmpty()) {
-    S.ringAccount("unauth-queries",p->qdomain.toString()+"/"+p->qtype.getName());
-    S.ringAccount("remotes-unauth",p->d_remote);
-  }
-
-  /* Count responses (total/v4/v6) and byte counts */
-  numanswered++;
-  bytesanswered+=buffer.length();
-  if(p->d_remote.sin4.sin_family==AF_INET)
-    numanswered4++;
-  else
-    numanswered6++;
-
   fillMSGHdr(&msgh, &iov, cbuf, 0, (char*)buffer.c_str(), buffer.length(), &p->d_remote);
 
   if(p->d_anyLocal) {
index fabc2f88c18bec497657c901843be12c6c5efe96..232736a3eec8d975cadae6b6fee553902b8e0d7b 100644 (file)
@@ -520,8 +520,6 @@ void updateResponseStats(int res, const ComboAddress& remote, unsigned int packe
   }
 }
 
-ResponseStats g_rs;
-
 static string makeLoginfo(DNSComboWriter* dc)
 try
 {
diff --git a/pdns/responsestats-auth.cc b/pdns/responsestats-auth.cc
new file mode 100644 (file)
index 0000000..f4180a9
--- /dev/null
@@ -0,0 +1,46 @@
+#include "responsestats.hh"
+#include "dnspacket.hh"
+#include "statbag.hh"
+
+extern StatBag S;
+/**
+ *  Function that creates all the stats
+ *  when udpOrTCP is true, it is udp
+ */
+void ResponseStats::submitResponse(DNSPacket &p, bool udpOrTCP) {
+  const string& buf=p.getString();
+  static AtomicCounter &udpnumanswered=*S.getPointer("udp-answers");
+  static AtomicCounter &udpnumanswered4=*S.getPointer("udp4-answers");
+  static AtomicCounter &udpnumanswered6=*S.getPointer("udp6-answers");
+  static AtomicCounter &udpbytesanswered=*S.getPointer("udp-answers-bytes");
+  static AtomicCounter &tcpnumanswered=*S.getPointer("tcp-answers");
+  static AtomicCounter &tcpnumanswered4=*S.getPointer("tcp4-answers");
+  static AtomicCounter &tcpnumanswered6=*S.getPointer("tcp6-answers");
+  static AtomicCounter &tcpbytesanswered=*S.getPointer("tcp-answers-bytes");
+
+  if(p.d.aa) {
+    if (p.d.rcode==RCode::NXDomain)
+      S.ringAccount("nxdomain-queries",p.qdomain.toString()+"/"+p.qtype.getName());
+  } else if (p.isEmpty()) {
+    S.ringAccount("unauth-queries",p.qdomain.toString()+"/"+p.qtype.getName());
+    S.ringAccount("remotes-unauth",p.d_remote);
+  }
+
+  if (udpOrTCP) { // udp
+    udpnumanswered++;
+    udpbytesanswered+=buf.length();
+    if(p.d_remote.sin4.sin_family==AF_INET)
+      udpnumanswered4++;
+    else
+      udpnumanswered6++;
+  } else { //tcp
+    tcpnumanswered++;
+    tcpbytesanswered+=buf.length();
+    if(p.d_remote.sin4.sin_family==AF_INET)
+      tcpnumanswered4++;
+    else
+      tcpnumanswered6++;
+  }
+
+  submitResponse(p.qtype.getCode(), buf.length(), udpOrTCP);
+}
index ff4168da399f28baafb80276616875b6c1bed173..45eaad0d82a506c4c869746aa63745e94a9cb30a 100644 (file)
@@ -22,6 +22,8 @@ ResponseStats::ResponseStats()
   d_sizecounters.push_back(make_pair(std::numeric_limits<uint16_t>::max(),0));
 }
 
+ResponseStats g_rs = ResponseStats();
+
 static bool pcomp(const pair<uint16_t, uint64_t>&a , const pair<uint16_t, uint64_t>&b)
 {
   return a.first < b.first;
index 45fe23225aa012c0d14702f1036641a68923c242..dfb04a86ca3dd0d14ba7cff1c9a5ff3977b16376 100644 (file)
@@ -1,12 +1,13 @@
-#ifndef PDNS_RESPONSESTATS_HH
-#define PDNS_RESPONSESTATS_HH
+#pragma once
 #include "misc.hh"
+#include "dnspacket.hh"
 
 class ResponseStats
 {
 public:
   ResponseStats();
 
+  void submitResponse(DNSPacket &p, bool udpOrTCP);
   void submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP);
   map<uint16_t, uint64_t> getQTypeResponseCounts();
   map<uint16_t, uint64_t> getSizeResponseCounts();
@@ -18,4 +19,4 @@ private:
   sizecounters_t d_sizecounters;
 };
 
-#endif
+extern ResponseStats g_rs;
index 5d25068b0951a723c5573e3402fa37e3c2a26d14..bb141f830af7a8ba4d73a49b3a7ec3ddfbcc69b1 100644 (file)
@@ -179,17 +179,7 @@ void connectWithTimeout(int fd, struct sockaddr* remote, size_t socklen)
 
 void TCPNameserver::sendPacket(shared_ptr<DNSPacket> p, int outsock)
 {
-
-  /* Query statistics */
-  if(p->qtype.getCode()!=QType::AXFR && p->qtype.getCode()!=QType::IXFR) {
-    if(p->d.aa) {
-      if(p->d.rcode==RCode::NXDomain)
-        S.ringAccount("nxdomain-queries",p->qdomain.toString()+"/"+p->qtype.getName());
-    } else if(p->isEmpty()) {
-      S.ringAccount("unauth-queries",p->qdomain.toString()+"/"+p->qtype.getName());
-      S.ringAccount("remotes-unauth",p->d_remote);
-    }
-  }
+  g_rs.submitResponse(*p, false);
 
   uint16_t len=htons(p->getString().length());
   string buffer((const char*)&len, 2);
@@ -347,8 +337,6 @@ void *TCPNameserver::doConnection(void *data)
         if(LPE) LPE->police(&(*packet), &(*cached), true);
 
         sendPacket(cached, fd); // presigned, don't do it again
-        incTCPAnswerCount(remote);
-
         continue;
       }
       if(logDNSQueries)
@@ -373,8 +361,7 @@ void *TCPNameserver::doConnection(void *data)
 
       if(!reply)  // unable to write an answer?
         break;
-        
-      incTCPAnswerCount(remote);
+
       sendPacket(reply, fd);
     }
   }