]> granicus.if.org Git - pdns/commitdiff
dnsdist: Add per-frontend and per-server response counters
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 2 Oct 2019 08:38:53 +0000 (10:38 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 2 Oct 2019 08:38:53 +0000 (10:38 +0200)
pdns/dnsdist-carbon.cc
pdns/dnsdist-tcp.cc
pdns/dnsdist-web.cc
pdns/dnsdist.cc
pdns/dnsdist.hh

index f48c9ce61cf9ff856348772a2c3773eee327534b..41fc44f64d4ba4c7f8b7d7b7a0499f326a6c39d9 100644 (file)
@@ -91,6 +91,7 @@ try
           boost::replace_all(serverName, ".", "_");
           const string base = namespace_name + "." + hostname + "." + instance_name + ".servers." + serverName + ".";
           str<<base<<"queries" << ' ' << state->queries.load() << " " << now << "\r\n";
+          str<<base<<"responses" << ' ' << state->responses.load() << " " << now << "\r\n";
           str<<base<<"drops" << ' ' << state->reuseds.load() << " " << now << "\r\n";
           str<<base<<"latency" << ' ' << (state->availability != DownstreamState::Availability::Down ? state->latencyUsec/1000.0 : 0) << " " << now << "\r\n";
           str<<base<<"senderrors" << ' ' << state->sendErrors.load() << " " << now << "\r\n";
@@ -120,6 +121,7 @@ try
 
           const string base = namespace_name + "." + hostname + "." + instance_name + ".frontends." + frontName + ".";
           str<<base<<"queries" << ' ' << front->queries.load() << " " << now << "\r\n";
+          str<<base<<"responses" << ' ' << front->responses.load() << " " << now << "\r\n";
           str<<base<<"tcpdiedreadingquery" << ' '<< front->tcpDiedReadingQuery.load() << " " << now << "\r\n";
           str<<base<<"tcpdiedsendingresponse" << ' '<< front->tcpDiedSendingResponse.load() << " " << now << "\r\n";
           str<<base<<"tcpgaveup" << ' '<< front->tcpGaveUp.load() << " " << now << "\r\n";
index c870b4d6153ccccab1440b89099fd347a71986d8..403fbf601768370e17769bb603f07ae736c72a69 100644 (file)
@@ -763,9 +763,16 @@ static void handleResponse(std::shared_ptr<IncomingTCPConnectionState>& state, s
   if (state->d_isXFR && !state->d_xfrStarted) {
     /* don't bother parsing the content of the response for now */
     state->d_xfrStarted = true;
+    ++g_stats.responses;
+    ++state->d_ci.cs->responses;
+    ++state->d_ds->responses;
   }
 
-  ++g_stats.responses;
+  if (!state->d_isXFR) {
+    ++g_stats.responses;
+    ++state->d_ci.cs->responses;
+    ++state->d_ds->responses;
+  }
 
   sendResponse(state, now);
 }
index eaa0a12bb34133c67b58869fc9d3a1e3e41782f5..c5d4cf343f40081347a4b7bf7e01eb10f02c126c 100644 (file)
@@ -464,6 +464,8 @@ static void connectionThread(int sock, ComboAddress remote)
 
         output << "# HELP " << statesbase << "queries "                << "Amount of queries relayed to server"                               << "\n";
         output << "# TYPE " << statesbase << "queries "                << "counter"                                                           << "\n";
+        output << "# HELP " << statesbase << "responses "              << "Amount of responses received from this server"                     << "\n";
+        output << "# TYPE " << statesbase << "responses "              << "counter"                                                           << "\n";
         output << "# HELP " << statesbase << "drops "                  << "Amount of queries not answered by server"                          << "\n";
         output << "# TYPE " << statesbase << "drops "                  << "counter"                                                           << "\n";
         output << "# HELP " << statesbase << "latency "                << "Server's latency when answering questions in milliseconds"         << "\n";
@@ -507,6 +509,7 @@ static void connectionThread(int sock, ComboAddress remote)
             % serverName % state->remote.toStringWithPort());
 
           output << statesbase << "queries"                << label << " " << state->queries.load()             << "\n";
+          output << statesbase << "responses"              << label << " " << state->responses.load()           << "\n";
           output << statesbase << "drops"                  << label << " " << state->reuseds.load()             << "\n";
           output << statesbase << "latency"                << label << " " << state->latencyUsec/1000.0         << "\n";
           output << statesbase << "senderrors"             << label << " " << state->sendErrors.load()          << "\n";
