]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
stats: Implement ipc interface for adding and removing metrics
authorsergey.kitov <sergey.kitov@open-xchange.com>
Tue, 20 Apr 2021 14:07:36 +0000 (17:07 +0300)
committersergey.kitov <sergey.kitov@open-xchange.com>
Fri, 3 Sep 2021 12:44:32 +0000 (15:44 +0300)
src/stats/client-reader.c

index 529474dcf3f6eb6973c983765823e77ec560b5c3..3a6b9305f76aaf6607ed13cc567b40c2118dd9f4 100644 (file)
@@ -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;