use `stats_fill_be_stats` when possible to avoid duplicating code; make use of field selector to get the needed field only.
the only difference is on `haproxy_backend_downtime_seconds_total` as stats.c is testing `px->srv`. This behaviour is present since commit 7344f4789321ef8ce2ce17cf73dabd672f7c8c6 ("MINOR: stats: only report backend's down time if it has servers"). The end result is a NaN instead of a zero when no server are present. Signed-off-by: William Dauchy <wdau...@gmail.com> --- .../prometheus-exporter/service-prometheus.c | 163 ++---------------- 1 file changed, 15 insertions(+), 148 deletions(-) diff --git a/contrib/prometheus-exporter/service-prometheus.c b/contrib/prometheus-exporter/service-prometheus.c index bc9ebf3fc..12fe3ee90 100644 --- a/contrib/prometheus-exporter/service-prometheus.c +++ b/contrib/prometheus-exporter/service-prometheus.c @@ -685,8 +685,8 @@ static int promex_dump_back_metrics(struct appctx *appctx, struct htx *htx) struct channel *chn = si_ic(appctx->owner); struct ist out = ist2(trash.area, 0); size_t max = htx_get_max_blksz(htx, channel_htx_recv_max(chn, htx)); + struct field *stats = stat_l[STATS_DOMAIN_PROXY]; int ret = 1; - uint32_t weight; double secs; for (;appctx->st2 < ST_F_TOTAL_FIELDS; appctx->st2++) { @@ -700,46 +700,13 @@ static int promex_dump_back_metrics(struct appctx *appctx, struct htx *htx) if (px->disabled || px->uuid <= 0 || !(px->cap & PR_CAP_BE)) goto next_px; + if (!stats_fill_be_stats(px, 0, stats, ST_F_TOTAL_FIELDS, &(appctx->st2))) + return -1; + switch (appctx->st2) { case ST_F_STATUS: val = mkf_u32(FO_STATUS, (px->lbprm.tot_weight > 0 || !px->srv) ? 1 : 0); break; - case ST_F_SCUR: - val = mkf_u32(0, px->beconn); - break; - case ST_F_SMAX: - val = mkf_u32(FN_MAX, px->be_counters.conn_max); - break; - case ST_F_SLIM: - val = mkf_u32(FO_CONFIG|FN_LIMIT, px->fullconn); - break; - case ST_F_STOT: - val = mkf_u64(FN_COUNTER, px->be_counters.cum_conn); - break; - case ST_F_RATE_MAX: - val = mkf_u32(0, px->be_counters.sps_max); - break; - case ST_F_LASTSESS: - val = mkf_s32(FN_AGE, be_lastsession(px)); - break; - case ST_F_QCUR: - val = mkf_u32(0, px->nbpend); - break; - case ST_F_QMAX: - val = mkf_u32(FN_MAX, px->be_counters.nbpend_max); - break; - case ST_F_CONNECT: - val = mkf_u64(FN_COUNTER, px->be_counters.connect); - break; - case ST_F_REUSE: - val = mkf_u64(FN_COUNTER, px->be_counters.reuse); - break; - case ST_F_BIN: - val = mkf_u64(FN_COUNTER, px->be_counters.bytes_in); - break; - case ST_F_BOUT: - val = mkf_u64(FN_COUNTER, px->be_counters.bytes_out); - break; case ST_F_QTIME: secs = (double)swrate_avg(px->be_counters.q_time, TIME_STATS_SAMPLES) / 1000.0; val = mkf_flt(FN_AVG, secs); @@ -772,139 +739,39 @@ static int promex_dump_back_metrics(struct appctx *appctx, struct htx *htx) secs = (double)px->be_counters.ttime_max / 1000.0; val = mkf_flt(FN_MAX, secs); break; - case ST_F_DREQ: - val = mkf_u64(FN_COUNTER, px->be_counters.denied_req); - break; - case ST_F_DRESP: - val = mkf_u64(FN_COUNTER, px->be_counters.denied_resp); - break; - case ST_F_ECON: - val = mkf_u64(FN_COUNTER, px->be_counters.failed_conns); - break; - case ST_F_ERESP: - val = mkf_u64(FN_COUNTER, px->be_counters.failed_resp); - break; - case ST_F_WRETR: - val = mkf_u64(FN_COUNTER, px->be_counters.retries); - break; - case ST_F_WREDIS: - val = mkf_u64(FN_COUNTER, px->be_counters.redispatches); - break; - case ST_F_WREW: - val = mkf_u64(FN_COUNTER, px->be_counters.failed_rewrites); - break; - case ST_F_EINT: - val = mkf_u64(FN_COUNTER, px->be_counters.internal_errors); - break; - case ST_F_CLI_ABRT: - val = mkf_u64(FN_COUNTER, px->be_counters.cli_aborts); - break; - case ST_F_SRV_ABRT: - val = mkf_u64(FN_COUNTER, px->be_counters.srv_aborts); - break; - case ST_F_WEIGHT: - weight = (px->lbprm.tot_weight * px->lbprm.wmult + px->lbprm.wdiv - 1) / px->lbprm.wdiv; - val = mkf_u32(FN_AVG, weight); - break; - case ST_F_ACT: - val = mkf_u32(0, px->srv_act); - break; - case ST_F_BCK: - val = mkf_u32(0, px->srv_bck); - break; - case ST_F_CHKDOWN: - val = mkf_u64(FN_COUNTER, px->down_trans); - break; - case ST_F_LASTCHG: - val = mkf_u32(FN_AGE, now.tv_sec - px->last_change); - break; - case ST_F_DOWNTIME: - val = mkf_u32(FN_COUNTER, be_downtime(px)); - break; - case ST_F_LBTOT: - val = mkf_u64(FN_COUNTER, px->be_counters.cum_lbconn); - break; case ST_F_REQ_TOT: - if (px->mode != PR_MODE_HTTP) - goto next_px; - val = mkf_u64(FN_COUNTER, px->be_counters.p.http.cum_req); - break; case ST_F_HRSP_1XX: + case ST_F_CACHE_LOOKUPS: + case ST_F_CACHE_HITS: + case ST_F_COMP_IN: + case ST_F_COMP_OUT: + case ST_F_COMP_BYP: + case ST_F_COMP_RSP: if (px->mode != PR_MODE_HTTP) goto next_px; - val = mkf_u64(FN_COUNTER, px->be_counters.p.http.rsp[1]); + val = stats[appctx->st2]; break; case ST_F_HRSP_2XX: - if (px->mode != PR_MODE_HTTP) - goto next_px; - appctx->ctx.stats.flags &= ~PROMEX_FL_METRIC_HDR; - val = mkf_u64(FN_COUNTER, px->be_counters.p.http.rsp[2]); - break; case ST_F_HRSP_3XX: - if (px->mode != PR_MODE_HTTP) - goto next_px; - appctx->ctx.stats.flags &= ~PROMEX_FL_METRIC_HDR; - val = mkf_u64(FN_COUNTER, px->be_counters.p.http.rsp[3]); - break; case ST_F_HRSP_4XX: - if (px->mode != PR_MODE_HTTP) - goto next_px; - appctx->ctx.stats.flags &= ~PROMEX_FL_METRIC_HDR; - val = mkf_u64(FN_COUNTER, px->be_counters.p.http.rsp[4]); - break; case ST_F_HRSP_5XX: - if (px->mode != PR_MODE_HTTP) - goto next_px; - appctx->ctx.stats.flags &= ~PROMEX_FL_METRIC_HDR; - val = mkf_u64(FN_COUNTER, px->be_counters.p.http.rsp[5]); - break; case ST_F_HRSP_OTHER: if (px->mode != PR_MODE_HTTP) goto next_px; appctx->ctx.stats.flags &= ~PROMEX_FL_METRIC_HDR; - val = mkf_u64(FN_COUNTER, px->be_counters.p.http.rsp[0]); - break; - case ST_F_CACHE_LOOKUPS: - if (px->mode != PR_MODE_HTTP) - goto next_px; - val = mkf_u64(FN_COUNTER, px->be_counters.p.http.cache_lookups); - break; - case ST_F_CACHE_HITS: - if (px->mode != PR_MODE_HTTP) - goto next_px; - val = mkf_u64(FN_COUNTER, px->be_counters.p.http.cache_hits); - break; - case ST_F_COMP_IN: - if (px->mode != PR_MODE_HTTP) - goto next_px; - val = mkf_u64(FN_COUNTER, px->be_counters.comp_in); - break; - case ST_F_COMP_OUT: - if (px->mode != PR_MODE_HTTP) - goto next_px; - val = mkf_u64(FN_COUNTER, px->be_counters.comp_out); - break; - case ST_F_COMP_BYP: - if (px->mode != PR_MODE_HTTP) - goto next_px; - val = mkf_u64(FN_COUNTER, px->be_counters.comp_byp); - break; - case ST_F_COMP_RSP: - if (px->mode != PR_MODE_HTTP) - goto next_px; - val = mkf_u64(FN_COUNTER, px->be_counters.p.http.comp_rsp); + val = stats[appctx->st2]; break; default: - goto next_metric; + val = stats[appctx->st2]; } - if (!promex_dump_metric(appctx, htx, prefix, &promex_st_metrics[appctx->st2], &val, &out, max)) + if (!promex_dump_metric(appctx, htx, prefix, &promex_st_metrics[appctx->st2], + &val, &out, max)) goto full; next_px: appctx->ctx.stats.obj1 = px->next; } - next_metric: appctx->ctx.stats.flags |= PROMEX_FL_METRIC_HDR; appctx->ctx.stats.obj1 = proxies_list; } -- 2.29.2