]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Deduplicate frontends entries with carbon and prometheus
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 14 Jun 2019 14:58:43 +0000 (16:58 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 14 Jun 2019 14:58:43 +0000 (16:58 +0200)
pdns/dnsdist-carbon.cc
pdns/dnsdist-web.cc

index 14b72e048e676645c7aa47c339bbd16ea494f2cf..b0b2997c2a8d6b139a720e0e5920d1b13505caee 100644 (file)
@@ -104,12 +104,20 @@ try
           str<<base<<"tcpavgqueriesperconnection" << ' '<< state->tcpAvgQueriesPerConnection.load() << " " << now << "\r\n";
           str<<base<<"tcpavgconnectionduration" << ' '<< state->tcpAvgConnectionDuration.load() << " " << now << "\r\n";
         }
+
+        std::map<std::string,uint64_t> frontendDuplicates;
         for(const auto& front : g_frontends) {
           if (front->udpFD == -1 && front->tcpFD == -1)
             continue;
 
           string frontName = front->local.toString() + ":" + std::to_string(front->local.getPort()) +  (front->udpFD >= 0 ? "_udp" : "_tcp");
           boost::replace_all(frontName, ".", "_");
+          auto dupPair = frontendDuplicates.insert({frontName, 1});
+          if (dupPair.second == false) {
+            frontName = frontName + "_" + std::to_string(dupPair.first->second);
+            ++dupPair.first->second;
+          }
+
           const string base = namespace_name + "." + hostname + "." + instance_name + ".frontends." + frontName + ".";
           str<<base<<"queries" << ' ' << front->queries.load() << " " << now << "\r\n";
           str<<base<<"tcpdiedreadingquery" << ' '<< front->tcpDiedReadingQuery.load() << " " << now << "\r\n";
@@ -121,6 +129,7 @@ try
           str<<base<<"tcpavgqueriesperconnection" << ' '<< front->tcpAvgQueriesPerConnection.load() << " " << now << "\r\n";
           str<<base<<"tcpavgconnectionduration" << ' '<< front->tcpAvgConnectionDuration.load() << " " << now << "\r\n";
         }
+
         auto localPools = g_pools.getLocal();
         for (const auto& entry : *localPools) {
           string poolName = entry.first;
@@ -148,6 +157,7 @@ try
 
 #ifdef HAVE_DNS_OVER_HTTPS
         {
+          std::map<std::string,uint64_t> dohFrontendDuplicates;
           const string base = "dnsdist." + hostname + ".main.doh.";
           for(const auto& doh : g_dohlocals) {
             string name = doh->d_local.toStringWithPort();
@@ -156,6 +166,12 @@ try
             boost::replace_all(name, "[", "_");
             boost::replace_all(name, "]", "_");
 
+            auto dupPair = dohFrontendDuplicates.insert({name, 1});
+            if (dupPair.second == false) {
+              name = name + "_" + std::to_string(dupPair.first->second);
+              ++dupPair.first->second;
+            }
+
             vector<pair<const char*, const std::atomic<uint64_t>&>> v{
               {"http-connects", doh->d_httpconnects},
               {"http1-queries", doh->d_http1queries},
index b9faa558374723b6f7ea69fe81643f8d628d3211..f0ff9602cf05f499125a47ba2925d35ef883283b 100644 (file)
@@ -523,12 +523,19 @@ static void connectionThread(int sock, ComboAddress remote)
           output << statesbase << "tcpavgconnduration"     << label << " " << state->tcpAvgConnectionDuration   << "\n";
         }
 
+        std::map<std::string,uint64_t> frontendDuplicates;
         for (const auto& front : g_frontends) {
           if (front->udpFD == -1 && front->tcpFD == -1)
             continue;
 
           string frontName = front->local.toString() + ":" + std::to_string(front->local.getPort());
           string proto = (front->udpFD >= 0 ? "udp" : "tcp");
+          string fullName = frontName + "_" + proto;
+          auto dupPair = frontendDuplicates.insert({fullName, 1});
+          if (dupPair.second == false) {
+            frontName = frontName + "_" + std::to_string(dupPair.first->second);
+            ++dupPair.first->second;
+          }
 
           output << "dnsdist_frontend_queries{frontend=\"" << frontName << "\",proto=\"" << proto
               << "\"} " << front->queries.load() << "\n";