.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,
+};