From: Willy Tarreau Date: Sun, 23 Dec 2012 01:25:03 +0000 (+0100) Subject: MEDIUM: stats: use multi-line tips to display detailed counters X-Git-Tag: v1.5-dev16~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=466c9b515db7e21f8d2f29aafd768f8f2d50015a;p=thirdparty%2Fhaproxy.git MEDIUM: stats: use multi-line tips to display detailed counters Frontend, listener, server and backend detailed counters are now spread over several lines in a table when the pointer hovers over the area. The values are much more readble, and the extra space gained this way allowed to report some percentages. Note: some incoherencies still exist between some counters. For example, the backend's cum_conn is increased when a session is assigned instead of increasing cum_sess. --- diff --git a/src/dumpstats.c b/src/dumpstats.c index 4bd05fce37..526349b506 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -1833,50 +1833,85 @@ static int stats_dump_fe_stats(struct stream_interface *si, struct proxy *px) "", px->id, px->id); + chunk_appendf(&trash, + /* sessions rate : current */ + "%s
" + "" + "" + "", + U2H0(read_freq_ctr(&px->fe_sess_per_sec)), + U2H1(read_freq_ctr(&px->fe_conn_per_sec)), + U2H2(read_freq_ctr(&px->fe_sess_per_sec))); + if (px->mode == PR_MODE_HTTP) chunk_appendf(&trash, - /* sessions rate : current, max, limit */ - "" - "", - U2H0(read_freq_ctr(&px->fe_sess_per_sec)), - U2H1(read_freq_ctr(&px->fe_req_per_sec)), - U2H2(px->fe_counters.p.http.rps_max), - U2H3(px->fe_counters.sps_max), - LIM2A4(px->fe_sps_lim, "-")); - else + "", + U2H3(read_freq_ctr(&px->fe_req_per_sec))); + + chunk_appendf(&trash, + "
Current connection rate:%s/s
Current session rate:%s/s
%s
Cur: %s req/s
%s
Max: %s req/s
%s
Current request rate:%s/s
" + /* sessions rate : max */ + "%s
" + "" + "" + "", + U2H0(px->fe_counters.sps_max), + U2H1(px->fe_counters.cps_max), + U2H2(px->fe_counters.sps_max)); + + if (px->mode == PR_MODE_HTTP) chunk_appendf(&trash, - /* sessions rate : current, max, limit */ - "" - "", - U2H0(read_freq_ctr(&px->fe_sess_per_sec)), - U2H1(px->fe_counters.sps_max), LIM2A2(px->fe_sps_lim, "-")); + "", + U2H3(px->fe_counters.p.http.rps_max)); + + chunk_appendf(&trash, + "
Max connection rate:%s/s
Max session rate:%s/s
%s%s%s
Max request rate:%s/s
" + /* sessions rate : limit */ + "%s", + LIM2A4(px->fe_sps_lim, "-")); chunk_appendf(&trash, /* sessions: current, max, limit, total */ "%s%s%s" - "%s%s" + "%s
" + "" + "" "", - U2H3(px->feconn), U2H4(px->fe_counters.conn_max), U2H5(px->maxconn), - (px->mode == PR_MODE_HTTP)?"":"", U2H6(px->fe_counters.cum_sess)); + U2H0(px->feconn), U2H1(px->fe_counters.conn_max), U2H2(px->maxconn), + U2H3(px->fe_counters.cum_sess), + U2H4(px->fe_counters.cum_conn), + U2H5(px->fe_counters.cum_sess)); - /* http response (via td title): 1xx, 2xx, 3xx, 4xx, 5xx, other */ + /* http response (via hover): 1xx, 2xx, 3xx, 4xx, 5xx, other */ if (px->mode == PR_MODE_HTTP) { - chunk_appendf(&trash, "
%lld requests:", px->fe_counters.p.http.cum_req); - - for (i = 1; i < 6; i++) - chunk_appendf(&trash, " %dxx=%lld,", i, px->fe_counters.p.http.rsp[i]); - - chunk_appendf(&trash, " other=%lld,", px->fe_counters.p.http.rsp[0]); - chunk_appendf(&trash, " compressed=%lld (%d%%)", - px->fe_counters.p.http.comp_rsp, + chunk_appendf(&trash, + "
" + "" + "" + "" + "" + "" + "" + "" + "" + "", + U2H0(px->fe_counters.p.http.cum_req), + U2H1(px->fe_counters.p.http.rsp[1]), + U2H2(px->fe_counters.p.http.rsp[2]), + U2H3(px->fe_counters.p.http.comp_rsp), px->fe_counters.p.http.rsp[2] ? - (int)(100*px->fe_counters.p.http.comp_rsp/px->fe_counters.p.http.rsp[2]) : 0); - chunk_appendf(&trash, " intercepted=%lld", px->fe_counters.intercepted_req); + (int)(100*px->fe_counters.p.http.comp_rsp/px->fe_counters.p.http.rsp[2]) : 0, + U2H4(px->fe_counters.p.http.rsp[3]), + U2H5(px->fe_counters.p.http.rsp[4]), + U2H6(px->fe_counters.p.http.rsp[5]), + U2H7(px->fe_counters.p.http.rsp[0]), + U2H8(px->fe_counters.intercepted_req)); } chunk_appendf(&trash, + "
Cum. connections:%s
Cum. sessions:%s
Cum. HTTP requests:%s
- HTTP 1xx responses:%s
- HTTP 2xx responses:%s
  Compressed 2xx:%s(%d%%)
