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)
{
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;
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
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
#include "array.h"
/* <settings checks> */
+#include "event-filter.h"
#include <math.h>
/* </settings checks> */
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),
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",
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;
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;
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,
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";
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)
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)
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)
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));
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));