]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
stats: Split off stats_metric_get_sub_metric()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 19 Mar 2021 11:02:54 +0000 (13:02 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 29 Sep 2021 10:09:58 +0000 (10:09 +0000)
src/stats/stats-metrics.c

index 593dcd4b9a379de911468bcd9dc5695aa12c136c..46283b06cfa5c73c6f8a0f2f5cdfad69b8d8b46a 100644 (file)
@@ -477,47 +477,67 @@ stats_metric_group_by_value_label(const struct event_field *field,
        i_unreached();
 }
 
+static struct metric *
+stats_metric_get_sub_metric(struct metric *metric,
+                           const struct event_field *field,
+                           const struct metric_value *value,
+                           pool_t pool)
+{
+       struct metric *sub_metric;
+
+       sub_metric = stats_metric_find_sub_metric(metric, value);
+       if (sub_metric != NULL)
+               return sub_metric;
+
+       T_BEGIN {
+               const char *value_label =
+                       stats_metric_group_by_value_label(field,
+                               &metric->group_by[0], value);
+               sub_metric = stats_metric_sub_metric_alloc(metric, value_label,
+                                                          pool);
+       } T_END;
+       if (metric->group_by_count > 1) {
+               sub_metric->group_by_count = metric->group_by_count - 1;
+               sub_metric->group_by = &metric->group_by[1];
+       }
+       sub_metric->group_value.type = value->type;
+       sub_metric->group_value.intmax = value->intmax;
+       memcpy(sub_metric->group_value.hash, value->hash, SHA1_RESULTLEN);
+       return sub_metric;
+}
+
 static void
-stats_metric_group_by(struct metric *metric, struct event *event, pool_t pool)
+stats_metric_group_by_field(struct metric *metric, struct event *event,
+                           const struct event_field *field, pool_t pool)
 {
-       const struct stats_metric_settings_group_by *group_by = &metric->group_by[0];
-       const struct event_field *field =
-               event_find_field_recursive(event, group_by->field);
        struct metric *sub_metric;
        struct metric_value value;
 
-       /* ignore missing field */
-       if (field == NULL)
-               return;
-
-       if (!stats_metric_group_by_get_value(field, group_by, &value))
+       if (!stats_metric_group_by_get_value(field, &metric->group_by[0], &value))
                return;
 
        if (!array_is_created(&metric->sub_metrics))
                p_array_init(&metric->sub_metrics, pool, 8);
-
-       sub_metric = stats_metric_find_sub_metric(metric, &value);
-
-       if (sub_metric == NULL) T_BEGIN {
-               const char *value_label =
-                       stats_metric_group_by_value_label(field, group_by,
-                                                         &value);
-               sub_metric = stats_metric_sub_metric_alloc(metric, value_label,
-                                                          pool);
-               if (metric->group_by_count > 1) {
-                       sub_metric->group_by_count = metric->group_by_count - 1;
-                       sub_metric->group_by = &metric->group_by[1];
-               }
-               sub_metric->group_value.type = value.type;
-               sub_metric->group_value.intmax = value.intmax;
-               memcpy(sub_metric->group_value.hash, value.hash, SHA1_RESULTLEN);
-       } T_END;
+       sub_metric = stats_metric_get_sub_metric(metric, field, &value, pool);
 
        /* sub-metrics are recursive, so each sub-metric can have additional
           sub-metrics. */
        stats_metric_event(sub_metric, event, pool);
 }
 
+static void
+stats_metric_group_by(struct metric *metric, struct event *event, pool_t pool)
+{
+       const struct event_field *field =
+               event_find_field_recursive(event, metric->group_by[0].field);
+
+       /* ignore missing field */
+       if (field == NULL)
+               return;
+
+       stats_metric_group_by_field(metric, event, field, pool);
+}
+
 static void
 stats_metric_event_field(struct event *event, const char *fieldname,
                         struct stats_dist *stats)