- HTTP 3xx responses:%s
- HTTP 4xx responses:%s
- HTTP 5xx responses:%s
- other responses:%s
Intercepted requests:%s
" /* sessions: lbtot */ - "" + "" /* bytes : in */ "%s" "", @@ -2189,31 +2224,50 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in "%s%s%s%s" /* sessions rate : current, max, limit */ "%s%s" - /* sessions: current, max, limit */ - "%s%s%s" - /* sessions: total */ - "%s%s" "", (flags & ST_SHLGNDS) ? "
" : "", U2H0(sv->nbpend), U2H1(sv->counters.nbpend_max), LIM2A2(sv->maxqueue, "-"), - U2H3(read_freq_ctr(&sv->sess_per_sec)), U2H4(sv->counters.sps_max), - U2H5(sv->cur_sess), U2H6(sv->counters.cur_sess_max), LIM2A7(sv->maxconn, "-"), - (px->mode == PR_MODE_HTTP) ? "" : "", U2H8(sv->counters.cum_sess)); + U2H3(read_freq_ctr(&sv->sess_per_sec)), U2H4(sv->counters.sps_max)); - /* http response (via td title): 1xx, 2xx, 3xx, 4xx, 5xx, other */ - if (px->mode == PR_MODE_HTTP) { - chunk_appendf(&trash, "
rsp codes:"); - for (i = 1; i < 6; i++) - chunk_appendf(&trash, " %dxx=%lld,", i, sv->counters.p.http.rsp[i]); + chunk_appendf(&trash, + /* sessions: current, max, limit, total */ + "%s%s%s" + "%s
" + "" + "", + U2H0(sv->cur_sess), U2H1(sv->counters.cur_sess_max), LIM2A2(sv->maxconn, "-"), + U2H3(sv->counters.cum_sess), + U2H4(sv->counters.cum_sess)); + + /* http response (via hover): 1xx, 2xx, 3xx, 4xx, 5xx, other */ + if (px->mode == PR_MODE_HTTP) { + unsigned long long tot; + for (tot = i = 0; i < 6; i++) + tot += sv->counters.p.http.rsp[i]; - chunk_appendf(&trash, " other=%lld", sv->counters.p.http.rsp[0]); + chunk_appendf(&trash, + "" + "" + "" + "" + "" + "" + "" + "", + U2H0(tot), + U2H1(sv->counters.p.http.rsp[1]), tot ? (int)(100*sv->counters.p.http.rsp[1] / tot) : 0, + U2H2(sv->counters.p.http.rsp[2]), tot ? (int)(100*sv->counters.p.http.rsp[2] / tot) : 0, + U2H3(sv->counters.p.http.rsp[3]), tot ? (int)(100*sv->counters.p.http.rsp[3] / tot) : 0, + U2H4(sv->counters.p.http.rsp[4]), tot ? (int)(100*sv->counters.p.http.rsp[4] / tot) : 0, + U2H5(sv->counters.p.http.rsp[5]), tot ? (int)(100*sv->counters.p.http.rsp[5] / tot) : 0, + U2H6(sv->counters.p.http.rsp[0]), tot ? (int)(100*sv->counters.p.http.rsp[0] / tot) : 0); } chunk_appendf(&trash, + "
Cum. sessions:%s
Cum. HTTP responses:%s
- HTTP 1xx responses:%s(%d%%)
- HTTP 2xx responses:%s(%d%%)
- HTTP 3xx responses:%s(%d%%)
- HTTP 4xx responses:%s(%d%%)
- HTTP 5xx responses:%s(%d%%)
- other responses:%s(%d%%)
" /* sessions: lbtot */ - "%s%s", - (px->mode == PR_MODE_HTTP) ? "
" : "", + "%s", U2H1(sv->counters.cum_lbconn)); chunk_appendf(&trash, @@ -2522,28 +2576,43 @@ static int stats_dump_be_stats(struct stream_interface *si, struct proxy *px, in chunk_appendf(&trash, /* sessions: current, max, limit, total */ "%s%s%s" - "%s%s" + "%s
" + "" "", - U2H2(px->beconn), U2H3(px->be_counters.conn_max), U2H4(px->fullconn), - (px->mode == PR_MODE_HTTP)?"":"", U2H6(px->be_counters.cum_conn)); + U2H0(px->beconn), U2H1(px->be_counters.conn_max), U2H2(px->fullconn), + U2H3(px->be_counters.cum_conn), + U2H4(px->be_counters.cum_conn)); - /* http response (via td title): 1xx, 2xx, 3xx, 4xx, 5xx, other */ + /* http response (via hover): 1xx, 2xx, 3xx, 4xx, 5xx, other */ if (px->mode == PR_MODE_HTTP) { - chunk_appendf(&trash, "
%lld requests:", px->be_counters.p.http.cum_req); - - for (i = 1; i < 6; i++) - chunk_appendf(&trash, " %dxx=%lld", i, px->be_counters.p.http.rsp[i]); - - chunk_appendf(&trash, " other=%lld ", px->be_counters.p.http.rsp[0]); - chunk_appendf(&trash, " compressed=%lld (%d%%)
", - px->be_counters.p.http.comp_rsp, + chunk_appendf(&trash, + "" + "" + "" + "" + "" + "" + "" + "" + "" + "", + U2H0(px->be_counters.p.http.cum_req), + U2H1(px->be_counters.p.http.rsp[1]), + U2H2(px->be_counters.p.http.rsp[2]), + U2H3(px->be_counters.p.http.comp_rsp), px->be_counters.p.http.rsp[2] ? - (int)(100*px->be_counters.p.http.comp_rsp/px->be_counters.p.http.rsp[2]) : 0); + (int)(100*px->be_counters.p.http.comp_rsp/px->be_counters.p.http.rsp[2]) : 0, + U2H4(px->be_counters.p.http.rsp[3]), + U2H5(px->be_counters.p.http.rsp[4]), + U2H6(px->be_counters.p.http.rsp[5]), + U2H7(px->be_counters.p.http.rsp[0]), + U2H8(px->be_counters.intercepted_req)); } chunk_appendf(&trash, + "
Cum. sessions:%s
Cum. HTTP requests:%s
- HTTP 1xx responses:%s
- HTTP 2xx responses:%s
  Compressed 2xx:%s(%d%%)
- HTTP 3xx responses:%s
- HTTP 4xx responses:%s
- HTTP 5xx responses:%s
- other responses:%s
Intercepted requests:%s
" /* sessions: lbtot */ - "%s" + "%s" /* bytes: in */ "%s" "", @@ -3047,6 +3116,9 @@ static void stats_dump_html_head(struct uri_auth *uri) "table.lgd { border-collapse: collapse; border-width: 1px; border-style: none none none solid; border-color: black;}\n" "table.lgd td { border-width: 1px; border-style: solid solid solid solid; border-color: gray; padding: 2px;}\n" "table.lgd td.noborder { border-style: none; padding: 2px; white-space: nowrap;}\n" + "table.det { border-collapse: collapse; border-style: none; }\n" + "table.det th { text-align: left; border-width: 0px; padding: 0px 1px 0px 0px; font-style:normal;font-size:11px;font-weight:bold;font-family: sans-serif;}\n" + "table.det td { text-align: right; border-width: 0px; padding: 0px 0px 0px 4px; white-space: nowrap; font-style:normal;font-size:11px;font-weight:normal;font-family: monospace;}\n" "u {text-decoration:none; border-bottom: 1px dotted black;}\n" "div {\n" " display:block;\n"