stats-metrics.c revision 5f08b0309190ec818d46bfe0e497468b30714a93
b355dcb54194f498921743ca33304eac35d89718Stephen Gallagher/* Copyright (c) 2017 Dovecot authors, see the included COPYING file */
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivanstats_metric_settings_to_query(const struct stats_metric_settings *set,
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan /* generate fields for event filter */
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher const char *const *filters;
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek unsigned int i, count;
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan filter_fields = t_new(struct event_filter_field, count + 1);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan for (i = 0; i < count; i++) {
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher /* add query to the event filter */
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher query_r->categories = t_strsplit_spaces(set->categories, " ");
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher query_r->source_filename = t_strcut(set->source_location, ':');
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher query_r->source_linenum = set->parsed_source_linenum;
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivanstatic void stats_metrics_add_set(struct stats_metrics *metrics,
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan const char *const *fields;
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher metric = p_new(metrics->pool, struct metric, 1);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan metric->name = p_strdup(metrics->pool, set->name);
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher fields = t_strsplit_spaces(set->fields, " ");
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher metric->fields_count = str_array_length(fields);
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher metric->fields = p_new(metrics->pool, struct metric_field,
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher for (unsigned int i = 0; i < metric->fields_count; i++) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher metric->fields[i].stats = stats_dist_init();
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher event_filter_add(metrics->filter, &query);
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagherstats_metrics_add_from_settings(struct stats_metrics *metrics,
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan struct stats_metric_settings *const *metric_setp;
f9fdc87c80f2744780c6a0f2bf5b1b57bcbb095aYuri Chornoivan p_array_init(&metrics->metrics, metrics->pool, 0);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher p_array_init(&metrics->metrics, metrics->pool,
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher array_foreach(&set->metrics, metric_setp) T_BEGIN {
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivanstruct stats_metrics *stats_metrics_init(const struct stats_settings *set)
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan pool_t pool = pool_alloconly_create("stats metrics", 1024);
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher metrics = p_new(pool, struct stats_metrics, 1);
c938f4ba417328fe62eded0806b2d9ca053f34a5Stephen Gallagher stats_metrics_add_from_settings(metrics, set);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivanstatic void stats_metric_free(struct metric *metric)
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher stats_dist_deinit(&metric->duration_stats);
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher for (unsigned int i = 0; i < metric->fields_count; i++)
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan stats_dist_deinit(&metric->fields[i].stats);
f9fdc87c80f2744780c6a0f2bf5b1b57bcbb095aYuri Chornoivanvoid stats_metrics_deinit(struct stats_metrics **_metrics)
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher struct stats_metrics *metrics = *_metrics;
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivanvoid stats_metrics_reset(struct stats_metrics *metrics)
c938f4ba417328fe62eded0806b2d9ca053f34a5Stephen Gallagher array_foreach(&metrics->metrics, metricp) {
c938f4ba417328fe62eded0806b2d9ca053f34a5Stephen Gallagher stats_dist_reset((*metricp)->duration_stats);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan for (unsigned int i = 0; i < (*metricp)->fields_count; i++)
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher stats_dist_reset((*metricp)->fields[i].stats);
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagherstats_metrics_get_event_filter(struct stats_metrics *metrics)
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagherstats_metric_event(struct metric *metric, struct event *event)
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan if (event_get_last_send_time(event, &tv_end)) {
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher duration = timeval_diff_usecs(&tv_end, &tv_start);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan stats_dist_add(metric->duration_stats, duration);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan for (unsigned int i = 0; i < metric->fields_count; i++) {
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan event_find_field(event, metric->fields[i].field_key);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan num = field->value.timeval.tv_sec * 1000000ULL +
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan stats_dist_add(metric->fields[i].stats, num);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivanvoid stats_metrics_event(struct stats_metrics *metrics, struct event *event)
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan iter = event_filter_match_iter_init(metrics->filter, event);
f9fdc87c80f2744780c6a0f2bf5b1b57bcbb095aYuri Chornoivan while ((metric = event_filter_match_iter_next(iter)) != NULL)
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan unsigned int idx;
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivanstats_metrics_iterate_init(struct stats_metrics *metrics)
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher iter = i_new(struct stats_metrics_iter, 1);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivanconst struct metric *stats_metrics_iterate(struct stats_metrics_iter *iter)
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan unsigned int count;
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher metrics = array_get(&iter->metrics->metrics, &count);