summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Dauchy <wdauchy@gmail.com>2021-01-25 17:29:04 +0100
committerChristopher Faulet <cfaulet@haproxy.com>2021-01-26 09:24:57 +0100
commitbde2bf6fd3455c372bccf139a703e81325367665 (patch)
treeb54b73017abdadf999743c9d7d2b1e2791ba6151
parentd3a9a4992b0198b75caf0602016d8d90a3f6a6e9 (diff)
downloadhaproxy-bde2bf6fd3455c372bccf139a703e81325367665.tar.gz
MINOR: contrib/prometheus-exporter: use fill_sv_stats for server dump
use `stats_fill_sv_stats` when possible to avoid duplicating code. the following metrics have a change of behaviour: haproxy_server_limit_sessions haproxy_server_queue_limit haproxy_server_check_failures_total haproxy_server_check_up_down_total haproxy_server_downtime_seconds_total haproxy_server_current_throttle haproxy_server_idle_connections_limit depending on cases, if the limit was not configured or enabled, NaN is returned instead. It should not be an issue for users, even better than before as it provides more precise info. Signed-off-by: William Dauchy <wdauchy@gmail.com>
-rw-r--r--contrib/prometheus-exporter/service-prometheus.c143
1 files changed, 7 insertions, 136 deletions
diff --git a/contrib/prometheus-exporter/service-prometheus.c b/contrib/prometheus-exporter/service-prometheus.c
index 12fe3ee90..364d4b6d1 100644
--- a/contrib/prometheus-exporter/service-prometheus.c
+++ b/contrib/prometheus-exporter/service-prometheus.c
@@ -799,8 +799,8 @@ static int promex_dump_srv_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++) {
@@ -817,6 +817,9 @@ static int promex_dump_srv_metrics(struct appctx *appctx, struct htx *htx)
while (appctx->ctx.stats.obj2) {
sv = appctx->ctx.stats.obj2;
+ if (!stats_fill_sv_stats(px, sv, 0, stats, ST_F_TOTAL_FIELDS, &(appctx->st2)))
+ return -1;
+
if ((appctx->ctx.stats.flags & PROMEX_FL_NO_MAINT_SRV) && (sv->cur_admin & SRV_ADMF_MAINT))
goto next_sv;
@@ -824,39 +827,6 @@ static int promex_dump_srv_metrics(struct appctx *appctx, struct htx *htx)
case ST_F_STATUS:
val = mkf_u32(FO_STATUS, promex_srv_status(sv));
break;
- case ST_F_SCUR:
- val = mkf_u32(0, sv->cur_sess);
- break;
- case ST_F_SMAX:
- val = mkf_u32(FN_MAX, sv->counters.cur_sess_max);
- break;
- case ST_F_SLIM:
- val = mkf_u32(FO_CONFIG|FN_LIMIT, sv->maxconn);
- break;
- case ST_F_STOT:
- val = mkf_u64(FN_COUNTER, sv->counters.cum_sess);
- break;
- case ST_F_RATE_MAX:
- val = mkf_u32(FN_MAX, sv->counters.sps_max);
- break;
- case ST_F_LASTSESS:
- val = mkf_s32(FN_AGE, srv_lastsession(sv));
- break;
- case ST_F_QCUR:
- val = mkf_u32(0, sv->nbpend);
- break;
- case ST_F_QMAX:
- val = mkf_u32(FN_MAX, sv->counters.nbpend_max);
- break;
- case ST_F_QLIMIT:
- val = mkf_u32(FO_CONFIG|FS_SERVICE, sv->maxqueue);
- break;
- case ST_F_BIN:
- val = mkf_u64(FN_COUNTER, sv->counters.bytes_in);
- break;
- case ST_F_BOUT:
- val = mkf_u64(FN_COUNTER, sv->counters.bytes_out);
- break;
case ST_F_QTIME:
secs = (double)swrate_avg(sv->counters.q_time, TIME_STATS_SAMPLES) / 1000.0;
val = mkf_flt(FN_AVG, secs);
@@ -889,43 +859,6 @@ static int promex_dump_srv_metrics(struct appctx *appctx, struct htx *htx)
secs = (double)sv->counters.ttime_max / 1000.0;
val = mkf_flt(FN_MAX, secs);
break;
- case ST_F_CONNECT:
- val = mkf_u64(FN_COUNTER, sv->counters.connect);
- break;
- case ST_F_REUSE:
- val = mkf_u64(FN_COUNTER, sv->counters.reuse);
- break;
- case ST_F_DRESP:
- val = mkf_u64(FN_COUNTER, sv->counters.denied_resp);
- break;
- case ST_F_ECON:
- val = mkf_u64(FN_COUNTER, sv->counters.failed_conns);
- break;
- case ST_F_ERESP:
- val = mkf_u64(FN_COUNTER, sv->counters.failed_resp);
- break;
- case ST_F_WRETR:
- val = mkf_u64(FN_COUNTER, sv->counters.retries);
- break;
- case ST_F_WREDIS:
- val = mkf_u64(FN_COUNTER, sv->counters.redispatches);
- break;
- case ST_F_WREW:
- val = mkf_u64(FN_COUNTER, sv->counters.failed_rewrites);
- break;
- case ST_F_EINT:
- val = mkf_u64(FN_COUNTER, sv->counters.internal_errors);
- break;
- case ST_F_CLI_ABRT:
- val = mkf_u64(FN_COUNTER, sv->counters.cli_aborts);
- break;
- case ST_F_SRV_ABRT:
- val = mkf_u64(FN_COUNTER, sv->counters.srv_aborts);
- break;
- case ST_F_WEIGHT:
- weight = (sv->cur_eweight * px->lbprm.wmult + px->lbprm.wdiv - 1) / px->lbprm.wdiv;
- val = mkf_u32(FN_AVG, weight);
- break;
case ST_F_CHECK_STATUS:
if ((sv->check.state & (CHK_ST_ENABLED|CHK_ST_PAUSED)) != CHK_ST_ENABLED)
goto next_sv;
@@ -942,90 +875,29 @@ static int promex_dump_srv_metrics(struct appctx *appctx, struct htx *htx)
secs = (double)sv->check.duration / 1000.0;
val = mkf_flt(FN_DURATION, secs);
break;
- case ST_F_CHKFAIL:
- val = mkf_u64(FN_COUNTER, sv->counters.failed_checks);
- break;
- case ST_F_CHKDOWN:
- val = mkf_u64(FN_COUNTER, sv->counters.down_trans);
- break;
- case ST_F_DOWNTIME:
- val = mkf_u32(FN_COUNTER, srv_downtime(sv));
- break;
- case ST_F_LASTCHG:
- val = mkf_u32(FN_AGE, now.tv_sec - sv->last_change);
- break;
- case ST_F_THROTTLE:
- val = mkf_u32(FN_AVG, server_throttle_rate(sv));
- break;
- case ST_F_LBTOT:
- val = mkf_u64(FN_COUNTER, sv->counters.cum_lbconn);
- break;
case ST_F_REQ_TOT:
- if (px->mode != PR_MODE_HTTP)
- goto next_px;
- val = mkf_u64(FN_COUNTER, sv->counters.p.http.cum_req);
- break;
case ST_F_HRSP_1XX:
if (px->mode != PR_MODE_HTTP)
goto next_px;
- val = mkf_u64(FN_COUNTER, sv->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, sv->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, sv->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, sv->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, sv->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, sv->counters.p.http.rsp[0]);
- break;
- case ST_F_SRV_ICUR:
- val = mkf_u32(0, sv->curr_idle_conns);
- break;
- case ST_F_SRV_ILIM:
- val = mkf_u32(FO_CONFIG|FN_LIMIT, (sv->max_idle_conns == -1) ? 0 : sv->max_idle_conns);
- break;
- case ST_F_IDLE_CONN_CUR:
- val = mkf_u32(0, sv->curr_idle_nb);
- break;
- case ST_F_SAFE_CONN_CUR:
- val = mkf_u32(0, sv->curr_safe_nb);
- break;
- case ST_F_USED_CONN_CUR:
- val = mkf_u32(0, sv->curr_used_conns);
- break;
- case ST_F_NEED_CONN_EST:
- val = mkf_u32(0, sv->est_need_conns);
+ 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))
goto full;
-
next_sv:
appctx->ctx.stats.obj2 = sv->next;
}
@@ -1034,7 +906,6 @@ static int promex_dump_srv_metrics(struct appctx *appctx, struct htx *htx)
appctx->ctx.stats.obj1 = px->next;
appctx->ctx.stats.obj2 = (appctx->ctx.stats.obj1 ? ((struct proxy *)appctx->ctx.stats.obj1)->srv : NULL);
}
- next_metric:
appctx->ctx.stats.flags |= PROMEX_FL_METRIC_HDR;
appctx->ctx.stats.obj1 = proxies_list;
appctx->ctx.stats.obj2 = (appctx->ctx.stats.obj1 ? ((struct proxy *)appctx->ctx.stats.obj1)->srv : NULL);