diff --git a/addons/promex/service-prometheus.c b/addons/promex/service-prometheus.c index f7c86835d..5cdad6a4a 100644 --- a/addons/promex/service-prometheus.c +++ b/addons/promex/service-prometheus.c @@ -875,6 +875,78 @@ static int promex_dump_listener_metrics(struct appctx *appctx, struct htx *htx) ctx->li = LIST_NEXT(&proxies_list->conf.listeners, struct listener *, by_fe); } + /* 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_LI)) { + 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)); + + /* 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; + + li = ctx->li; + list_for_each_entry_from(li, &px->conf.listeners, by_fe) { + if (!li->counters) + continue; + + labels[1].name = ist("listener"); + labels[1].value = ist2(li->name, strlen(li->name)); + + labels[2].name = ist("mod"); + labels[2].value = ist2(ctx->mod->name, strlen(ctx->mod->name)); + + counters = EXTRA_COUNTERS_GET(li->extra_counters, 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->li = (ctx->px ? LIST_NEXT(&ctx->px->conf.listeners, struct listener *, by_fe) : NULL); + } + + ctx->flags |= PROMEX_FL_METRIC_HDR; + ctx->px = proxies_list; + ctx->li = LIST_NEXT(&proxies_list->conf.listeners, struct listener *, by_fe); + } + + ctx->field_num += ctx->mod->stats_count; + ctx->mod_field_num = 0; + } + end: if (out.len) { if (!htx_add_data_atonce(htx, out))