MINOR: backend: count the number of connect and reuse per server and per backend

Sadly we didn't have the cumulated number of connections established to
servers till now, so let's now update it per backend and per-server and
report it in the stats. On the stats page it appears in the tooltip
when hovering over the total sessions count field.
This commit is contained in:
Willy Tarreau 2018-12-14 11:35:36 +01:00
parent c0960d1185
commit f157384803
4 changed files with 30 additions and 0 deletions

View File

@ -83,6 +83,8 @@ struct be_counters {
long long denied_req; /* blocked requests because of security concerns */
long long denied_resp; /* blocked responses because of security concerns */
long long connect; /* number of connection establishment attempts */
long long reuse; /* number of connection reuses */
long long failed_conns; /* failed connect() attempts (BE only) */
long long failed_resp; /* failed responses (BE only) */
long long cli_aborts; /* aborted responses during DATA phase caused by the client */

View File

@ -392,6 +392,8 @@ enum stat_field {
ST_F_DCON,
ST_F_DSES,
ST_F_WREW,
ST_F_CONNECT,
ST_F_REUSE,
/* must always be the last one */
ST_F_TOTAL_FIELDS

View File

@ -1376,6 +1376,14 @@ int connect_server(struct stream *s)
if (s->be->options & PR_O_TCP_NOLING)
s->si[1].flags |= SI_FL_NOLINGER;
if (s->flags & SF_SRV_REUSED) {
HA_ATOMIC_ADD(&s->be->be_counters.reuse, 1);
HA_ATOMIC_ADD(&srv->counters.reuse, 1);
} else {
HA_ATOMIC_ADD(&s->be->be_counters.connect, 1);
HA_ATOMIC_ADD(&srv->counters.connect, 1);
}
err = si_connect(&s->si[1], srv_conn);
#ifdef USE_OPENSSL

View File

@ -228,6 +228,8 @@ const char *stat_field_names[ST_F_TOTAL_FIELDS] = {
[ST_F_DCON] = "dcon",
[ST_F_DSES] = "dses",
[ST_F_WREW] = "wrew",
[ST_F_CONNECT] = "connect",
[ST_F_REUSE] = "reuse",
};
/* one line of info */
@ -960,6 +962,8 @@ static int stats_dump_fields_html(struct buffer *out,
tot += stats[ST_F_HRSP_5XX].u.u64;
chunk_appendf(out,
"<tr><th>New connections:</th><td>%s</td></tr>"
"<tr><th>Reused connections:</th><td>%s</td><td>(%d%%)</td></tr>"
"<tr><th>Cum. HTTP responses:</th><td>%s</td></tr>"
"<tr><th>- HTTP 1xx responses:</th><td>%s</td><td>(%d%%)</td></tr>"
"<tr><th>- HTTP 2xx responses:</th><td>%s</td><td>(%d%%)</td></tr>"
@ -969,6 +973,10 @@ static int stats_dump_fields_html(struct buffer *out,
"<tr><th>- other responses:</th><td>%s</td><td>(%d%%)</td></tr>"
"<tr><th>Failed hdr rewrites:</th><td>%s</td></tr>"
"",
U2H(stats[ST_F_CONNECT].u.u64),
U2H(stats[ST_F_REUSE].u.u64),
(stats[ST_F_CONNECT].u.u64 + stats[ST_F_REUSE].u.u64) ?
(int)(100 * stats[ST_F_REUSE].u.u64 / (stats[ST_F_CONNECT].u.u64 + stats[ST_F_REUSE].u.u64)) : 0,
U2H(tot),
U2H(stats[ST_F_HRSP_1XX].u.u64), tot ? (int)(100 * stats[ST_F_HRSP_1XX].u.u64 / tot) : 0,
U2H(stats[ST_F_HRSP_2XX].u.u64), tot ? (int)(100 * stats[ST_F_HRSP_2XX].u.u64 / tot) : 0,
@ -1180,6 +1188,8 @@ static int stats_dump_fields_html(struct buffer *out,
/* http response (via hover): 1xx, 2xx, 3xx, 4xx, 5xx, other */
if (strcmp(field_str(stats, ST_F_MODE), "http") == 0) {
chunk_appendf(out,
"<tr><th>New connections:</th><td>%s</td></tr>"
"<tr><th>Reused connections:</th><td>%s</td><td>(%d%%)</td></tr>"
"<tr><th>Cum. HTTP requests:</th><td>%s</td></tr>"
"<tr><th>- HTTP 1xx responses:</th><td>%s</td></tr>"
"<tr><th>- HTTP 2xx responses:</th><td>%s</td></tr>"
@ -1191,6 +1201,10 @@ static int stats_dump_fields_html(struct buffer *out,
"<tr><th>Failed hdr rewrites:</th><td>%s</td></tr>"
"<tr><th colspan=3>Avg over last 1024 success. conn.</th></tr>"
"",
U2H(stats[ST_F_CONNECT].u.u64),
U2H(stats[ST_F_REUSE].u.u64),
(stats[ST_F_CONNECT].u.u64 + stats[ST_F_REUSE].u.u64) ?
(int)(100 * stats[ST_F_REUSE].u.u64 / (stats[ST_F_CONNECT].u.u64 + stats[ST_F_REUSE].u.u64)) : 0,
U2H(stats[ST_F_REQ_TOT].u.u64),
U2H(stats[ST_F_HRSP_1XX].u.u64),
U2H(stats[ST_F_HRSP_2XX].u.u64),
@ -1596,6 +1610,8 @@ int stats_fill_sv_stats(struct proxy *px, struct server *sv, int flags,
stats[ST_F_WRETR] = mkf_u64(FN_COUNTER, sv->counters.retries);
stats[ST_F_WREDIS] = mkf_u64(FN_COUNTER, sv->counters.redispatches);
stats[ST_F_WREW] = mkf_u64(FN_COUNTER, sv->counters.failed_rewrites);
stats[ST_F_CONNECT] = mkf_u64(FN_COUNTER, sv->counters.connect);
stats[ST_F_REUSE] = mkf_u64(FN_COUNTER, sv->counters.reuse);
/* status */
fld_status = chunk_newstr(out);
@ -1789,6 +1805,8 @@ int stats_fill_be_stats(struct proxy *px, int flags, struct field *stats, int le
stats[ST_F_WRETR] = mkf_u64(FN_COUNTER, px->be_counters.retries);
stats[ST_F_WREDIS] = mkf_u64(FN_COUNTER, px->be_counters.redispatches);
stats[ST_F_WREW] = mkf_u64(FN_COUNTER, px->be_counters.failed_rewrites);
stats[ST_F_CONNECT] = mkf_u64(FN_COUNTER, px->be_counters.connect);
stats[ST_F_REUSE] = mkf_u64(FN_COUNTER, px->be_counters.reuse);
stats[ST_F_STATUS] = mkf_str(FO_STATUS, (px->lbprm.tot_weight > 0 || !px->srv) ? "UP" : "DOWN");
stats[ST_F_WEIGHT] = mkf_u32(FN_AVG, (px->lbprm.tot_weight * px->lbprm.wmult + px->lbprm.wdiv - 1) / px->lbprm.wdiv);
stats[ST_F_ACT] = mkf_u32(0, px->srv_act);