]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: stats: support clear counters for dynamic stats
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Mon, 5 Oct 2020 09:49:43 +0000 (11:49 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Mon, 5 Oct 2020 10:02:14 +0000 (12:02 +0200)
Add a boolean 'clearable' on stats module structure. If set, it forces
all the counters to be reset on 'clear counters' cli command. If not,
the counters are reset only when 'clear counters all' is used.

include/haproxy/stats-t.h
src/stats.c

index 3be2b4a6ae15540092a17330901775c064c4d1b2..96dcf18d8975f8cec933f21916124f15ebf15aa6 100644 (file)
@@ -477,6 +477,7 @@ struct stats_module {
        size_t counters_size;    /* sizeof counters */
 
        uint32_t domain_flags;   /* stats application domain for this module */
+       char clearable;          /* reset on a clear counters */
 };
 
 struct extra_counters {
index 12b5945084a9378946950c96d3689541af0e2ead..2042687f0475a51857bdac7c6a33e0ebaa646773 100644 (file)
@@ -3963,6 +3963,7 @@ static int cli_parse_clear_counters(char **args, char *payload, struct appctx *a
        struct proxy *px;
        struct server *sv;
        struct listener *li;
+       struct stats_module *mod;
        int clrall = 0;
 
        if (strcmp(args[2], "all") == 0)
@@ -4023,6 +4024,47 @@ static int cli_parse_clear_counters(char **args, char *payload, struct appctx *a
        global.ssl_fe_keys_max = 0;
        global.ssl_be_keys_max = 0;
 
+       list_for_each_entry(mod, &stats_module_list[STATS_DOMAIN_PROXY], list) {
+               if (!mod->clearable && !clrall)
+                       continue;
+
+               for (px = proxies_list; px; px = px->next) {
+                       enum stats_domain_px_cap mod_cap = stats_px_get_cap(mod->domain_flags);
+
+                       if (px->cap & PR_CAP_FE && mod_cap & STATS_PX_CAP_FE) {
+                               EXTRA_COUNTERS_INIT(px->extra_counters_fe,
+                                                   mod,
+                                                   mod->counters,
+                                                   mod->counters_size);
+                       }
+
+                       if (px->cap & PR_CAP_BE && mod_cap & STATS_PX_CAP_BE) {
+                               EXTRA_COUNTERS_INIT(px->extra_counters_be,
+                                                   mod,
+                                                   mod->counters,
+                                                   mod->counters_size);
+                       }
+
+                       if (mod_cap & STATS_PX_CAP_SRV) {
+                               for (sv = px->srv; sv; sv = sv->next) {
+                                       EXTRA_COUNTERS_INIT(sv->extra_counters,
+                                                           mod,
+                                                           mod->counters,
+                                                           mod->counters_size);
+                               }
+                       }
+
+                       if (mod_cap & STATS_PX_CAP_LI) {
+                               list_for_each_entry(li, &px->conf.listeners, by_fe) {
+                                       EXTRA_COUNTERS_INIT(li->extra_counters,
+                                                           mod,
+                                                           mod->counters,
+                                                           mod->counters_size);
+                               }
+                       }
+               }
+       }
+
        memset(activity, 0, sizeof(activity));
        return 1;
 }