diff --git a/src/dumpstats.c b/src/dumpstats.c index 9109a276d..4bd05fce3 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -1836,13 +1836,13 @@ static int stats_dump_fe_stats(struct stream_interface *si, struct proxy *px) if (px->mode == PR_MODE_HTTP) chunk_appendf(&trash, /* sessions rate : current, max, limit */ - "%s%s%s" + "%s
Cur: %s req/s
%s
Max: %s req/s
%s" "", - read_freq_ctr(&px->fe_req_per_sec), U2H0(read_freq_ctr(&px->fe_sess_per_sec)), - px->fe_counters.p.http.rps_max, - U2H1(px->fe_counters.sps_max), - LIM2A2(px->fe_sps_lim, "-")); + 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 chunk_appendf(&trash, /* sessions rate : current, max, limit */ @@ -1852,15 +1852,16 @@ static int stats_dump_fe_stats(struct stream_interface *si, struct proxy *px) U2H1(px->fe_counters.sps_max), LIM2A2(px->fe_sps_lim, "-")); chunk_appendf(&trash, - /* sessions: current, max, limit */ + /* sessions: current, max, limit, total */ "%s%s%s" - "%s%s" "", - U2H3(px->feconn), U2H4(px->fe_counters.conn_max), U2H5(px->maxconn)); + U2H3(px->feconn), U2H4(px->fe_counters.conn_max), U2H5(px->maxconn), + (px->mode == PR_MODE_HTTP)?"":"", U2H6(px->fe_counters.cum_sess)); /* http response (via td title): 1xx, 2xx, 3xx, 4xx, 5xx, other */ if (px->mode == PR_MODE_HTTP) { - chunk_appendf(&trash, " title=\"%lld requests:", px->fe_counters.p.http.cum_req); + 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]); @@ -1870,32 +1871,25 @@ static int stats_dump_fe_stats(struct stream_interface *si, struct proxy *px) 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); + chunk_appendf(&trash, " intercepted=%lld
", px->fe_counters.intercepted_req); } chunk_appendf(&trash, - /* sessions: total, lbtot */ - ">%s%s%s" + /* sessions: lbtot */ + "" /* bytes : in */ - "%s%s" "", - (px->mode == PR_MODE_HTTP)?"":"", - U2H6(px->fe_counters.cum_sess), - (px->mode == PR_MODE_HTTP)?"":"", U2H7(px->fe_counters.bytes_in)); - /* compression stats (via td title): comp_in, comp_out, comp_byp */ - chunk_appendf(&trash, " title=\"compression: in=%lld out=%lld bypassed=%lld savings=%d%%\"", - px->fe_counters.comp_in, px->fe_counters.comp_out, px->fe_counters.comp_byp, - px->fe_counters.comp_in ? - (int)((px->fe_counters.comp_in - px->fe_counters.comp_out)*100/px->fe_counters.comp_in) : 0); - chunk_appendf(&trash, - /* bytes: out */ - ">%s%s%s" - "", + /* bytes:out + compression stats (via hover): comp_in, comp_out, comp_byp */ + "%s%s
compression: in=%lld out=%lld bypassed=%lld savings=%d%%
%s", (px->fe_counters.comp_in || px->fe_counters.comp_byp) ? "":"", U2H0(px->fe_counters.bytes_out), + px->fe_counters.comp_in, px->fe_counters.comp_out, px->fe_counters.comp_byp, + px->fe_counters.comp_in ? + (int)((px->fe_counters.comp_in - px->fe_counters.comp_out)*100/px->fe_counters.comp_in) : 0, (px->fe_counters.comp_in || px->fe_counters.comp_byp) ? "":""); chunk_appendf(&trash, @@ -1997,13 +1991,20 @@ static int stats_dump_li_stats(struct stream_interface *si, struct proxy *px, st /* Column sub-heading for Enable or Disable server */ chunk_appendf(&trash, ""); } - chunk_appendf(&trash, "%s" + "%s" + "", + px->id, l->name, + (flags & ST_SHLGNDS)?"":"", + px->id, l->name, l->name); if (flags & ST_SHLGNDS) { char str[INET6_ADDRSTRLEN]; int port; - chunk_appendf(&trash, " title=\""); + chunk_appendf(&trash, "
"); port = get_host_port(&l->addr); switch (addr_to_str(&l->addr, str, sizeof(str))) { @@ -2022,13 +2023,12 @@ static int stats_dump_li_stats(struct stream_interface *si, struct proxy *px, st } /* id */ - chunk_appendf(&trash, "id: %d\"", l->luid); + chunk_appendf(&trash, "id: %d
", l->luid); } chunk_appendf(&trash, - /* name, queue */ - ">%s" - "%s%s" + /* queue */ + "%s" /* sessions rate: current, max, limit */ " " /* sessions: current, max, limit, total, lbtot */ @@ -2037,8 +2037,6 @@ static int stats_dump_li_stats(struct stream_interface *si, struct proxy *px, st /* bytes: in, out */ "%s%s" "", - (flags & ST_SHLGNDS)?"":"", - px->id, l->name, px->id, l->name, l->name, (flags & ST_SHLGNDS)?"":"", U2H3(l->nbconn), U2H4(l->counters->conn_max), U2H5(l->maxconn), U2H6(l->counters->cum_conn), U2H7(l->counters->bytes_in), U2H8(l->counters->bytes_out)); @@ -2142,10 +2140,16 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in "", sv->id); - chunk_appendf(&trash, "%s" + "%s" + "", + px->id, sv->id, + (flags & ST_SHLGNDS) ? "" : "", + px->id, sv->id, sv->id); if (flags & ST_SHLGNDS) { - chunk_appendf(&trash, " title=\""); + chunk_appendf(&trash, "
"); switch (addr_to_str(&sv->addr, str, sizeof(str))) { case AF_INET: @@ -2177,43 +2181,39 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in chunk_appendf(&trash, "'"); } - chunk_appendf(&trash, "\""); + chunk_appendf(&trash, "
"); } chunk_appendf(&trash, - ">%s" - "%s%s" /* queue : current, max, limit */ - "%s%s%s" + "%s%s%s%s" /* sessions rate : current, max, limit */ "%s%s" /* sessions: current, max, limit */ "%s%s%s" - "%s%s" "", - (flags & ST_SHLGNDS) ? "" : "", - px->id, sv->id, px->id, sv->id, sv->id, (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, "-")); + U2H5(sv->cur_sess), U2H6(sv->counters.cur_sess_max), LIM2A7(sv->maxconn, "-"), + (px->mode == PR_MODE_HTTP) ? "" : "", U2H8(sv->counters.cum_sess)); /* http response (via td title): 1xx, 2xx, 3xx, 4xx, 5xx, other */ if (px->mode == PR_MODE_HTTP) { - chunk_appendf(&trash, " title=\"rsp codes:"); + 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, " other=%lld\"", sv->counters.p.http.rsp[0]); + chunk_appendf(&trash, " other=%lld
", sv->counters.p.http.rsp[0]); } chunk_appendf(&trash, - /* sessions: total, lbtot */ - ">%s%s%s%s", - (px->mode == PR_MODE_HTTP)?"":"", - U2H0(sv->counters.cum_sess), - (px->mode == PR_MODE_HTTP)?"":"", + /* sessions: lbtot */ + "%s%s", + (px->mode == PR_MODE_HTTP) ? "
" : "", U2H1(sv->counters.cum_lbconn)); chunk_appendf(&trash, @@ -2224,16 +2224,16 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in /* errors : request, connect */ "%s" /* errors : response */ - "%s" + "%s
Connection resets during transfers: %lld client, %lld server
" /* warnings: retries, redispatches */ "%lld%lld" "", U2H0(sv->counters.bytes_in), U2H1(sv->counters.bytes_out), U2H2(sv->counters.failed_secu), U2H3(sv->counters.failed_conns), + U2H6(sv->counters.failed_resp), sv->counters.cli_aborts, sv->counters.srv_aborts, - U2H6(sv->counters.failed_resp), sv->counters.retries, sv->counters.redispatches); /* status, lest check */ @@ -2256,16 +2256,8 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in } if (sv->state & SRV_CHECKED) { - chunk_appendf(&trash, "check.status)); - - if (*sv->check.desc) { - chunk_appendf(&trash, ": "); - chunk_initlen(&src, sv->check.desc, 0, strlen(sv->check.desc)); - chunk_htmlencode(&trash, &src); - } - - chunk_appendf(&trash, "\"> %s%s", + chunk_appendf(&trash, + " %s%s", (sv->state & SRV_CHK_RUNNING) ? "* " : "", get_check_status_info(sv->check.status)); @@ -2273,7 +2265,16 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in chunk_appendf(&trash, "/%d", sv->check.code); if (sv->check.status >= HCHK_STATUS_CHECKED && sv->check.duration >= 0) - chunk_appendf(&trash, " in %lums", sv->check.duration); + chunk_appendf(&trash, " in %lums", sv->check.duration); + + chunk_appendf(&trash, "
%s", + get_check_status_description(sv->check.status)); + if (*sv->check.desc) { + chunk_appendf(&trash, ": "); + chunk_initlen(&src, sv->check.desc, 0, strlen(sv->check.desc)); + chunk_htmlencode(&trash, &src); + } + chunk_appendf(&trash, "
"); } else chunk_appendf(&trash, ""); @@ -2290,16 +2291,16 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in /* check failures: unique, fatal, down time */ if (sv->state & SRV_CHECKED) { - chunk_appendf(&trash, "%lld", - ref->observe?"/Health Analyses":"", ref->counters.failed_checks); + chunk_appendf(&trash, "%lld", ref->counters.failed_checks); if (ref->observe) chunk_appendf(&trash, "/%lld", ref->counters.failed_hana); chunk_appendf(&trash, - "" + "
Failed Health Checks%s
" "%lld%s" "", + ref->observe ? "/Health Analyses" : "", ref->counters.down_trans, human_time(srv_downtime(sv), 1)); } else if (sv != ref) @@ -2483,11 +2484,18 @@ static int stats_dump_be_stats(struct stream_interface *si, struct proxy *px, in /* Column sub-heading for Enable or Disable server */ chunk_appendf(&trash, ""); } - chunk_appendf(&trash, "" + /* name */ + "%s" + "Backend" + "", + (flags & ST_SHLGNDS)?"":"", + px->id, px->id); if (flags & ST_SHLGNDS) { /* balancing */ - chunk_appendf(&trash, " title=\"balancing: %s", + chunk_appendf(&trash, "
balancing: %s", backend_lb_algo_str(px->lbprm.algo & BE_LB_ALGO)); /* cookie */ @@ -2497,69 +2505,59 @@ static int stats_dump_be_stats(struct stream_interface *si, struct proxy *px, in chunk_htmlencode(&trash, &src); chunk_appendf(&trash, "'"); } - chunk_appendf(&trash, "\""); + chunk_appendf(&trash, "
"); } chunk_appendf(&trash, - /* name */ - ">%s" - "Backend%s" + "%s" /* queue : current, max */ "%s%s" /* sessions rate : current, max, limit */ "%s%s" "", - (flags & ST_SHLGNDS)?"":"", - px->id, px->id, (flags & ST_SHLGNDS)?"":"", U2H0(px->nbpend) /* or px->totpend ? */, U2H1(px->be_counters.nbpend_max), U2H2(read_freq_ctr(&px->be_sess_per_sec)), U2H3(px->be_counters.sps_max)); chunk_appendf(&trash, - /* sessions: current, max, limit */ + /* sessions: current, max, limit, total */ "%s%s%s" - "%s%s" "", - U2H2(px->beconn), U2H3(px->be_counters.conn_max), U2H4(px->fullconn)); + U2H2(px->beconn), U2H3(px->be_counters.conn_max), U2H4(px->fullconn), + (px->mode == PR_MODE_HTTP)?"":"", U2H6(px->be_counters.cum_conn)); /* http response (via td title): 1xx, 2xx, 3xx, 4xx, 5xx, other */ if (px->mode == PR_MODE_HTTP) { - chunk_appendf(&trash, " title=\"%lld requests:", px->be_counters.p.http.cum_req); + 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%%)\"", + chunk_appendf(&trash, " compressed=%lld (%d%%)
", 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); } chunk_appendf(&trash, - /* sessions: total, lbtot */ - ">%s%s%s%s" + /* sessions: lbtot */ + "%s" /* bytes: in */ - "%s%s" "", - (px->mode == PR_MODE_HTTP)?"":"", - U2H6(px->be_counters.cum_conn), - (px->mode == PR_MODE_HTTP)?"":"", U2H7(px->be_counters.cum_lbconn), U2H8(px->be_counters.bytes_in)); - /* compression stats (via td title): comp_in, comp_out, comp_byp */ - chunk_appendf(&trash, " title=\"compression: in=%lld out=%lld bypassed=%lld savings=%d%%\"", - px->be_counters.comp_in, px->be_counters.comp_out, px->be_counters.comp_byp, - px->be_counters.comp_in ? - (int)((px->be_counters.comp_in - px->be_counters.comp_out)*100/px->be_counters.comp_in) : 0); - chunk_appendf(&trash, - /* bytes: out */ - ">%s%s%s" - "", + /* bytes:out + compression stats (via hover): comp_in, comp_out, comp_byp */ + "%s%s
compression: in=%lld out=%lld bypassed=%lld savings=%d%%
%s", (px->be_counters.comp_in || px->be_counters.comp_byp) ? "":"", U2H0(px->be_counters.bytes_out), + px->be_counters.comp_in, px->be_counters.comp_out, px->be_counters.comp_byp, + px->be_counters.comp_in ? + (int)((px->be_counters.comp_in - px->be_counters.comp_out)*100/px->be_counters.comp_in) : 0, (px->be_counters.comp_in || px->be_counters.comp_byp) ? "":""); chunk_appendf(&trash, @@ -2568,7 +2566,7 @@ static int stats_dump_be_stats(struct stream_interface *si, struct proxy *px, in /* errors : request, connect */ "%s" /* errors : response */ - "%s" + "%s
Connection resets during transfers: %lld client, %lld server
" /* warnings: retries, redispatches */ "%lld%lld" /* backend status: reflect backend status (up/down): we display UP @@ -2580,9 +2578,9 @@ static int stats_dump_be_stats(struct stream_interface *si, struct proxy *px, in "", U2H0(px->be_counters.denied_req), U2H1(px->be_counters.denied_resp), U2H2(px->be_counters.failed_conns), + U2H5(px->be_counters.failed_resp), px->be_counters.cli_aborts, px->be_counters.srv_aborts, - U2H5(px->be_counters.failed_resp), px->be_counters.retries, px->be_counters.redispatches, human_time(now.tv_sec - px->last_change, 1), (px->lbprm.tot_weight > 0 || !px->srv) ? "UP" : @@ -2695,26 +2693,30 @@ static void stats_dump_html_px_hdr(struct stream_interface *si, struct proxy *px chunk_appendf(&trash, "\n" "" - "" + "%s" "" "\n" "
"); + + chunk_appendf(&trash, + "%s" + "%s", + px->id, + (uri->flags & ST_SHLGNDS) ? "":"", + px->id, px->id); if (uri->flags & ST_SHLGNDS) { /* cap, mode, id */ - chunk_appendf(&trash, " title=\"cap: %s, mode: %s, id: %d", + chunk_appendf(&trash, "
cap: %s, mode: %s, id: %d", proxy_cap_str(px->cap), proxy_mode_str(px->mode), px->uuid); - chunk_appendf(&trash, "\""); + chunk_appendf(&trash, "
"); } chunk_appendf(&trash, - ">%s" - "%s%s
%s
\n" "\n" "", - (uri->flags & ST_SHLGNDS) ? "":"", - px->id, px->id, px->id, (uri->flags & ST_SHLGNDS) ? "":"", px->desc ? "desc" : "empty", px->desc ? px->desc : ""); @@ -3046,6 +3048,20 @@ static void stats_dump_html_head(struct uri_auth *uri) "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" "u {text-decoration:none; border-bottom: 1px dotted black;}\n" + "div {\n" + " display:block;\n" + " visibility:hidden;\n" + " z-index:2147483647;\n" + " position:absolute;\n" + " padding:2px 4px 3px;\n" + " background:#f0f060; color:#000000;\n" + " border:1px solid #7040c0;\n" + " white-space:nowrap;\n" + " font-style:normal;font-size:11px;font-weight:normal;\n" + " -moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;\n" + " -moz-box-shadow:gray 2px 2px 3px;-webkit-box-shadow:gray 2px 2px 3px;box-shadow:gray 2px 2px 3px;\n" + "}\n" + "u:hover div {visibility:visible;}\n" "-->\n" "\n", (uri->flags & ST_SHNODE) ? " on " : "",