From d174f0e59a5bf0366610ebc6e37c9859104566f9 Mon Sep 17 00:00:00 2001 From: Emeric Brun Date: Fri, 29 Oct 2021 17:30:41 +0200 Subject: [PATCH] MINOR: resolvers/dns: split dns and resolver counters in dns_counter struct This patch add a union and struct into dns_counter struct to split application specific counters. The only current existing application is the resolver.c layer but in futur we could handle different application such as dns load balancing with others specific counters. This patch should not be backported. --- include/haproxy/dns-t.h | 30 +++++++++------- src/resolvers.c | 76 ++++++++++++++++++++--------------------- src/server.c | 4 +-- 3 files changed, 57 insertions(+), 53 deletions(-) diff --git a/include/haproxy/dns-t.h b/include/haproxy/dns-t.h index 461a5d19a..1c876e306 100644 --- a/include/haproxy/dns-t.h +++ b/include/haproxy/dns-t.h @@ -157,19 +157,23 @@ struct dns_counters { char *pid; long long sent; /* - queries sent */ long long snd_error; /* - sending errors */ - long long valid; /* - valid response */ - long long update; /* - valid response used to update server's IP */ - long long cname; /* - CNAME response requiring new resolution */ - long long cname_error; /* - error when resolving CNAMEs */ - long long any_err; /* - void response (usually because ANY qtype) */ - long long nx; /* - NX response */ - long long timeout; /* - queries which reached timeout */ - long long refused; /* - queries refused */ - long long other; /* - other type of response */ - long long invalid; /* - malformed DNS response */ - long long too_big; /* - too big response */ - long long outdated; /* - outdated response (server slower than the other ones) */ - long long truncated; /* - truncated response */; + union { + struct { + long long valid; /* - valid response */ + long long update; /* - valid response used to update server's IP */ + long long cname; /* - CNAME response requiring new resolution */ + long long cname_error; /* - error when resolving CNAMEs */ + long long any_err; /* - void response (usually because ANY qtype) */ + long long nx; /* - NX response */ + long long timeout; /* - queries which reached timeout */ + long long refused; /* - queries refused */ + long long other; /* - other type of response */ + long long invalid; /* - malformed DNS response */ + long long too_big; /* - too big response */ + long long outdated; /* - outdated response (server slower than the other ones) */ + long long truncated; /* - truncated response */; + } resolver; + } app; /* application specific counteurs */ }; #endif /* _HAPROXY_DNS_T_H */ diff --git a/src/resolvers.c b/src/resolvers.c index 4f5924320..9b45e8e7c 100644 --- a/src/resolvers.c +++ b/src/resolvers.c @@ -120,19 +120,19 @@ static void dns_fill_stats(void *d, struct field *stats) stats[DNS_STAT_PID] = mkf_str(FO_CONFIG, counters->pid); stats[DNS_STAT_SENT] = mkf_u64(FN_GAUGE, counters->sent); stats[DNS_STAT_SND_ERROR] = mkf_u64(FN_GAUGE, counters->snd_error); - stats[DNS_STAT_VALID] = mkf_u64(FN_GAUGE, counters->valid); - stats[DNS_STAT_UPDATE] = mkf_u64(FN_GAUGE, counters->update); - stats[DNS_STAT_CNAME] = mkf_u64(FN_GAUGE, counters->cname); - stats[DNS_STAT_CNAME_ERROR] = mkf_u64(FN_GAUGE, counters->cname_error); - stats[DNS_STAT_ANY_ERR] = mkf_u64(FN_GAUGE, counters->any_err); - stats[DNS_STAT_NX] = mkf_u64(FN_GAUGE, counters->nx); - stats[DNS_STAT_TIMEOUT] = mkf_u64(FN_GAUGE, counters->timeout); - stats[DNS_STAT_REFUSED] = mkf_u64(FN_GAUGE, counters->refused); - stats[DNS_STAT_OTHER] = mkf_u64(FN_GAUGE, counters->other); - stats[DNS_STAT_INVALID] = mkf_u64(FN_GAUGE, counters->invalid); - stats[DNS_STAT_TOO_BIG] = mkf_u64(FN_GAUGE, counters->too_big); - stats[DNS_STAT_TRUNCATED] = mkf_u64(FN_GAUGE, counters->truncated); - stats[DNS_STAT_OUTDATED] = mkf_u64(FN_GAUGE, counters->outdated); + stats[DNS_STAT_VALID] = mkf_u64(FN_GAUGE, counters->app.resolver.valid); + stats[DNS_STAT_UPDATE] = mkf_u64(FN_GAUGE, counters->app.resolver.update); + stats[DNS_STAT_CNAME] = mkf_u64(FN_GAUGE, counters->app.resolver.cname); + stats[DNS_STAT_CNAME_ERROR] = mkf_u64(FN_GAUGE, counters->app.resolver.cname_error); + stats[DNS_STAT_ANY_ERR] = mkf_u64(FN_GAUGE, counters->app.resolver.any_err); + stats[DNS_STAT_NX] = mkf_u64(FN_GAUGE, counters->app.resolver.nx); + stats[DNS_STAT_TIMEOUT] = mkf_u64(FN_GAUGE, counters->app.resolver.timeout); + stats[DNS_STAT_REFUSED] = mkf_u64(FN_GAUGE, counters->app.resolver.refused); + stats[DNS_STAT_OTHER] = mkf_u64(FN_GAUGE, counters->app.resolver.other); + stats[DNS_STAT_INVALID] = mkf_u64(FN_GAUGE, counters->app.resolver.invalid); + stats[DNS_STAT_TOO_BIG] = mkf_u64(FN_GAUGE, counters->app.resolver.too_big); + stats[DNS_STAT_TRUNCATED] = mkf_u64(FN_GAUGE, counters->app.resolver.truncated); + stats[DNS_STAT_OUTDATED] = mkf_u64(FN_GAUGE, counters->app.resolver.outdated); } static struct stats_module dns_stats_module = { @@ -2169,7 +2169,7 @@ static int resolv_process_responses(struct dns_nameserver *ns) /* message too big */ if (buflen > resolvers->accepted_payload_size) { - ns->counters->too_big++; + ns->counters->app.resolver.too_big++; continue; } @@ -2178,7 +2178,7 @@ static int resolv_process_responses(struct dns_nameserver *ns) /* read the query id from the packet (16 bits) */ if (buf + 2 > bufend) { - ns->counters->invalid++; + ns->counters->app.resolver.invalid++; continue; } query_id = resolv_response_get_query_id(buf); @@ -2187,7 +2187,7 @@ static int resolv_process_responses(struct dns_nameserver *ns) eb = eb32_lookup(&resolvers->query_ids, query_id); if (eb == NULL) { /* unknown query id means an outdated response and can be safely ignored */ - ns->counters->outdated++; + ns->counters->app.resolver.outdated++; continue; } @@ -2207,39 +2207,39 @@ static int resolv_process_responses(struct dns_nameserver *ns) case RSLV_RESP_QUERY_COUNT_ERROR: case RSLV_RESP_WRONG_NAME: res->status = RSLV_STATUS_INVALID; - ns->counters->invalid++; + ns->counters->app.resolver.invalid++; break; case RSLV_RESP_NX_DOMAIN: res->status = RSLV_STATUS_NX; - ns->counters->nx++; + ns->counters->app.resolver.nx++; break; case RSLV_RESP_REFUSED: res->status = RSLV_STATUS_REFUSED; - ns->counters->refused++; + ns->counters->app.resolver.refused++; break; case RSLV_RESP_ANCOUNT_ZERO: res->status = RSLV_STATUS_OTHER; - ns->counters->any_err++; + ns->counters->app.resolver.any_err++; break; case RSLV_RESP_CNAME_ERROR: res->status = RSLV_STATUS_OTHER; - ns->counters->cname_error++; + ns->counters->app.resolver.cname_error++; break; case RSLV_RESP_TRUNCATED: res->status = RSLV_STATUS_OTHER; - ns->counters->truncated++; + ns->counters->app.resolver.truncated++; break; case RSLV_RESP_NO_EXPECTED_RECORD: case RSLV_RESP_ERROR: case RSLV_RESP_INTERNAL: res->status = RSLV_STATUS_OTHER; - ns->counters->other++; + ns->counters->app.resolver.other++; break; } @@ -2281,7 +2281,7 @@ static int resolv_process_responses(struct dns_nameserver *ns) LIST_DEL_INIT(&query->list); if (memcmp(query->name, res->hostname_dn, res->hostname_dn_len) != 0) { dns_resp = RSLV_RESP_WRONG_NAME; - ns->counters->other++; + ns->counters->app.resolver.other++; goto report_res_error; } } @@ -2289,7 +2289,7 @@ static int resolv_process_responses(struct dns_nameserver *ns) /* So the resolution succeeded */ res->status = RSLV_STATUS_VALID; res->last_valid = now_ms; - ns->counters->valid++; + ns->counters->app.resolver.valid++; goto report_res_success; report_res_error: @@ -2812,19 +2812,19 @@ static int cli_io_handler_dump_resolvers_to_buffer(struct appctx *appctx) chunk_appendf(&trash, " nameserver %s:\n", ns->id); chunk_appendf(&trash, " sent: %lld\n", ns->counters->sent); chunk_appendf(&trash, " snd_error: %lld\n", ns->counters->snd_error); - chunk_appendf(&trash, " valid: %lld\n", ns->counters->valid); - chunk_appendf(&trash, " update: %lld\n", ns->counters->update); - chunk_appendf(&trash, " cname: %lld\n", ns->counters->cname); - chunk_appendf(&trash, " cname_error: %lld\n", ns->counters->cname_error); - chunk_appendf(&trash, " any_err: %lld\n", ns->counters->any_err); - chunk_appendf(&trash, " nx: %lld\n", ns->counters->nx); - chunk_appendf(&trash, " timeout: %lld\n", ns->counters->timeout); - chunk_appendf(&trash, " refused: %lld\n", ns->counters->refused); - chunk_appendf(&trash, " other: %lld\n", ns->counters->other); - chunk_appendf(&trash, " invalid: %lld\n", ns->counters->invalid); - chunk_appendf(&trash, " too_big: %lld\n", ns->counters->too_big); - chunk_appendf(&trash, " truncated: %lld\n", ns->counters->truncated); - chunk_appendf(&trash, " outdated: %lld\n", ns->counters->outdated); + chunk_appendf(&trash, " valid: %lld\n", ns->counters->app.resolver.valid); + chunk_appendf(&trash, " update: %lld\n", ns->counters->app.resolver.update); + chunk_appendf(&trash, " cname: %lld\n", ns->counters->app.resolver.cname); + chunk_appendf(&trash, " cname_error: %lld\n", ns->counters->app.resolver.cname_error); + chunk_appendf(&trash, " any_err: %lld\n", ns->counters->app.resolver.any_err); + chunk_appendf(&trash, " nx: %lld\n", ns->counters->app.resolver.nx); + chunk_appendf(&trash, " timeout: %lld\n", ns->counters->app.resolver.timeout); + chunk_appendf(&trash, " refused: %lld\n", ns->counters->app.resolver.refused); + chunk_appendf(&trash, " other: %lld\n", ns->counters->app.resolver.other); + chunk_appendf(&trash, " invalid: %lld\n", ns->counters->app.resolver.invalid); + chunk_appendf(&trash, " too_big: %lld\n", ns->counters->app.resolver.too_big); + chunk_appendf(&trash, " truncated: %lld\n", ns->counters->app.resolver.truncated); + chunk_appendf(&trash, " outdated: %lld\n", ns->counters->app.resolver.outdated); } chunk_appendf(&trash, "\n"); } diff --git a/src/server.c b/src/server.c index 600dbfd04..a0206021d 100644 --- a/src/server.c +++ b/src/server.c @@ -3615,7 +3615,7 @@ int snr_resolution_cb(struct resolv_requester *requester, struct dns_counters *c save_ip: if (counters) { - counters->update++; + counters->app.resolver.update++; /* save the first ip we found */ chunk_printf(chk, "%s/%s", counters->pid, counters->id); } @@ -3630,7 +3630,7 @@ int snr_resolution_cb(struct resolv_requester *requester, struct dns_counters *c invalid: if (counters) { - counters->invalid++; + counters->app.resolver.invalid++; goto update_status; } if (!snr_update_srv_status(s, has_no_ip) && has_no_ip)