From: Michael Tremer Date: Fri, 10 Jul 2026 15:32:06 +0000 (+0000) Subject: graphs: knot-resolver: Add a latency graph X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fef4caab917b7ed60ba9612752bfe7fdc248c966;p=telemetry.git graphs: knot-resolver: Add a latency graph Signed-off-by: Michael Tremer --- diff --git a/src/daemon/graphs.c b/src/daemon/graphs.c index edc6ed2..8ec2556 100644 --- a/src/daemon/graphs.c +++ b/src/daemon/graphs.c @@ -98,6 +98,7 @@ static const td_graph_impl* graph_impls[] = { &knot_resolver_cache_graph, &knot_resolver_transports_graph, &knot_resolver_responses_graph, + &knot_resolver_latency_graph, // Unbound &unbound_cache_performance_graph, diff --git a/src/daemon/graphs/knot-resolver.c b/src/daemon/graphs/knot-resolver.c index fa3554d..c691918 100644 --- a/src/daemon/graphs/knot-resolver.c +++ b/src/daemon/graphs/knot-resolver.c @@ -254,3 +254,98 @@ const td_graph_impl knot_resolver_responses_graph = { .lower_limit = 0, .upper_limit = LONG_MAX, }; + +// Latency + +// We define the colours locally because no other software will have the same buckets +#define COLOR_LATENCY_1MS COLOR_CLEAN_GREEN +#define COLOR_LATENCY_10MS COLOR_FRESH_LIME +#define COLOR_LATENCY_50MS COLOR_YELLOW_GOLD +#define COLOR_LATENCY_100MS COLOR_CLEAN_AMBER +#define COLOR_LATENCY_250MS COLOR_WARM_ORANGE +#define COLOR_LATENCY_500MS COLOR_SOFT_RED +#define COLOR_LATENCY_1000MS COLOR_PRIMARY +#define COLOR_LATENCY_1500MS COLOR_PURPLE_MAGENTA +#define COLOR_LATENCY_SLOW COLOR_PINK_MAGENTA + +static int knot_resolver_latency_title(td_ctx* ctx, td_graph* graph, + const char* object, char* title, size_t length) { + return __td_string_set(title, length, _("Latency")); +} + +static int knot_resolver_latency_render(td_ctx* ctx, td_graph* graph, + const td_graph_render_options* options, td_args* args, const char* object) { + int r; + + // Load all sources + r = td_graph_load_source(graph, args, "knot-resolver", NULL); + if (r < 0) + return r; + + // Header + PRINT_HEADER4(args, _("Current"), _("Average"), _("Minimum"), _("Maximum")); + + PRINT_EMPTY_LINE(args); + + // Draw the stacked backgrounds first + DRAW_AREA_BACKGROUND(args, "answer_1ms", NULL, COLOR_LATENCY_1MS, 0); + DRAW_AREA_BACKGROUND(args, "answer_10ms", NULL, COLOR_LATENCY_10MS, STACKED); + DRAW_AREA_BACKGROUND(args, "answer_50ms", NULL, COLOR_LATENCY_50MS, STACKED); + DRAW_AREA_BACKGROUND(args, "answer_100ms", NULL, COLOR_LATENCY_100MS, STACKED); + DRAW_AREA_BACKGROUND(args, "answer_250ms", NULL, COLOR_LATENCY_250MS, STACKED); + DRAW_AREA_BACKGROUND(args, "answer_500ms", NULL, COLOR_LATENCY_500MS, STACKED); + DRAW_AREA_BACKGROUND(args, "answer_1000ms", NULL, COLOR_LATENCY_1000MS, STACKED); + DRAW_AREA_BACKGROUND(args, "answer_1500ms", NULL, COLOR_LATENCY_1500MS, STACKED); + DRAW_AREA_BACKGROUND(args, "answer_slow", NULL, COLOR_LATENCY_SLOW, STACKED); + + // Draw the area outlines afterwards + DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_1ms", NULL, + COLOR_LATENCY_1MS, 0, _("0-1 ms")); + PRINT_CAMM(args, "answer_1ms", NULL, QPS, QPS_UNIT); + + DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_10ms", NULL, + COLOR_LATENCY_10MS, STACKED, _("1-10 ms")); + PRINT_CAMM(args, "answer_10ms", NULL, QPS, QPS_UNIT); + + DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_50ms", NULL, + COLOR_LATENCY_10MS, STACKED, _("10-50 ms")); + PRINT_CAMM(args, "answer_50ms", NULL, QPS, QPS_UNIT); + + DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_100ms", NULL, + COLOR_LATENCY_100MS, STACKED, _("50-100 ms")); + PRINT_CAMM(args, "answer_100ms", NULL, QPS, QPS_UNIT); + + DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_250ms", NULL, + COLOR_LATENCY_250MS, STACKED, _("100-250 ms")); + PRINT_CAMM(args, "answer_250ms", NULL, QPS, QPS_UNIT); + + DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_500ms", NULL, + COLOR_LATENCY_500MS, STACKED, _("250-500 ms")); + PRINT_CAMM(args, "answer_500ms", NULL, QPS, QPS_UNIT); + + DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_1000ms", NULL, + COLOR_LATENCY_1000MS, STACKED, _("500-1000 ms")); + PRINT_CAMM(args, "answer_1000ms", NULL, QPS, QPS_UNIT); + + DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_1500ms", NULL, + COLOR_LATENCY_1500MS, STACKED, _("1000-1500 ms")); + PRINT_CAMM(args, "answer_1500ms", NULL, QPS, QPS_UNIT); + + DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_slow", NULL, + COLOR_LATENCY_SLOW, STACKED, _("> 1500ms")); + PRINT_CAMM(args, "answer_slow", NULL, QPS, QPS_UNIT); + + return 0; +} + +const td_graph_impl knot_resolver_latency_graph = { + .name = "KnotResolverLatency", + .can_render = knot_resolver_can_render, + .render = knot_resolver_latency_render, + .title = knot_resolver_latency_title, + .vlabel = td_graph_vlabel_qps, + + // Limits + .lower_limit = 0, + .upper_limit = LONG_MAX, +}; diff --git a/src/daemon/graphs/knot-resolver.h b/src/daemon/graphs/knot-resolver.h index cd8dd09..2b9e4ca 100644 --- a/src/daemon/graphs/knot-resolver.h +++ b/src/daemon/graphs/knot-resolver.h @@ -27,5 +27,6 @@ extern const td_graph_impl knot_resolver_queries_graph; extern const td_graph_impl knot_resolver_cache_graph; extern const td_graph_impl knot_resolver_transports_graph; extern const td_graph_impl knot_resolver_responses_graph; +extern const td_graph_impl knot_resolver_latency_graph; #endif /* TELEMETRY_GRAPH_KNOT_RESOLVER_H */