From: Petr Špaček Date: Wed, 3 Apr 2019 14:27:07 +0000 (+0200) Subject: stats: collect stats on inbound transport protocol X-Git-Tag: v4.0.0~10^2~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d74eb7d19c1dbae3ab59df992b2c4f75f72bc337;p=thirdparty%2Fknot-resolver.git stats: collect stats on inbound transport protocol --- diff --git a/modules/stats/README.rst b/modules/stats/README.rst index 2d7dbcd49..74910140d 100644 --- a/modules/stats/README.rst +++ b/modules/stats/README.rst @@ -92,6 +92,28 @@ Built-in statistics Built-in counters keep track of number of queries and answers matching specific criteria. ++-----------------------------------------------------------------+ +| **Global request counters** | ++------------------+----------------------------------------------+ +| request.total | total number of DNS requests from clients | +| | (including internal client requests) | ++------------------+----------------------------------------------+ +| request.internal | internal requests generated by Knot Resolver | +| | (e.g. DNSSEC trust anchor updates) | ++------------------+----------------------------------------------+ +| request.udp | external requests received over plain UDP | +| | (:rfc:`1035`) | ++------------------+----------------------------------------------+ +| request.tcp | external requests received over plain TCP | +| | (:rfc:`1035`) | ++------------------+----------------------------------------------+ +| request.dot | external requests received over | +| | DNS-over-TLS (:rfc:`7858`) | ++------------------+----------------------------------------------+ +| request.doh | external requests received over | +| | DNS-over-HTTP (:rfc:`8484`) | ++------------------+----------------------------------------------+ + +----------------------------------------------------+ | **Global answer counters** | +-----------------+----------------------------------+ diff --git a/modules/stats/stats.c b/modules/stats/stats.c index c1ed568f1..5d377632c 100644 --- a/modules/stats/stats.c +++ b/modules/stats/stats.c @@ -61,6 +61,8 @@ X(answer,aa) X(answer,tc) X(answer,rd) X(answer,ra) X(answer, ad) X(answer,cd) \ X(answer,edns0) X(answer,do) \ X(query,edns) X(query,dnssec) \ + X(request,total) X(request,udp) X(request,tcp) \ + X(request,dot) X(request,doh) X(request,internal) \ X(const,end) enum const_metric { @@ -187,6 +189,33 @@ static int collect_rtt(kr_layer_t *ctx, knot_pkt_t *pkt) return ctx->state; } +static int collect_transport(kr_layer_t *ctx) +{ + struct kr_request *req = ctx->req; + struct kr_module *module = ctx->api->data; + struct stat_data *data = module->data; + + stat_const_add(data, metric_request_total, 1); + if (req->qsource.dst_addr == NULL) { + stat_const_add(data, metric_request_internal, 1); + return ctx->state; + } + + /** + * Count each transport only once, + * i.e. DoT does not count as TCP. + */ + if (req->qsource.flags.http) + stat_const_add(data, metric_request_doh, 1); + else if (req->qsource.flags.tls) + stat_const_add(data, metric_request_dot, 1); + else if (req->qsource.flags.tcp) + stat_const_add(data, metric_request_tcp, 1); + else + stat_const_add(data, metric_request_udp, 1); + return ctx->state; +} + static int collect(kr_layer_t *ctx) { struct kr_request *param = ctx->req; @@ -441,6 +470,7 @@ const kr_layer_api_t *stats_layer(struct kr_module *module) static kr_layer_api_t _layer = { .consume = &collect_rtt, .finish = &collect, + .begin = &collect_transport, }; /* Store module reference */ _layer.data = module;