]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm stats dump: Add stddev field
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 24 Apr 2018 14:22:00 +0000 (17:22 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 7 Aug 2018 10:19:27 +0000 (13:19 +0300)
Include it in default output as well.

src/doveadm/Makefile.am
src/doveadm/doveadm-stats.c

index 86372505893c70f91c0e76ea4bbc623b4e2b52bc..570f7ac6ffecc4707e7213e0cb375f73c9b238f5 100644 (file)
@@ -50,7 +50,8 @@ doveadm_LDADD = \
        $(LIBDOVECOT_STORAGE) \
        $(LIBDOVECOT) \
        $(LIBSODIUM_LIBS) \
-       $(BINARY_LDFLAGS)
+       $(BINARY_LDFLAGS) \
+       -lm
 
 doveadm_DEPENDENCIES = \
        $(libs) \
@@ -62,7 +63,8 @@ doveadm_server_LDADD = \
        $(libs) \
        $(LIBDOVECOT_STORAGE) \
        $(LIBDOVECOT) \
-       $(BINARY_LDFLAGS)
+       $(BINARY_LDFLAGS) \
+       -lm
 
 doveadm_server_DEPENDENCIES = \
        $(libs) \
index dc47b2bd5aa2431e3e76f16476fbbca8ccdb8a23..53c89562e0e58e84dfee5a54b1093f2c0ac4c6be 100644 (file)
 #include "doveadm.h"
 #include "doveadm-print.h"
 
+#include <math.h>
+
 #define DOVEADM_DUMP_DEFAULT_FIELDS \
-       "count sum min max avg median %95"
+       "count sum min max avg median stddev %95"
+
+enum doveadm_dump_field_type {
+       DOVEADM_DUMP_FIELD_TYPE_PASSTHROUGH = 0,
+       DOVEADM_DUMP_FIELD_TYPE_STDDEV,
+};
 
-static void dump_timing(const char *const **args, unsigned int fields_count)
+static void dump_timing(const char *const **args,
+                       const enum doveadm_dump_field_type field_types[],
+                       unsigned int fields_count)
 {
        unsigned int i, args_count = str_array_length(*args);
 
        if (args_count > fields_count)
                args_count = fields_count;
-       for (i = 0; i < args_count; i++)
-               doveadm_print((*args)[i]);
+       for (i = 0; i < args_count; i++) {
+               const char *value = (*args)[i];
+
+               switch (field_types[i]) {
+               case DOVEADM_DUMP_FIELD_TYPE_PASSTHROUGH:
+                       break;
+               case DOVEADM_DUMP_FIELD_TYPE_STDDEV: {
+                       double variance = strtod(value, NULL);
+                       value = t_strdup_printf("%.02f", sqrt(variance));
+                       break;
+               }
+               }
+               doveadm_print(value);
+       }
        *args += args_count;
 }
 
@@ -29,6 +50,7 @@ static void stats_dump(const char *path, const char *const *fields, bool reset)
        struct istream *input;
        string_t *cmd = t_str_new(128);
        unsigned int i, fields_count = str_array_length(fields);
+       enum doveadm_dump_field_type field_types[fields_count];
        char *line;
        int fd;
 
@@ -36,9 +58,15 @@ static void stats_dump(const char *path, const char *const *fields, bool reset)
        net_set_nonblock(fd, FALSE);
        str_append(cmd, "VERSION\tstats-reader-client\t2\t0\n");
        str_append(cmd, reset ? "DUMP-RESET" : "DUMP");
+       i_zero(field_types);
        for (i = 0; i < fields_count; i++) {
                str_append_c(cmd, '\t');
-               str_append_tabescaped(cmd, fields[i]);
+               if (strcmp(fields[i], "stddev") == 0) {
+                       field_types[i] = DOVEADM_DUMP_FIELD_TYPE_STDDEV;
+                       str_append(cmd, "variance");
+               } else {
+                       str_append_tabescaped(cmd, fields[i]);
+               }
        }
        str_append_c(cmd, '\n');
        if (write_full(fd, str_data(cmd), str_len(cmd)) < 0)
@@ -67,11 +95,11 @@ static void stats_dump(const char *path, const char *const *fields, bool reset)
                        const char *metric_name = args[0];
                        doveadm_print(metric_name); args++;
                        doveadm_print("duration");
-                       dump_timing(&args, fields_count);
+                       dump_timing(&args, field_types, fields_count);
                        while (*args != NULL) {
                                doveadm_print(metric_name);
                                doveadm_print(*args); args++;
-                               dump_timing(&args, fields_count);
+                               dump_timing(&args, field_types, fields_count);
                        }
                } T_END;
        }