use `stats_fill_be_stats` when possible to avoid duplicating code.
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 <[email protected]>
---
.../prometheus-exporter/service-prometheus.c | 161 ++----------------
1 file changed, 14 insertions(+), 147 deletions(-)
diff --git a/contrib/prometheus-exporter/service-prometheus.c
b/contrib/prometheus-exporter/service-prometheus.c
index 6825c4d69..efdc1ca88 100644
--- a/contrib/prometheus-exporter/service-prometheus.c
+++ b/contrib/prometheus-exporter/service-prometheus.c
@@ -1459,8 +1459,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;
while (appctx->st2 && appctx->st2 < ST_F_TOTAL_FIELDS) {
@@ -1471,46 +1471,14 @@ 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;
+ memset(stats, 0, sizeof(struct field) *
stat_count[STATS_DOMAIN_PROXY]);
+ if (!stats_fill_be_stats(px, appctx->ctx.stats.flags,
stats, ST_F_TOTAL_FIELDS))
+ return 0;
+
switch (appctx->st2) {
case ST_F_STATUS:
metric = mkf_u32(FO_STATUS,
(px->lbprm.tot_weight > 0 || !px->srv) ? 1 : 0);
break;
- case ST_F_SCUR:
- metric = mkf_u32(0, px->beconn);
- break;
- case ST_F_SMAX:
- metric = mkf_u32(FN_MAX,
px->be_counters.conn_max);
- break;
- case ST_F_SLIM:
- metric = mkf_u32(FO_CONFIG|FN_LIMIT,
px->fullconn);
- break;
- case ST_F_STOT:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.cum_conn);
- break;
- case ST_F_RATE_MAX:
- metric = mkf_u32(0,
px->be_counters.sps_max);
- break;
- case ST_F_LASTSESS:
- metric = mkf_s32(FN_AGE,
be_lastsession(px));
- break;
- case ST_F_QCUR:
- metric = mkf_u32(0, px->nbpend);
- break;
- case ST_F_QMAX:
- metric = mkf_u32(FN_MAX,
px->be_counters.nbpend_max);
- break;
- case ST_F_CONNECT:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.connect);
- break;
- case ST_F_REUSE:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.reuse);
- break;
- case ST_F_BIN:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.bytes_in);
- break;
- case ST_F_BOUT:
- metric = 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;
metric = mkf_flt(FN_AVG, secs);
@@ -1543,131 +1511,31 @@ static int promex_dump_back_metrics(struct appctx
*appctx, struct htx *htx)
secs =
(double)px->be_counters.ttime_max / 1000.0;
metric = mkf_flt(FN_MAX, secs);
break;
- case ST_F_DREQ:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.denied_req);
- break;
- case ST_F_DRESP:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.denied_resp);
- break;
- case ST_F_ECON:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.failed_conns);
- break;
- case ST_F_ERESP:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.failed_resp);
- break;
- case ST_F_WRETR:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.retries);
- break;
- case ST_F_WREDIS:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.redispatches);
- break;
- case ST_F_WREW:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.failed_rewrites);
- break;
- case ST_F_EINT:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.internal_errors);
- break;
- case ST_F_CLI_ABRT:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.cli_aborts);
- break;
- case ST_F_SRV_ABRT:
- metric = 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;
- metric = mkf_u32(FN_AVG, weight);
- break;
- case ST_F_ACT:
- metric = mkf_u32(0, px->srv_act);
- break;
- case ST_F_BCK:
- metric = mkf_u32(0, px->srv_bck);
- break;
- case ST_F_CHKDOWN:
- metric = mkf_u64(FN_COUNTER,
px->down_trans);
- break;
- case ST_F_LASTCHG:
- metric = mkf_u32(FN_AGE, now.tv_sec -
px->last_change);
- break;
- case ST_F_DOWNTIME:
- metric = mkf_u32(FN_COUNTER,
be_downtime(px));
- break;
- case ST_F_LBTOT:
- metric = mkf_u64(FN_COUNTER,
px->be_counters.cum_lbconn);
- break;
case ST_F_REQ_TOT:
- if (px->mode != PR_MODE_HTTP)
- goto next_px;
- metric = 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;
- metric = mkf_u64(FN_COUNTER,
px->be_counters.p.http.rsp[1]);
+ metric = 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;
- metric = 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;
- metric = 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;
- metric = 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;
- metric = 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;
- metric = 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;
- metric = 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;
- metric = 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;
- metric = mkf_u64(FN_COUNTER,
px->be_counters.comp_in);
- break;
- case ST_F_COMP_OUT:
- if (px->mode != PR_MODE_HTTP)
- goto next_px;
- metric = mkf_u64(FN_COUNTER,
px->be_counters.comp_out);
- break;
- case ST_F_COMP_BYP:
- if (px->mode != PR_MODE_HTTP)
- goto next_px;
- metric = mkf_u64(FN_COUNTER,
px->be_counters.comp_byp);
- break;
- case ST_F_COMP_RSP:
- if (px->mode != PR_MODE_HTTP)
- goto next_px;
- metric = mkf_u64(FN_COUNTER,
px->be_counters.p.http.comp_rsp);
+ metric = stats[appctx->st2];
break;
default:
- goto next_metric;
+ metric = stats[appctx->st2];
}
if (!promex_dump_metric(appctx, htx, prefix, &metric,
&out, max))
@@ -1675,7 +1543,6 @@ static int promex_dump_back_metrics(struct appctx
*appctx, struct htx *htx)
next_px:
appctx->ctx.stats.obj1 = px->next;
}
- next_metric:
appctx->ctx.stats.flags |= PROMEX_FL_METRIC_HDR;
appctx->ctx.stats.obj1 = proxies_list;
appctx->st2 = promex_back_metrics[appctx->st2];
--
2.29.2