]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
modules/stats: 10-100-1000 ms latency tracking
authorMarek Vavruša <marek.vavrusa@nic.cz>
Mon, 13 Jul 2015 22:19:34 +0000 (00:19 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Mon, 13 Jul 2015 22:19:34 +0000 (00:19 +0200)
modules/stats/README.rst
modules/stats/stats.c

index 0f61e79da5efd23c90032d4cd89b6a0a1b64e733..f36ecbc835ea190f0c3fb0b0a96f63c32223c3e5 100644 (file)
@@ -79,5 +79,9 @@ Built-in statistics
 * ``answer.noerror`` - number of **NOERROR** answers
 * ``answer.nxdomain`` - number of **NXDOMAIN** answers
 * ``answer.servfail`` - number of **SERVFAIL** answers
+* ``answer.10ms`` - number of answers completed in 10ms
+* ``answer.100ms`` - number of answers completed in 100ms
+* ``answer.1000ms`` - number of answers completed in 1000ms
+* ``answer.slow`` - number of answers that took more than 1000ms
 * ``query.edns`` - number of queries with EDNS
 * ``query.dnssec`` - number of queries with DNSSEC DO=1
index a35cfd5e069ab8c6487490fff3385701046433e6..db2c942ac1c75ac67e3dc732c8bc6d2bc3c5c8f1 100644 (file)
@@ -43,7 +43,7 @@
 /** @cond internal Fixed-size map of predefined metrics. */
 #define CONST_METRICS(X) \
        X(answer,total) X(answer,noerror) X(answer,nxdomain) X(answer,servfail) \
-       X(answer,cached) X(answer,slow) \
+       X(answer,cached) X(answer,10ms) X(answer,100ms) X(answer,1000ms) X(answer,slow) \
        X(query,edns) X(query,dnssec) \
        X(const,end)
 
@@ -82,13 +82,6 @@ float time_diff(struct timeval *begin, struct timeval *end)
 
 }
 
-/** @internal Add to map counter */
-static inline void stat_add(struct stat_data *data, const char *key, ssize_t incr)
-{
-       void *val = map_get(&data->map, key);
-       map_set(&data->map, key, (void *)((size_t)val + incr));
-}
-
 /** @internal Add to const map counter */
 static inline void stat_const_add(struct stat_data *data, enum const_metric key, ssize_t incr)
 {
@@ -161,12 +154,18 @@ static int collect(knot_layer_t *ctx)
                if (last->flags & QUERY_CACHED) {
                        stat_const_add(data, metric_answer_cached, 1);
                }
-               /* Count slow queries (>1000ms) */
+               /* Histogram of answer latency. */
                struct kr_query *first = HEAD(rplan->resolved);
                struct timeval now;
                gettimeofday(&now, NULL);
                float elapsed = time_diff(&first->timestamp, &now);
-               if (elapsed > 1000.0) {
+               if (elapsed < 10.0) {
+                       stat_const_add(data, metric_answer_10ms, 1);
+               } else if (elapsed < 100.0) {
+                       stat_const_add(data, metric_answer_100ms, 1);
+               } else if (elapsed < 1000.0) {
+                       stat_const_add(data, metric_answer_1000ms, 1);
+               } else {
                        stat_const_add(data, metric_answer_slow, 1);
                }
        }