]> granicus.if.org Git - pdns/commitdiff
Add per-frontend stats to dnsdist
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 2 Dec 2015 15:27:40 +0000 (16:27 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 2 Dec 2015 16:47:01 +0000 (17:47 +0100)
For now, we only display the number of queries received for each
frontend, separating TCP and UDP.

pdns/dnsdist-carbon.cc
pdns/dnsdist-tcp.cc
pdns/dnsdist.cc
pdns/dnsdist.hh

index e88dbc71b8b69cf40a2458347e4dbe0285cf3aed..a5130ec151f424cb8fd6f642e61593be7d9d4731 100644 (file)
@@ -67,6 +67,15 @@ try
         str<<base<<"senderrors" << ' ' << s->sendErrors.load() << " " << now << "\r\n";
         str<<base<<"outstanding" << ' ' << s->outstanding.load() << " " << now << "\r\n";
       }
+      for(const auto& front : g_frontends) {
+        if (front->udpFD == -1 && front->tcpFD == -1)
+          continue;
+
+        string frontName = front->local.toStringWithPort() + (front->udpFD >= 0 ? "_udp" : "_tcp");
+        boost::replace_all(frontName, ".", "_");
+        const string base = "dnsdist." + hostname + ".main.frontends." + frontName + ".";
+        str<<base<<"queries" << ' ' << front->queries.load() << " " << now << "\r\n";
+      }
       const string msg = str.str();
 
       int ret = waitForRWData(s.getHandle(), false, 1 , 0); 
index 7a93ba7d8360ffb8c971b8b689e2db8b44119299..a7ecd212476b6d06360935b1dccae91c6ed61d7e 100644 (file)
@@ -341,6 +341,9 @@ void* tcpAcceptorThread(void* p)
       ci = new ConnectionInfo;
       ci->fd = -1;
       ci->fd = SAccept(cs->tcpFD, remote);
+
+      g_stats.queries++;
+      cs->queries++;
       
       if(!acl->match(remote)) {
        g_stats.aclDrops++;
index 5f78dceda22f29a30c126e297c70cafb9fe35780..0e3f2f3d224f105e53e9b2c25139a349b74aa9e7 100644 (file)
@@ -64,6 +64,7 @@ bool g_console;
 GlobalStateHolder<NetmaskGroup> g_ACL;
 string g_outputBuffer;
 vector<std::pair<ComboAddress, bool>> g_locals;
+vector<ClientState *> g_frontends;
 
 /* UDP: the grand design. Per socket we listen on for incoming queries there is one thread.
    Then we have a bunch of connected sockets for talking to downstream servers. 
@@ -441,6 +442,9 @@ try
     try {
       len = recvmsg(cs->udpFD, &msgh, 0);
 
+      cs->queries++;
+      g_stats.queries++;
+
       if(len < (int)sizeof(struct dnsheader)) {
        g_stats.nonCompliantQueries++;
        continue;
@@ -453,7 +457,6 @@ try
         continue;
       }
 
-      g_stats.queries++;
       if(!acl->match(remote)) {
        vinfolog("Query from %s dropped because of ACL", remote.toStringWithPort());
        g_stats.aclDrops++;
@@ -1272,14 +1275,15 @@ try
 
     SBind(cs->udpFD, cs->local);    
     toLaunch.push_back(cs);
+    g_frontends.push_back(cs);
   }
 
   for(const auto& local : g_locals) {
-    ClientState* cs = new ClientState;
     if(!local.second) { // no TCP/IP
       warnlog("Not providing TCP/IP service on local address '%s'", local.first.toStringWithPort());
       continue;
     }
+    ClientState* cs = new ClientState;
     cs->local= local.first;
 
     cs->tcpFD = SSocket(cs->local.sin4.sin_family, SOCK_STREAM, 0);
@@ -1298,6 +1302,7 @@ try
     warnlog("Listening on %s",cs->local.toStringWithPort());
 
     toLaunch.push_back(cs);
+    g_frontends.push_back(cs);
   }
 
   uid_t newgid=0;
index a778dd58d8ea702db6e92f1d61a43740e5d99af3..6a78c35b4bae0b82b5cfcf1704a22f13824ba271 100644 (file)
@@ -217,6 +217,7 @@ extern Rings g_rings;
 struct ClientState
 {
   ComboAddress local;
+  std::atomic<uint64_t> queries{0};
   int udpFD{-1};
   int tcpFD{-1};
 };
@@ -355,6 +356,7 @@ extern GlobalStateHolder<NetmaskGroup> g_ACL;
 extern ComboAddress g_serverControl; // not changed during runtime
 
 extern std::vector<std::pair<ComboAddress, bool>> g_locals; // not changed at runtime (we hope XXX)
+extern vector<ClientState*> g_frontends;
 extern std::string g_key; // in theory needs locking
 extern bool g_truncateTC;
 extern int g_tcpRecvTimeout;