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

index ba44238af0993821562ecbdb146ef2506ac5ccae..83e0ffd189a4be974addeac30c3cec868a160456 100644 (file)
 #define COLOR_DNS_ITERATOR             COLOR_CLEAN_GREEN
 #define COLOR_DNS_VALIDATOR            COLOR_PURPLE_MAGENTA
 
+// DNS Responses
+#define COLOR_RCODE_NOERROR            COLOR_CLEAN_GREEN
+#define COLOR_RCODE_NXDOMAIN   COLOR_CLEAN_AMBER
+#define COLOR_RCODE_SERVFAIL   COLOR_SOFT_RED
+#define COLOR_RCODE_NODATA             COLOR_COOL_CYAN
+
 // CPU Colors
 static inline const char* COLOR_CPU(long i) {
        const char* cpu_colors[] = {
index 0b9b5faa11b0b62987d0aa1864295bf3142e1c96..edc6ed23151f9d02030b7847f0bf65a498a9eef8 100644 (file)
@@ -97,6 +97,7 @@ static const td_graph_impl* graph_impls[] = {
        &knot_resolver_queries_graph,
        &knot_resolver_cache_graph,
        &knot_resolver_transports_graph,
+       &knot_resolver_responses_graph,
 
        // Unbound
        &unbound_cache_performance_graph,
index 1793fc58cd28f69d5a8e2eb271afb1b0fdb828aa..fa3554db634ca2ad14e813a3dd5ce80d929b43ab 100644 (file)
@@ -188,3 +188,69 @@ const td_graph_impl knot_resolver_transports_graph = {
        .lower_limit = 0,
        .upper_limit = LONG_MAX,
 };
+
+// Responses
+
+static int knot_resolver_responses_title(td_ctx* ctx, td_graph* graph,
+               const char* object, char* title, size_t length) {
+       return __td_string_set(title, length, _("Response Codes"));
+}
+
+static int knot_resolver_responses_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;
+
+       // Draw the stacked backgrounds first
+       DRAW_AREA_BACKGROUND(args, "answer_servfail", NULL, COLOR_RCODE_SERVFAIL, 0);
+       DRAW_AREA_BACKGROUND(args, "answer_nxdomain", NULL, COLOR_RCODE_NXDOMAIN, STACKED);
+       DRAW_AREA_BACKGROUND(args, "answer_nodata",   NULL, COLOR_RCODE_NODATA,   STACKED);
+       DRAW_AREA_BACKGROUND(args, "answer_noerror",  NULL, COLOR_RCODE_NOERROR,  STACKED);
+
+       // Draw the area outlines afterwards
+       DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_servfail", NULL,
+                       COLOR_RCODE_SERVFAIL, 0, _("SERVFAIL"));
+       PRINT_CAMM(args, "answer_servfail", NULL, QPS, QPS_UNIT);
+
+       DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_nxdomain", NULL,
+                       COLOR_RCODE_NXDOMAIN, STACKED, _("NXDOMAIN"));
+       PRINT_CAMM(args, "answer_nxdomain", NULL, QPS, QPS_UNIT);
+
+       DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_nodata", NULL,
+                       COLOR_RCODE_NODATA, STACKED, _("NODATA"));
+       PRINT_CAMM(args, "answer_nodata", NULL, QPS, QPS_UNIT);
+
+       DRAW_AREA_OUTLINE_WITH_LABEL(args, "answer_noerror", NULL,
+                       COLOR_RCODE_NOERROR, STACKED, _("NOERROR"));
+       PRINT_CAMM(args, "answer_noerror", NULL, QPS, QPS_UNIT);
+
+       PRINT_EMPTY_LINE(args);
+
+       // Show the total queries
+       PRINT_LABEL(args, _("Total"));
+       PRINT_CAMM(args, "answer_total", NULL, QPS, QPS_UNIT);
+
+       // Header
+       PRINT_HEADER4(args, _("Current"), _("Average"), _("Minimum"), _("Maximum"));
+
+       return 0;
+}
+
+const td_graph_impl knot_resolver_responses_graph = {
+       .name        = "KnotResolverResponses",
+       .can_render  = knot_resolver_can_render,
+       .render      = knot_resolver_responses_render,
+       .title       = knot_resolver_responses_title,
+       .vlabel      = td_graph_vlabel_qps,
+
+       // Flags
+       .flags   = TELEMETRY_GRAPH_REVERSE,
+
+       // Limits
+       .lower_limit = 0,
+       .upper_limit = LONG_MAX,
+};
index 9a998d341a55f2ffe29befa52c0d0d7a48c3056d..cd8dd09afce7f3fb6a86cacfb096fccb1e8e92e8 100644 (file)
@@ -26,5 +26,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;
 
 #endif /* TELEMETRY_GRAPH_KNOT_RESOLVER_H */