]> granicus.if.org Git - pdns/commitdiff
add per query latency accounting. WARNING: DTime from now on does implicit set()...
authorBert Hubert <bert.hubert@netherlabs.nl>
Sun, 19 Mar 2006 19:57:15 +0000 (19:57 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Sun, 19 Mar 2006 19:57:15 +0000 (19:57 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@602 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/misc.hh
pdns/pdns_recursor.cc
pdns/rec_channel_rec.cc
pdns/syncres.hh

index 5c027bc54f8b9badf3701bb8defec5ce5f0e7afb..17b1f435073e82886f0978e7a00b23b53d38cd0f 100644 (file)
@@ -160,10 +160,11 @@ inline void DTime::set()
 inline int DTime::udiff()
 {
   struct timeval now;
-  // Utility::
-  gettimeofday(&now,0);
 
-  return 1000000*(now.tv_sec-d_set.tv_sec)+(now.tv_usec-d_set.tv_usec);
+  gettimeofday(&now,0);
+  int ret=1000000*(now.tv_sec-d_set.tv_sec)+(now.tv_usec-d_set.tv_usec);
+  d_set=now;
+  return ret;
 }
 
 inline bool dns_isspace(char c)
index 32cb259e08f3c53e63a5724e8fc1e1ef362b703b..2a0e7d02d7664cc2f89824fb2a7b1c234fe28ff5 100644 (file)
@@ -328,6 +328,18 @@ void startDoResolve(void *p)
     }
     
     sr.d_outqueries ? RC.cacheMisses++ : RC.cacheHits++; 
+    float spent=makeFloat(sr.d_now-dc->d_now);
+    if(spent < 0.001)
+      g_stats.answers0_1++;
+    else if(spent < 0.010)
+      g_stats.answers1_10++;
+    else if(spent < 0.1)
+      g_stats.answers10_100++;
+    else if(spent < 1.0)
+      g_stats.answers100_1000++;
+    else
+      g_stats.answersSlow++;
+
     delete dc;
   }
   catch(AhuException &ae) {
index f21ff206ec6f968b002e7b22526284a6f698a77f..317c2c2ae0090252042aa89b9dd4d7892ba73d08 100644 (file)
@@ -84,6 +84,13 @@ RecursorControlParser::RecursorControlParser()
   addGetStat("servfail-answers", &g_stats.servFails);
   addGetStat("nxdomain-answers", &g_stats.nxDomains);
   addGetStat("noerror-answers", &g_stats.noErrors);
+
+  addGetStat("answers0-1", &g_stats.answers0_1);
+  addGetStat("answers1-10", &g_stats.answers1_10);
+  addGetStat("answers10-100", &g_stats.answers10_100);
+  addGetStat("answers100-1000", &g_stats.answers100_1000);
+  addGetStat("answers-slow", &g_stats.answersSlow);
+
   addGetStat("all-questions", &qcounter);
   addGetStat("negcache-entries", bind(&SyncRes::negcache_t::size, ref(SyncRes::s_negcache)));
   addGetStat("throttle-entries", bind(&SyncRes::throttle_t::size, ref(SyncRes::s_throttle)));
index 8f83eefa38377186e2c2bbe33a851f44bcc044b4..2914cac6795439b8580cb891f445a3612d9432d0 100644 (file)
@@ -209,8 +209,8 @@ private:
 class SyncRes
 {
 public:
-  explicit SyncRes(const struct timeval& now) : d_outqueries(0), d_tcpoutqueries(0), d_throttledqueries(0), d_timeouts(0), 
-                                               d_cacheonly(false), d_nocache(false), d_now(now) { }
+  explicit SyncRes(const struct timeval& now) :  d_outqueries(0), d_tcpoutqueries(0), d_throttledqueries(0), d_timeouts(0), d_now(now),
+                                               d_cacheonly(false), d_nocache(false) { }
   int beginResolve(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret);
   void setId(int id)
   {
@@ -247,6 +247,7 @@ public:
 
   typedef Throttle<string> throttle_t;
   static throttle_t s_throttle;
+  struct timeval d_now;
 private:
   struct GetBestNSAnswer;
   int doResolveAt(set<string> nameservers, string auth, const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret,
@@ -265,13 +266,14 @@ private:
 
   SyncRes(const SyncRes&);
   SyncRes& operator=(const SyncRes&);
+
+
 private:
   string d_prefix;
   static bool s_log;
   bool d_cacheonly;
   bool d_nocache;
   LWRes d_lwr;
-  struct timeval d_now;
 
   struct GetBestNSAnswer
   {
@@ -328,6 +330,7 @@ struct RecursorStats
   uint64_t nxDomains;
   uint64_t noErrors;
   PulseRate queryrate;
+  uint64_t answers0_1, answers1_10, answers10_100, answers100_1000, answersSlow;
 };
 
 extern RecursorStats g_stats;