]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
modules/stats: more granular latency measurements
authorMarek Vavrusa <marek@vavrusa.com>
Wed, 8 Jun 2016 07:20:40 +0000 (00:20 -0700)
committerMarek Vavrusa <marek@vavrusa.com>
Wed, 6 Jul 2016 06:33:38 +0000 (23:33 -0700)
now including <1ms, <50ms, <250ms, <500ms, <1.5s

doc/build.rst
lib/generic/array.h
modules/stats/README.rst
modules/stats/stats.c

index f908b852f18b29b784cc73bb516cd61839605f0d..76cbe90fba32de940e692c1a4242176c8276a3d4 100644 (file)
@@ -44,6 +44,7 @@ There are also *optional* packages that enable specific functionality in Knot DN
 .. csv-table::
    :header: "Optional", "Needed for", "Notes"
 
+   "`lua-http`_", "``modules/http``", "HTTP/2 client/server for Lua."
    "luasocket_", "``trust anchors, modules/stats``", "Sockets for Lua."
    "luasec_", "``trust anchors``", "TLS for Lua."
    "libmemcached_", "``modules/memcached``", "To build memcached backend module."
@@ -265,6 +266,7 @@ You can hack on the container by changing the container entrypoint to shell like
 .. _Python: https://www.python.org/
 .. _luasec: https://luarocks.org/modules/luarocks/luasec
 .. _luasocket: https://luarocks.org/modules/luarocks/luasocket
+.. _lua-http: https://luarocks.org/modules/daurnimator/http
 
 .. _boot2docker: http://boot2docker.io/
 
index c76228be7f0fd4b9df69b4b6e0c336edd79fefa0..2c3848a3cc7ff836f6bb6a0d390ba8c360315bba 100644 (file)
@@ -113,7 +113,7 @@ static inline void array_std_free(void *baton, void *p)
 
 /**
  * Reserve capacity up to 'n' bytes.
- * @return >=0 if success
+ * @return 0 if success, <0 on failure
  */
 #define array_reserve(array, n) \
        array_reserve_mm(array, n, array_std_reserve, NULL)
index 88b2bf5f6616be7737d8c57f56f52e0a28d2e7a5..293d33e8398b2dee3fd0911a1cf18816e45158dc 100644 (file)
@@ -89,9 +89,14 @@ Built-in statistics
 * ``answer.nodata`` - number of **NOERROR**, but empty answers
 * ``answer.nxdomain`` - number of **NXDOMAIN** answers
 * ``answer.servfail`` - number of **SERVFAIL** answers
+* ``answer.1ms`` - number of answers completed in 1ms
 * ``answer.10ms`` - number of answers completed in 10ms
+* ``answer.50ms`` - number of answers completed in 50ms
 * ``answer.100ms`` - number of answers completed in 100ms
+* ``answer.250ms`` - number of answers completed in 250ms
+* ``answer.500ms`` - number of answers completed in 500ms
 * ``answer.1000ms`` - number of answers completed in 1000ms
-* ``answer.slow`` - number of answers that took more than 1000ms
+* ``answer.1500ms`` - number of answers completed in 1500ms
+* ``answer.slow`` - number of answers that took more than 1500ms
 * ``query.edns`` - number of queries with EDNS
 * ``query.dnssec`` - number of queries with DNSSEC DO=1
index e65f84ab8ee9b7fe89ec745902fb6fac60188934..5795362a165571396dfa1e811d5ecca67300a9a1 100644 (file)
@@ -45,7 +45,8 @@
 /** @cond internal Fixed-size map of predefined metrics. */
 #define CONST_METRICS(X) \
        X(answer,total) X(answer,noerror) X(answer,nodata) X(answer,nxdomain) X(answer,servfail) \
-       X(answer,cached) X(answer,10ms) X(answer,100ms) X(answer,1000ms) X(answer,slow) \
+       X(answer,cached) X(answer,1ms) X(answer,10ms) X(answer,50ms) X(answer,100ms) \
+       X(answer,250ms) X(answer,500ms) X(answer,1000ms) X(answer,1500ms) X(answer,slow) \
        X(query,edns) X(query,dnssec) \
        X(const,end)
 
@@ -150,21 +151,33 @@ static int collect(knot_layer_t *ctx)
        if (rplan->resolved.len > 0) {
                /* Histogram of answer latency. */
                struct kr_query *first = rplan->resolved.at[0];
-               struct kr_query *last = array_tail(rplan->resolved);
                struct timeval now;
                gettimeofday(&now, NULL);
                long elapsed = time_diff(&first->timestamp, &now);
-               if (last->flags & QUERY_CACHED) {
-                       stat_const_add(data, metric_answer_cached, 1);
+               if (elapsed <= 1) {
+                       stat_const_add(data, metric_answer_1ms, 1);
                } else if (elapsed <= 10) {
                        stat_const_add(data, metric_answer_10ms, 1);
+               } else if (elapsed <= 50) {
+                       stat_const_add(data, metric_answer_50ms, 1);
                } else if (elapsed <= 100) {
                        stat_const_add(data, metric_answer_100ms, 1);
+               } else if (elapsed <= 250) {
+                       stat_const_add(data, metric_answer_250ms, 1);
+               } else if (elapsed <= 500) {
+                       stat_const_add(data, metric_answer_500ms, 1);
                } else if (elapsed <= 1000) {
                        stat_const_add(data, metric_answer_1000ms, 1);
+               } else if (elapsed <= 1500) {
+                       stat_const_add(data, metric_answer_1500ms, 1);
                } else {
                        stat_const_add(data, metric_answer_slow, 1);
                }
+               /* Observe the final query. */
+               struct kr_query *last = array_tail(rplan->resolved);
+               if (last->flags & QUERY_CACHED) {
+                       stat_const_add(data, metric_answer_cached, 1);
+               }
        }
        /* Query parameters and transport mode */
        if (knot_pkt_has_edns(param->answer)) {