]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
implement various averaged latency stats for dnsdist
authorbert hubert <bert.hubert@netherlabs.nl>
Wed, 13 May 2015 18:05:36 +0000 (20:05 +0200)
committerbert hubert <bert.hubert@netherlabs.nl>
Wed, 13 May 2015 18:05:36 +0000 (20:05 +0200)
pdns/dnsdist-carbon.cc
pdns/dnsdist-web.cc
pdns/dnsdist.cc
pdns/dnsdist.hh

index f94cd3839e28792813ccda52ff3edfb9087fe146..3bdecc1259904325b477c5b14679d5da24971bce 100644 (file)
@@ -42,7 +42,12 @@ try
        boost::replace_all(hostname, ".", "_");
       }
       for(const auto& e : g_stats.entries) {
-       str<<"dnsdist."<<hostname<<".main."<<e.first<<' '<<e.second->load()<<' '<<now<<"\r\n";
+       str<<"dnsdist."<<hostname<<".main."<<e.first<<' ';
+       if(const auto& val = boost::get<DNSDistStats::stat_t*>(&e.second))
+         str<<(*val)->load();
+       else
+         str<<*boost::get<double*>(e.second);
+       str<<' '<<now<<"\r\n";
       }
       const string msg = str.str();
       
index a71f07f571258bb998cc5fb3f6050c961853281a..e9f98c6a863decad681b30ee6d661df254288e97 100644 (file)
@@ -97,7 +97,10 @@ static void connectionThread(int sock, ComboAddress remote, string password)
        { "over-capacity-drops", 0 },
        { "too-old-drops", 0 },
        { "uptime", uptimeOfProcess()},
-       { "qa-latency", (int)g_stats.latency},
+       { "qa-latency", (int)g_stats.latencyAvg1000},
+       { "qa-latency1000", (int)g_stats.latencyAvg1000},
+       { "qa-latency10000", (int)g_stats.latencyAvg10000},
+       { "qa-latency1000000", (int)g_stats.latencyAvg1000000},
        { "something", Json::array { 1, 2, 3 } },
       };
 
index 28a489b521fb4ee45805aaa533e92f50fbdf2fa5..94d7f3fdcab9dc1441dc8411287a3e8bd6c78aa8 100644 (file)
@@ -167,7 +167,14 @@ void* responderThread(std::shared_ptr<DownstreamState> state)
     else if(udiff < 1000000) g_stats.latency100_1000++;
     else g_stats.latencySlow++;
     
-    g_stats.latency = (1023.0*g_stats.latency/1024.0) + udiff/1024.0;
+    auto doAvg = [](double& var, double n, double weight) {
+      var = (weight -1) * var/weight + n/weight;
+    };
+
+    doAvg(g_stats.latencyAvg100,     udiff,     100);
+    doAvg(g_stats.latencyAvg1000,    udiff,    1000);
+    doAvg(g_stats.latencyAvg10000,   udiff,   10000);
+    doAvg(g_stats.latencyAvg1000000, udiff, 1000000);
 
     ids->origFD = -1;
   }
@@ -882,7 +889,6 @@ struct
 int main(int argc, char** argv)
 try
 {
-  g_stats.latency=0;
   rl_attempted_completion_function = my_completion;
   rl_completion_append_character = 0;
 
@@ -970,7 +976,7 @@ try
   if(g_cmdLine.beClient || !g_cmdLine.command.empty()) {
     setupLua(true, g_cmdLine.config);
     doClient(g_serverControl, g_cmdLine.command);
-    exit(EXIT_SUCCESS);
+    _exit(EXIT_SUCCESS);
   }
 
   auto todo=setupLua(false, g_cmdLine.config);
index 4c0840c1dc82f3d15d190d2362ab3bb347c9ea8f..20a3b13310b8b8ed7fcaab1cb9d41b3f8326dc42 100644 (file)
@@ -6,6 +6,7 @@
 #include "dnsname.hh"
 #include <atomic>
 #include <boost/circular_buffer.hpp>
+#include <boost/variant.hpp>
 #include <mutex>
 #include <thread>
 #include "sholder.hh"
@@ -27,8 +28,9 @@ struct DNSDistStats
   stat_t noPolicy{0};
   stat_t latency0_1{0}, latency1_10{0}, latency10_50{0}, latency50_100{0}, latency100_1000{0}, latencySlow{0};
   
-  double latency{0};
-  std::vector<std::pair<std::string, stat_t*>> entries{
+  double latencyAvg100{0}, latencyAvg1000{0}, latencyAvg10000{0}, latencyAvg1000000{0};
+  typedef boost::variant<stat_t*, double*> entry_t;
+  std::vector<std::pair<std::string, entry_t>> entries{
     {"responses", &responses}, {"servfail-responses", &servfailResponses},
     {"queries", &queries}, {"acl-drops", &aclDrops},
     {"block-filter", &blockFilter}, {"rule-drop", &ruleDrop},
@@ -37,10 +39,13 @@ struct DNSDistStats
     {"trunc-failures", &truncFail}, {"no-policy", &noPolicy},
     {"latency0-1", &latency0_1}, {"latency1-10", &latency1_10},
     {"latency10-50", &latency10_50}, {"latency50-100", &latency50_100}, 
-    {"latency100-1000", &latency100_1000}, {"latency-slow", &latencySlow}
+    {"latency100-1000", &latency100_1000}, {"latency-slow", &latencySlow},
+    {"latency-avg100", &latencyAvg100}, {"latency-avg1000", &latencyAvg1000}, 
+    {"latency-avg10000", &latencyAvg10000}, {"latency-avg1000000", &latencyAvg1000000}
   };
 };
 
+
 extern struct DNSDistStats g_stats;