]> git.ipfire.org Git - telemetry.git/commitdiff
graphs: knot-resolver: Add a latency graph
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 10 Jul 2026 15:32:06 +0000 (15:32 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 10 Jul 2026 15:32:06 +0000 (15:32 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/daemon/graphs.c
src/daemon/graphs/knot-resolver.c
src/daemon/graphs/knot-resolver.h

index edc6ed23151f9d02030b7847f0bf65a498a9eef8..8ec25560dd3ac6b47288573cfc9938e542b9556d 100644 (file)
@@ -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,
index fa3554db634ca2ad14e813a3dd5ce80d929b43ab..c6919189a86db130c3504880e2a496d9435e4345 100644 (file)
@@ -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,
+};
index cd8dd09afce7f3fb6a86cacfb096fccb1e8e92e8..2b9e4cac9ac334f211f3e5b74e8a310773167ad1 100644 (file)
@@ -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 */