]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: promex: Dump frontends extra counters if requested
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 29 Jan 2024 15:41:24 +0000 (16:41 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 1 Feb 2024 11:00:54 +0000 (12:00 +0100)
Dump extra counter for the frontends. We loop on stats modules and dumped
all concerned counters. The module name is reported with the "mod" label.

addons/promex/service-prometheus.c

index 314e7d25f584ef1ed0d358c9bf0ef2bcbe9258e8..1fe123dd6d23ffaa5b47250d7f970640e70e34a0 100644 (file)
@@ -719,6 +719,67 @@ static int promex_dump_front_metrics(struct appctx *appctx, struct htx *htx)
                ctx->px = proxies_list;
        }
 
+       /* Skip extra counters */
+       if (!(ctx->flags & PROMEX_FL_EXTRA_COUNTERS))
+               goto end;
+
+       if (!ctx->mod) {
+               /* no restart point, get the first module in the list */
+               ctx->mod = LIST_NEXT(&stats_module_list[STATS_DOMAIN_PROXY], typeof(ctx->mod), list);
+               ctx->mod_field_num = 0;
+       }
+
+       list_for_each_entry_from(ctx->mod, &stats_module_list[STATS_DOMAIN_PROXY], list) {
+               void *counters;
+
+               if (!(stats_px_get_cap(ctx->mod->domain_flags) & STATS_PX_CAP_FE)) {
+                       ctx->field_num += ctx->mod->stats_count;
+                       ctx->mod_field_num = 0;
+                       continue;
+               }
+
+               for (;ctx->mod_field_num < ctx->mod->stats_count; ctx->mod_field_num++) {
+                       while (ctx->px) {
+                               struct promex_label labels[PROMEX_MAX_LABELS-1] = {};
+                               struct promex_metric metric;
+
+                               px = ctx->px;
+
+                               labels[0].name  = ist("proxy");
+                               labels[0].value = ist2(px->id, strlen(px->id));
+
+                               labels[1].name  = ist("mod");
+                               labels[1].value = ist2(ctx->mod->name, strlen(ctx->mod->name));
+
+                               /* skip the disabled proxies, global frontend and non-networked ones */
+                               if ((px->flags & PR_FL_DISABLED) || px->uuid <= 0 || !(px->cap & PR_CAP_FE))
+                                       goto next_px2;
+
+                               counters = EXTRA_COUNTERS_GET(px->extra_counters_fe, ctx->mod);
+                               if (!ctx->mod->fill_stats(counters, stats + ctx->field_num, &ctx->mod_field_num))
+                                       return -1;
+
+                               val = stats[ctx->field_num + ctx->mod_field_num];
+                               metric.type = ((val.type == FN_GAUGE) ? PROMEX_MT_GAUGE : PROMEX_MT_COUNTER);
+
+                               if (!promex_dump_metric(appctx, htx, prefix,
+                                                       ist2(ctx->mod->stats[ctx->mod_field_num].name, strlen(ctx->mod->stats[ctx->mod_field_num].name)),
+                                                       ist2(ctx->mod->stats[ctx->mod_field_num].desc, strlen(ctx->mod->stats[ctx->mod_field_num].desc)),
+                                                       &metric, &val, labels, &out, max))
+                                       goto full;
+
+                       next_px2:
+                               ctx->px = px->next;
+                       }
+
+                       ctx->flags |= PROMEX_FL_METRIC_HDR;
+                       ctx->px = proxies_list;
+               }
+
+               ctx->field_num += ctx->mod->stats_count;
+               ctx->mod_field_num = 0;
+       }
+
   end:
        if (out.len) {
                if (!htx_add_data_atonce(htx, out))