]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
stats: replace metric { } filtering with the common filter language
authorJosef 'Jeff' Sipek <jeff.sipek@open-xchange.com>
Tue, 21 Apr 2020 14:32:32 +0000 (10:32 -0400)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 26 Jun 2020 07:18:18 +0000 (07:18 +0000)
src/stats/stats-metrics.c
src/stats/stats-settings.c
src/stats/stats-settings.h
src/stats/test-client-reader.c
src/stats/test-client-writer.c
src/stats/test-stats-metrics.c

index 55a44a50e82795bd914cfca0aa3dfb0e6777099c..ea5083deb0d65a952c7332108d9090da48203d42 100644 (file)
@@ -27,37 +27,6 @@ stats_metric_event(struct metric *metric, struct event *event, pool_t pool);
 static struct metric *
 stats_metric_sub_metric_alloc(struct metric *metric, const char *name, pool_t pool);
 
-static void
-stats_metric_settings_to_query(const struct stats_metric_settings *set,
-                              struct event_filter_query *query_r)
-{
-       i_zero(query_r);
-
-       /* generate fields for event filter */
-       if (array_is_created(&set->filter)) {
-               struct event_filter_field *filter_fields;
-               const char *const *filters;
-               unsigned int i, count;
-
-               filters = array_get(&set->filter, &count);
-               i_assert(count % 2 == 0);
-               count /= 2;
-
-               filter_fields = t_new(struct event_filter_field, count + 1);
-               for (i = 0; i < count; i++) {
-                       filter_fields[i].key = filters[i*2];
-                       filter_fields[i].value = filters[i*2+1];
-               }
-               query_r->fields = filter_fields;
-       }
-
-       /* add query to the event filter */
-       query_r->categories = t_strsplit_spaces(set->categories, " ");
-       query_r->name = set->event_name;
-       query_r->source_filename = t_strcut(set->source_location, ':');
-       query_r->source_linenum = set->parsed_source_linenum;
-}
-
 static void stats_exporters_add_set(struct stats_metrics *metrics,
                                    const struct stats_exporter_settings *set)
 {
@@ -131,7 +100,6 @@ stats_metric_alloc(pool_t pool, const char *name,
 static void stats_metrics_add_set(struct stats_metrics *metrics,
                                  const struct stats_metric_settings *set)
 {
-       struct event_filter_query query;
        struct exporter *const *exporter;
        struct metric *metric;
        const char *const *fields;
@@ -146,10 +114,8 @@ static void stats_metrics_add_set(struct stats_metrics *metrics,
 
        array_push_back(&metrics->metrics, &metric);
 
-       stats_metric_settings_to_query(set, &query);
-       query.context = metric;
-       event_filter_add(metrics->stats_filter, &query);
-       event_filter_add(metrics->combined_filter, &query);
+       event_filter_merge_with_context(metrics->stats_filter, set->parsed_filter, metric);
+       event_filter_merge_with_context(metrics->combined_filter, set->parsed_filter, metric);
 
        /*
         * Done with statistics setup, now onto exporter setup
@@ -188,8 +154,7 @@ static void stats_metrics_add_set(struct stats_metrics *metrics,
                        i_warning("Ignoring unknown exporter include '%s'", *tmp);
        }
 
-       /* query already constructed */
-       event_filter_add(metrics->export_filter, &query);
+       event_filter_merge_with_context(metrics->export_filter, set->parsed_filter, metric);
 }
 
 static void
index 6451fb45692975a628127c378bae635f16bacfe1..b9ae1decca10d4c3d83b88aa2872106c50e82a5c 100644 (file)
@@ -8,6 +8,7 @@
 #include "array.h"
 
 /* <settings checks> */
+#include "event-filter.h"
 #include <math.h>
 /* </settings checks> */
 
@@ -102,12 +103,9 @@ const struct setting_parser_info stats_exporter_setting_parser_info = {
 
 static const struct setting_define stats_metric_setting_defines[] = {
        DEF(SET_STR, metric_name),
-       DEF(SET_STR, event_name),
-       DEF(SET_STR, source_location),
-       DEF(SET_STR, categories),
        DEF(SET_STR, fields),
        DEF(SET_STR, group_by),
-       { SET_STRLIST, "filter", offsetof(struct stats_metric_settings, filter), NULL },
+       DEF(SET_STR, filter),
        DEF(SET_STR, exporter),
        DEF(SET_STR, exporter_include),
        DEF(SET_STR, description),
@@ -116,10 +114,8 @@ static const struct setting_define stats_metric_setting_defines[] = {
 
 static const struct stats_metric_settings stats_metric_default_settings = {
        .metric_name = "",
-       .event_name = "",
-       .source_location = "",
-       .categories = "",
        .fields = "",
+       .filter = "",
        .exporter = "",
        .group_by = "",
        .exporter_include = "name hostname timestamps categories fields",
@@ -479,23 +475,15 @@ static bool parse_metric_group_by(struct stats_metric_settings *set,
 static bool stats_metric_settings_check(void *_set, pool_t pool, const char **error_r)
 {
        struct stats_metric_settings *set = _set;
-       const char *p;
 
        if (set->metric_name[0] == '\0') {
                *error_r = "Metric name can't be empty";
                return FALSE;
        }
-       if (set->source_location[0] != '\0') {
-               if ((p = strchr(set->source_location, ':')) == NULL) {
-                       *error_r = "source_location is missing ':'";
-                       return FALSE;
-               }
-               if (str_to_uint(p+1, &set->parsed_source_linenum) < 0 ||
-                   set->parsed_source_linenum == 0) {
-                       *error_r = "source_location has invalid line number after ':'";
-                       return FALSE;
-               }
-       }
+
+       set->parsed_filter = event_filter_create_fragment(pool);
+       if (event_filter_parse(set->filter, set->parsed_filter, error_r) < 0)
+               return FALSE;
 
        if (!parse_metric_group_by(set, pool, error_r))
                return FALSE;
index db1b72c5769e284d3152c979acfe608a83db8e0b..393f9c67aa56fb684590b27afaf348ba16083976 100644 (file)
@@ -97,15 +97,12 @@ struct stats_metric_settings_group_by {
 struct stats_metric_settings {
        const char *metric_name;
        const char *description;
-       const char *event_name;
-       const char *source_location;
-       const char *categories;
        const char *fields;
        const char *group_by;
-       ARRAY(const char *) filter;
+       const char *filter;
 
-       unsigned int parsed_source_linenum;
        ARRAY(struct stats_metric_settings_group_by) parsed_group_by;
+       struct event_filter *parsed_filter;
 
        /* exporter related fields */
        const char *exporter;
index 9ad4016b62869f467fae81587d06b2f51b908b7c..bf5a15471f46a94b0a49ae9c723052b6ffb63695 100644 (file)
@@ -47,7 +47,7 @@ bool test_stats_callback(struct event *event,
 static const char *settings_blob_1 =
 "metric=test\n"
 "metric/test/metric_name=test\n"
-"metric/test/event_name=test\n"
+"metric/test/filter=event:test\n"
 "\n";
 
 static int test_reader_server_input_args(struct connection *conn ATTR_UNUSED,
@@ -126,7 +126,7 @@ static void test_client_reader(void)
 static const char *settings_blob_2 =
 "metric=test\n"
 "metric/test/metric_name=test\n"
-"metric/test/event_name=test\n"
+"metric/test/filter=event:test\n"
 "metric/test/group_by=test_name\n"
 "\n";
 
index 265a06aab804ae39b5ee29384d0f5330b0d93d9c..743846a9feabdabc7cdb76737a2d02c59df85577 100644 (file)
@@ -100,7 +100,7 @@ bool test_stats_callback(struct event *event,
 static const char *settings_blob_1 =
 "metric=test\n"
 "metric/test/metric_name=test\n"
-"metric/test/event_name=test\n"
+"metric/test/filter=event:test\n"
 "\n";
 
 static void test_client_writer(void)
index 1a2b270c193467ac26959218d86f3fffb4d2b88d..bb1232e823606d6f754bd6f3900b0ad657719c14 100644 (file)
@@ -20,7 +20,7 @@ bool test_stats_callback(struct event *event,
 static const char *settings_blob_1 =
 "metric=test\n"
 "metric/test/metric_name=test\n"
-"metric/test/event_name=test\n"
+"metric/test/filter=event:test\n"
 "\n";
 
 static void test_stats_metrics(void)
@@ -47,9 +47,7 @@ static void test_stats_metrics(void)
 static const char *settings_blob_2 =
 "metric=test\n"
 "metric/test/metric_name=test\n"
-"metric/test/event_name=test\n"
-"metric/test/filter=\n"
-"metric/test/filter/test_field=value\n"
+"metric/test/filter=(event:test field:test_field=value)\n"
 "\n";
 
 static void test_stats_metrics_filter(void)
@@ -169,7 +167,7 @@ static void test_stats_metrics_group_by_discrete_real(const struct discrete_test
 
        test_init(t_strdup_printf("metric=test\n"
                                  "metric/test/metric_name=test\n"
-                                 "metric/test/event_name=test\n"
+                                 "metric/test/filter=event:test\n"
                                  "metric/test/group_by=%s\n"
                                  "\n", test->settings_blob));
 
@@ -345,7 +343,7 @@ static void test_stats_metrics_group_by_quantized_real(const struct quantized_te
 
        test_init(t_strdup_printf("metric=test\n"
                                  "metric/test/metric_name=test\n"
-                                 "metric/test/event_name=test\n"
+                                 "metric/test/filter=event:test\n"
                                  "metric/test/group_by=test_name foobar:%s\n"
                                  "\n", test->settings_blob));