From: sergey.kitov Date: Tue, 20 Apr 2021 14:07:36 +0000 (+0300) Subject: stats: Implement ipc interface for adding and removing metrics X-Git-Tag: 2.3.17~155 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0444b730c2a1e3a9276bd0fcae643ba7e1e832e9;p=thirdparty%2Fdovecot%2Fcore.git stats: Implement ipc interface for adding and removing metrics --- diff --git a/src/stats/client-reader.c b/src/stats/client-reader.c index 529474dcf3..3a6b9305f7 100644 --- a/src/stats/client-reader.c +++ b/src/stats/client-reader.c @@ -9,7 +9,9 @@ #include "ostream.h" #include "master-service.h" #include "stats-metrics.h" +#include "stats-settings.h" #include "client-reader.h" +#include "client-writer.h" struct reader_client { struct connection conn; @@ -149,6 +151,58 @@ reader_client_input_dump_reset(struct reader_client *client, return 1; } +static int +reader_client_input_metrics_add(struct reader_client *client, + const char *const *args) +{ + const char *error; + + if (str_array_length(args) < 7) { + e_error(client->conn.event, "METRICS-ADD: Not enough parameters"); + return -1; + } + + struct stats_metric_settings set = { + .metric_name = args[0], + .description = args[1], + .fields = args[2], + .group_by = args[3], + .filter = args[4], + .exporter = args[5], + .exporter_include = args[6], + }; + o_stream_cork(client->conn.output); + if (stats_metrics_add_dynamic(stats_metrics, &set, &error)) { + client_writer_update_connections(); + o_stream_nsend(client->conn.output, "+", 1); + } else { + o_stream_nsend(client->conn.output, "-", 1); + o_stream_nsend_str(client->conn.output, error); + } + o_stream_nsend(client->conn.output, "\n", 1); + o_stream_uncork(client->conn.output); + return 1; +} + +static int +reader_client_input_metrics_remove(struct reader_client *client, + const char *const *args) +{ + if (str_array_length(args) < 1) { + e_error(client->conn.event, "METRICS-REMOVE: Not enough parameters"); + return -1; + } + + if (stats_metrics_remove_dynamic(stats_metrics, args[0])) { + client_writer_update_connections(); + o_stream_nsend(client->conn.output, "+\n", 2); + } else { + o_stream_nsend_str(client->conn.output, + t_strdup_printf("-metrics '%s' not found\n", args[0])); + } + return 1; +} + static int reader_client_input_args(struct connection *conn, const char *const *args) { @@ -162,6 +216,10 @@ reader_client_input_args(struct connection *conn, const char *const *args) args++; if (strcmp(cmd, "DUMP") == 0) return reader_client_input_dump(client, args); + else if (strcmp(cmd, "METRICS-ADD") == 0) + return reader_client_input_metrics_add(client, args); + else if (strcmp(cmd, "METRICS-REMOVE") == 0) + return reader_client_input_metrics_remove(client, args); else if (strcmp(cmd, "DUMP-RESET") == 0) return reader_client_input_dump_reset(client, args); return 1;