]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Add 'stats add' and 'stats remove' commands
authorsergey.kitov <sergey.kitov@open-xchange.com>
Thu, 27 May 2021 08:46:02 +0000 (11:46 +0300)
committersergey.kitov <sergey.kitov@open-xchange.com>
Fri, 3 Sep 2021 12:44:32 +0000 (15:44 +0300)
src/doveadm/Makefile.am
src/doveadm/doveadm-cmd.c
src/doveadm/doveadm-cmd.h
src/doveadm/doveadm-stats.c

index 21276b6c904f1922123c56fcd2e47e024061f921..440af73e37c5e00e58487f7dcfee828a08bfb406 100644 (file)
@@ -24,6 +24,7 @@ AM_CPPFLAGS = \
        -I$(top_srcdir)/src/lib-http \
        -I$(top_srcdir)/src/lib-dcrypt \
        -I$(top_srcdir)/src/auth \
+       -I$(top_srcdir)/src/stats \
        -DMODULEDIR=\""$(moduledir)"\" \
        -DAUTH_MODULE_DIR=\""$(moduledir)/auth"\" \
        -DDOVEADM_MODULEDIR=\""$(doveadm_moduledir)"\" \
index 2cfc2220eae94634e4f3ed8ce8ce7768e3e8470d..5de976d2c3bb2d17b16a0c32d034b8fa65d11359 100644 (file)
@@ -22,6 +22,8 @@ static struct doveadm_cmd_ver2 *doveadm_commands_ver2[] = {
        &doveadm_cmd_stop_ver2,
        &doveadm_cmd_reload_ver2,
        &doveadm_cmd_stats_dump_ver2,
+       &doveadm_cmd_stats_add_ver2,
+       &doveadm_cmd_stats_remove_ver2,
        &doveadm_cmd_oldstats_dump_ver2,
        &doveadm_cmd_oldstats_reset_ver2,
        &doveadm_cmd_penalty_ver2,
index a53d340d5af73a72d81ee01ecd4a78bb4c065d17..a988575e119925e42720d2f647d11849173e31be 100644 (file)
@@ -138,6 +138,8 @@ extern struct doveadm_cmd_ver2 doveadm_cmd_process_status_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_stop_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_reload_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_stats_dump_ver2;
+extern struct doveadm_cmd_ver2 doveadm_cmd_stats_add_ver2;
+extern struct doveadm_cmd_ver2 doveadm_cmd_stats_remove_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_mutf7;
 extern struct doveadm_cmd_ver2 doveadm_cmd_oldstats_reset_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_oldstats_dump_ver2;
index 360c73fe0f2d6151979262b96f8212f8f1d74d4f..a8ab6c1526badcafe439f8b9eaa057b61e9a7f89 100644 (file)
@@ -9,6 +9,7 @@
 #include "master-service.h"
 #include "doveadm.h"
 #include "doveadm-print.h"
+#include "stats-settings.h"
 
 #include <math.h>
 
@@ -40,8 +41,11 @@ struct stats_cmd_vfuncs {
 };
 
 static int build_stats_dump_cmd(struct stats_cmd_context *ctx, const char **error_r);
+static int build_stats_add_cmd(struct stats_cmd_context *ctx, const char **error_r);
+static int build_stats_remove_cmd(struct stats_cmd_context *ctx, const char **error_r);
 
 static void stats_dump_process_response(struct stats_cmd_context *ctx);
+static void stats_modify_process_response(struct stats_cmd_context *ctx);
 
 static void stats_send_cmd(struct stats_cmd_context *ctx);
 
@@ -50,6 +54,15 @@ static struct stats_cmd_vfuncs dump_vfuncs = {
        .process_response = stats_dump_process_response
 };
 
+static struct stats_cmd_vfuncs add_vfuncs = {
+       .build_cmd = build_stats_add_cmd,
+       .process_response = stats_modify_process_response
+};
+
+static struct stats_cmd_vfuncs remove_vfuncs = {
+       .build_cmd = build_stats_remove_cmd,
+       .process_response = stats_modify_process_response
+};
 
 static string_t *init_stats_cmd(void)
 {
@@ -196,11 +209,94 @@ static void stats_dump_process_response(struct stats_cmd_context *ctx)
                handle_disconnection(ctx);
 }
 
+static int build_stats_add_cmd(struct stats_cmd_context *ctx,
+                              const char **error_r)
+{
+       unsigned int i;
+       const char *parameter;
+       struct {
+               const char *name;
+               const char *default_val;
+       } params[] = {
+               { "name", "" },
+               { "description", "" },
+               { "fields", "" },
+               { "group_by", "" },
+               { "filter", "" },
+               { "exporter", "" },
+               /* Default exporter-include is to be modified
+                  together with stats-settings */
+               { "exporter-include",
+                 STATS_METRIC_SETTINGS_DEFAULT_EXPORTER_INCLUDE },
+       };
+
+       ctx->cmd = init_stats_cmd();
+       str_append(ctx->cmd, "METRICS-ADD");
+
+       for (i = 0; i < N_ELEMENTS(params); i++) {
+               if (!doveadm_cmd_param_str(ctx->cctx, params[i].name, &parameter))
+                       parameter = params[i].default_val;
+               if (parameter[0] == '\0' &&
+                   (strcmp(params[i].name, "name") == 0 ||
+                    strcmp(params[i].name, "filter") == 0)) {
+                       *error_r =
+                               t_strdup_printf("stats add: missing %s parameter",
+                                               params[i].name);
+                       return -1;
+               }
+               str_append_c(ctx->cmd, '\t');
+               str_append_tabescaped(ctx->cmd, parameter);
+       }
+
+       str_append_c(ctx->cmd, '\n');
+       return 0;
+}
+
+static void stats_modify_process_response(struct stats_cmd_context *ctx)
+{
+       const char *line = i_stream_read_next_line(ctx->input);
+       if (line == NULL) {
+               handle_disconnection(ctx);
+               return;
+       }
+       if (line[0] == '-')
+               i_error("%s", ++line);
+       else if (line[0] != '+')
+               i_error("Invalid response: %s", line);
+}
+
+static int build_stats_remove_cmd(struct stats_cmd_context *ctx,
+                                 const char **error_r)
+{
+       const char *name;
+
+       ctx->cmd = init_stats_cmd();
+       str_append(ctx->cmd, "METRICS-REMOVE\t");
+
+       if (!doveadm_cmd_param_str(ctx->cctx, "name", &name)) {
+               *error_r = "stats remove: missing name parameter";
+               return -1;
+       }
+       str_append_tabescaped(ctx->cmd, name);
+       str_append_c(ctx->cmd, '\n');
+       return 0;
+}
+
 static void doveadm_cmd_stats_dump(struct doveadm_cmd_context *cctx)
 {
        stats_exec_cmd(cctx, &dump_vfuncs);
 }
 
+static void doveadm_cmd_stats_add(struct doveadm_cmd_context *cctx)
+{
+       stats_exec_cmd(cctx, &add_vfuncs);
+}
+
+static void doveadm_cmd_stats_remove(struct doveadm_cmd_context *cctx)
+{
+       stats_exec_cmd(cctx, &remove_vfuncs);
+}
+
 struct doveadm_cmd_ver2 doveadm_cmd_stats_dump_ver2 = {
        .cmd = doveadm_cmd_stats_dump,
        .name = "stats dump",
@@ -211,3 +307,27 @@ DOVEADM_CMD_PARAM('r', "reset", CMD_PARAM_BOOL, 0)
 DOVEADM_CMD_PARAM('f', "fields", CMD_PARAM_STR, 0)
 DOVEADM_CMD_PARAMS_END
 };
+
+struct doveadm_cmd_ver2 doveadm_cmd_stats_add_ver2 = {
+       .cmd = doveadm_cmd_stats_add,
+       .name = "stats add",
+       .usage = "[--description <string>] [--exporter <name> [--exporter-include <fields>]] [--fields <fields>] [--group_by <fields>] <name> <filter>",
+DOVEADM_CMD_PARAMS_START
+DOVEADM_CMD_PARAM('\0', "name", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
+DOVEADM_CMD_PARAM('\0', "filter", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
+DOVEADM_CMD_PARAM('\0', "exporter", CMD_PARAM_STR, 0)
+DOVEADM_CMD_PARAM('\0', "exporter-include", CMD_PARAM_STR, 0)
+DOVEADM_CMD_PARAM('\0', "description", CMD_PARAM_STR, 0)
+DOVEADM_CMD_PARAM('\0', "fields", CMD_PARAM_STR, 0)
+DOVEADM_CMD_PARAM('\0', "group-by", CMD_PARAM_STR, 0)
+DOVEADM_CMD_PARAMS_END
+};
+
+struct doveadm_cmd_ver2 doveadm_cmd_stats_remove_ver2 = {
+       .cmd = doveadm_cmd_stats_remove,
+       .name = "stats remove",
+       .usage = "<name>",
+DOVEADM_CMD_PARAMS_START
+DOVEADM_CMD_PARAM('\0', "name", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
+DOVEADM_CMD_PARAMS_END
+};