@@ -526,6 +529,8 @@ static void connectionThread(int sock, ComboAddress remote)
         const string frontsbase = "dnsdist_frontend_";
         output << "# HELP " << frontsbase << "queries " << "Amount of queries received by this frontend" << "\n";
         output << "# TYPE " << frontsbase << "queries " << "counter" << "\n";
+        output << "# HELP " << frontsbase << "responses " << "Amount of responses sent by this frontend" << "\n";
+        output << "# TYPE " << frontsbase << "responses " << "counter" << "\n";
         output << "# HELP " << frontsbase << "tcpdiedreadingquery " << "Amount of TCP connections terminated while reading the query from the client" << "\n";
         output << "# TYPE " << frontsbase << "tcpdiedreadingquery " << "counter" << "\n";
         output << "# HELP " << frontsbase << "tcpdiedsendingresponse " << "Amount of TCP connections terminated while sending a response to the client" << "\n";
@@ -564,6 +569,7 @@ static void connectionThread(int sock, ComboAddress remote)
             % frontName % proto);
 
           output << frontsbase << "queries" << label << front->queries.load() << "\n";
+          output << frontsbase << "responses" << label << front->responses.load() << "\n";
           if (front->isTCP()) {
             output << frontsbase << "tcpdiedreadingquery" << label << front->tcpDiedReadingQuery.load() << "\n";
             output << frontsbase << "tcpdiedsendingresponse" << label << front->tcpDiedSendingResponse.load() << "\n";
@@ -706,6 +712,7 @@ static void connectionThread(int sock, ComboAddress remote)
           {"pools", pools},
           {"latency", (double)(a->latencyUsec/1000.0)},
           {"queries", (double)a->queries},
+          {"responses", (double)a->responses},
           {"sendErrors", (double)a->sendErrors},
           {"tcpDiedSendingQuery", (double)a->tcpDiedSendingQuery},
           {"tcpDiedReadingResponse", (double)a->tcpDiedReadingResponse},
@@ -738,6 +745,7 @@ static void connectionThread(int sock, ComboAddress remote)
           { "tcp", front->tcpFD >= 0 },
           { "type", front->getType() },
           { "queries", (double) front->queries.load() },
+          { "responses", (double) front->responses.load() },
           { "tcpDiedReadingQuery", (double) front->tcpDiedReadingQuery.load() },
           { "tcpDiedSendingResponse", (double) front->tcpDiedSendingResponse.load() },
           { "tcpGaveUp", (double) front->tcpGaveUp.load() },
index 901903e9843b4c2f6cdd1d6babc0220fb433f7d2..1c3f54a62f659a74a8e3f9065e5d00f0009a331b 100644 (file)
@@ -630,6 +630,8 @@ try {
         }
 
         ++g_stats.responses;
+        ++ids->cs->responses;
+        ++dss->responses;
 
         double udiff = ids->sentTime.udiff();
         vinfolog("Got answer from %s, relayed to %s%s, took %f usec", dss->remote.toStringWithPort(), ids->origRemote.toStringWithPort(),
@@ -1442,6 +1444,7 @@ ProcessQueryResult processQuery(DNSQuestion& dq, ClientState& cs, LocalHolders&
       }
 
       ++g_stats.selfAnswered;
+      ++cs.responses;
       return ProcessQueryResult::SendAnswer;
     }
 
index 9419e0eb38cbc634c373cceafcb9bea853012d90..e686335adc266f9a21f73378ef9666e0e3e9114c 100644 (file)
@@ -679,6 +679,7 @@ struct ClientState
   std::shared_ptr<DOHFrontend> dohFrontend{nullptr};
   std::string interface;
   std::atomic<uint64_t> queries{0};
+  mutable std::atomic<uint64_t> responses{0};
   std::atomic<uint64_t> tcpDiedReadingQuery{0};
   std::atomic<uint64_t> tcpDiedSendingResponse{0};
   std::atomic<uint64_t> tcpGaveUp{0};
@@ -858,6 +859,7 @@ struct DownstreamState
   std::atomic<uint64_t> outstanding{0};
   std::atomic<uint64_t> reuseds{0};
   std::atomic<uint64_t> queries{0};
+  std::atomic<uint64_t> responses{0};
   struct {
     std::atomic<uint64_t> sendErrors{0};
     std::atomic<uint64_t> reuseds{0};