]> granicus.if.org Git - pdns/commitdiff
dnsdist: Add support for multiple carbon servers
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 2 Mar 2016 16:55:45 +0000 (17:55 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 2 Mar 2016 16:55:45 +0000 (17:55 +0100)
pdns/dnsdist-carbon.cc
pdns/dnsdist-lua.cc
pdns/dnsdist.hh

index ca6274eb24c95b73eeb33f803db3bda37ac39319..1702c61097a4e165f6dd142672153c5f733adebb 100644 (file)
@@ -21,77 +21,77 @@ try
 {
   auto localCarbon = g_carbon.getLocal();
   for(int numloops=0;;++numloops) {
-    if(localCarbon->server == ComboAddress("0.0.0.0", 0)) {
+    if(localCarbon->servers.empty()) {
       sleep(1);
       continue;
     }
     if(numloops) 
       sleep(localCarbon->interval);
 
-    try {
-      Socket s(localCarbon->server.sin4.sin_family, SOCK_STREAM);
-      
-      s.setNonBlocking();
-      s.connect(localCarbon->server);  // we do the connect so the attempt happens while we gather stats
-      
-      ostringstream str;
-      time_t now=time(0);
-      string hostname=localCarbon->ourname;
-      if(hostname.empty()) {
-       char tmp[80];
-       memset(tmp, 0, sizeof(tmp));
-       gethostname(tmp, sizeof(tmp));
-       char *p = strchr(tmp, '.');
-       if(p) *p=0;
-       hostname=tmp;
-       boost::replace_all(hostname, ".", "_");
-      }
-      for(const auto& e : g_stats.entries) {
-       str<<"dnsdist."<<hostname<<".main."<<e.first<<' ';
-       if(const auto& val = boost::get<DNSDistStats::stat_t*>(&e.second))
-         str<<(*val)->load();
-       else if (const auto& val = boost::get<double*>(&e.second))
-         str<<**val;
-       else
-         str<<(*boost::get<DNSDistStats::statfunction_t>(&e.second))(e.first);
-       str<<' '<<now<<"\r\n";
-      }
-      const auto states = g_dstates.getCopy();
-      for(const auto& s : states) {
-        string serverName = s->getName();
-        boost::replace_all(serverName, ".", "_");
-        const string base = "dnsdist." + hostname + ".main.servers." + serverName + ".";
-        str<<base<<"queries" << ' ' << s->queries.load() << " " << now << "\r\n";
-        str<<base<<"drops" << ' ' << s->reuseds.load() << " " << now << "\r\n";
-        str<<base<<"latency" << ' ' << s->latencyUsec/1000.0 << " " << now << "\r\n";
-        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 hostname=localCarbon->ourname;
+    if(hostname.empty()) {
+      char tmp[80];
+      memset(tmp, 0, sizeof(tmp));
+      gethostname(tmp, sizeof(tmp));
+      char *p = strchr(tmp, '.');
+      if(p) *p=0;
+      hostname=tmp;
+      boost::replace_all(hostname, ".", "_");
+    }
+    for (auto server : localCarbon->servers) {
+      try {
+        Socket s(server.sin4.sin_family, SOCK_STREAM);
+        s.setNonBlocking();
+        s.connect(server);  // we do the connect so the attempt happens while we gather stats
+        ostringstream str;
+        time_t now=time(0);
+        for(const auto& e : g_stats.entries) {
+          str<<"dnsdist."<<hostname<<".main."<<e.first<<' ';
+          if(const auto& val = boost::get<DNSDistStats::stat_t*>(&e.second))
+            str<<(*val)->load();
+          else if (const auto& val = boost::get<double*>(&e.second))
+            str<<**val;
+          else
+            str<<(*boost::get<DNSDistStats::statfunction_t>(&e.second))(e.first);
+          str<<' '<<now<<"\r\n";
+        }
+        const auto states = g_dstates.getCopy();
+        for(const auto& s : states) {
+          string serverName = s->getName();
+          boost::replace_all(serverName, ".", "_");
+          const string base = "dnsdist." + hostname + ".main.servers." + serverName + ".";
+          str<<base<<"queries" << ' ' << s->queries.load() << " " << now << "\r\n";
+          str<<base<<"drops" << ' ' << s->reuseds.load() << " " << now << "\r\n";
+          str<<base<<"latency" << ' ' << s->latencyUsec/1000.0 << " " << now << "\r\n";
+          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();
+          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); 
-      if(ret <= 0 ) {
-       vinfolog("Unable to write data to carbon server on %s: %s", localCarbon->server.toStringWithPort(), (ret<0 ? strerror(errno) : "Timeout"));
-       continue;
+        int ret = waitForRWData(s.getHandle(), false, 1 , 0);
+        if(ret <= 0 ) {
+          vinfolog("Unable to write data to carbon server on %s: %s", server.toStringWithPort(), (ret<0 ? strerror(errno) : "Timeout"));
+          continue;
+        }
+        s.setBlocking();
+        ret=writen2(s.getHandle(), msg.c_str(), msg.size());
+        if(ret < 0)
+          warnlog("Error writing carbon data to %s: %s", server.toStringWithPort(), strerror(errno));
+        if(ret==0)
+          warnlog("EOF writing carbon data to %s", server.toStringWithPort());
+      }
+      catch(std::exception& e) {
+        warnlog("Problem sending carbon data: %s", e.what());
       }
-      s.setBlocking();
-      ret=writen2(s.getHandle(), msg.c_str(), msg.size());
-      if(ret < 0)
-       warnlog("Error writing carbon data to %s: %s", localCarbon->server.toStringWithPort(), strerror(errno));
-      if(ret==0)
-       warnlog("EOF writing carbon data to %s", localCarbon->server.toStringWithPort());
-    }
-    catch(std::exception& e) {
-      warnlog("Problem sending carbon data: %s", e.what());
     }
   }
   return 0;
index 13fa1b9d3af9bb1dcf28c3e0b739e8b94b362ec9..b7f5a6b998e009dfd7e2ae42eba4e2dd5f680c37 100644 (file)
@@ -985,7 +985,7 @@ vector<std::function<void(void)>> setupLua(bool client, const std::string& confi
                                         boost::optional<int> interval) {
                         setLuaSideEffect();
                        auto ours = g_carbon.getCopy();
-                       ours.server=ComboAddress(address, 2003);
+                       ours.servers.push_back(ComboAddress(address, 2003));
                        if(ourName)
                          ours.ourname=*ourName;
                        if(interval)
index 0d5b8f7ab8f746dc64cfef2e0249653f84a2d77a..d1c50f326e5a4ba216581b932f1df34adc89e5db 100644 (file)
@@ -432,7 +432,7 @@ void removeServerFromPool(pools_t& pools, const string& poolName, std::shared_pt
 
 struct CarbonConfig
 {
-  ComboAddress server{"0.0.0.0", 0};
+  vector<ComboAddress> servers;
   std::string ourname;
   unsigned int interval{30};
 };