if (px->mode == PR_MODE_HTTP)
chunk_appendf(&trash,
/* sessions rate : current, max, limit */
- "<td title=\"Cur: %u req/s\"><u>%s</u></td><td title=\"Max: %u req/s\"><u>%s</u></td><td>%s</td>"
+ "<td><u>%s<div>Cur: %s req/s</div></u></td><td><u>%s<div>Max: %s req/s</div></u></td><td>%s</td>"
"",
- 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 */
U2H1(px->fe_counters.sps_max), LIM2A2(px->fe_sps_lim, "-"));
chunk_appendf(&trash,
- /* sessions: current, max, limit */
+ /* sessions: current, max, limit, total */
"<td>%s</td><td>%s</td><td>%s</td>"
- "<td"
+ "<td>%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)?"<u>":"", 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, "<div>%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]);
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</div></u>", px->fe_counters.intercepted_req);
}
chunk_appendf(&trash,
- /* sessions: total, lbtot */
- ">%s%s%s</td><td></td>"
+ /* sessions: lbtot */
+ "</td><td></td>"
/* bytes : in */
- "<td>%s</td><td"
+ "<td>%s</td>"
"",
- (px->mode == PR_MODE_HTTP)?"<u>":"",
- U2H6(px->fe_counters.cum_sess),
- (px->mode == PR_MODE_HTTP)?"</u>":"",
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</td>"
- "",
+ /* bytes:out + compression stats (via hover): comp_in, comp_out, comp_byp */
+ "<td>%s%s<div>compression: in=%lld out=%lld bypassed=%lld savings=%d%%</div>%s</td>",
(px->fe_counters.comp_in || px->fe_counters.comp_byp) ? "<u>":"",
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) ? "</u>":"");
chunk_appendf(&trash,
/* Column sub-heading for Enable or Disable server */
chunk_appendf(&trash, "<td></td>");
}
- chunk_appendf(&trash, "<td class=ac");
+ chunk_appendf(&trash,
+ /* frontend name, listener name */
+ "<td class=ac><a name=\"%s/+%s\"></a>%s"
+ "<a class=lfsb href=\"#%s/+%s\">%s</a>"
+ "",
+ px->id, l->name,
+ (flags & ST_SHLGNDS)?"<u>":"",
+ px->id, l->name, l->name);
if (flags & ST_SHLGNDS) {
char str[INET6_ADDRSTRLEN];
int port;
- chunk_appendf(&trash, " title=\"");
+ chunk_appendf(&trash, "<div>");
port = get_host_port(&l->addr);
switch (addr_to_str(&l->addr, str, sizeof(str))) {
}
/* id */
- chunk_appendf(&trash, "id: %d\"", l->luid);
+ chunk_appendf(&trash, "id: %d</div>", l->luid);
}
chunk_appendf(&trash,
- /* name, queue */
- ">%s<a name=\"%s/+%s\"></a>"
- "<a class=lfsb href=\"#%s/+%s\">%s</a></td><td colspan=3>%s</td>"
+ /* queue */
+ "%s</td><td colspan=3></td>"
/* sessions rate: current, max, limit */
"<td colspan=3> </td>"
/* sessions: current, max, limit, total, lbtot */
/* bytes: in, out */
"<td>%s</td><td>%s</td>"
"",
- (flags & ST_SHLGNDS)?"<u>":"",
- px->id, l->name, px->id, l->name, l->name,
(flags & ST_SHLGNDS)?"</u>":"",
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));
"<td><input type=\"checkbox\" name=\"s\" value=\"%s\"></td>",
sv->id);
- chunk_appendf(&trash, "<td class=ac");
+ chunk_appendf(&trash,
+ "<td class=ac><a name=\"%s/%s\"></a>%s"
+ "<a class=lfsb href=\"#%s/%s\">%s</a>"
+ "",
+ px->id, sv->id,
+ (flags & ST_SHLGNDS) ? "<u>" : "",
+ px->id, sv->id, sv->id);
if (flags & ST_SHLGNDS) {
- chunk_appendf(&trash, " title=\"");
+ chunk_appendf(&trash, "<div>");
switch (addr_to_str(&sv->addr, str, sizeof(str))) {
case AF_INET:
chunk_appendf(&trash, "'");
}
- chunk_appendf(&trash, "\"");
+ chunk_appendf(&trash, "</div>");
}
chunk_appendf(&trash,
- ">%s<a name=\"%s/%s\"></a>"
- "<a class=lfsb href=\"#%s/%s\">%s</a>%s</td>"
/* queue : current, max, limit */
- "<td>%s</td><td>%s</td><td>%s</td>"
+ "%s</td><td>%s</td><td>%s</td><td>%s</td>"
/* sessions rate : current, max, limit */
"<td>%s</td><td>%s</td><td></td>"
/* sessions: current, max, limit */
"<td>%s</td><td>%s</td><td>%s</td>"
- "<td"
+ /* sessions: total */
+ "<td>%s%s"
"",
- (flags & ST_SHLGNDS) ? "<u>" : "",
- px->id, sv->id, px->id, sv->id, sv->id,
(flags & ST_SHLGNDS) ? "</u>" : "",
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) ? "<u>" : "", 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, "<div>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</div>", sv->counters.p.http.rsp[0]);
}
chunk_appendf(&trash,
- /* sessions: total, lbtot */
- ">%s%s%s</td><td>%s</td>",
- (px->mode == PR_MODE_HTTP)?"<u>":"",
- U2H0(sv->counters.cum_sess),
- (px->mode == PR_MODE_HTTP)?"</u>":"",
+ /* sessions: lbtot */
+ "%s</td><td>%s</td>",
+ (px->mode == PR_MODE_HTTP) ? "</u>" : "",
U2H1(sv->counters.cum_lbconn));
chunk_appendf(&trash,
/* errors : request, connect */
"<td></td><td>%s</td>"
/* errors : response */
- "<td title=\"Connection resets during transfers: %lld client, %lld server\"><u>%s</u></td>"
+ "<td><u>%s<div>Connection resets during transfers: %lld client, %lld server</div></u></td>"
/* warnings: retries, redispatches */
"<td>%lld</td><td>%lld</td>"
"",
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 */
}
if (sv->state & SRV_CHECKED) {
- chunk_appendf(&trash, "</td><td class=ac title=\"%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, "\"><u> %s%s",
+ chunk_appendf(&trash,
+ "</td><td class=ac><u> %s%s",
(sv->state & SRV_CHK_RUNNING) ? "* " : "",
get_check_status_info(sv->check.status));
chunk_appendf(&trash, "/%d", sv->check.code);
if (sv->check.status >= HCHK_STATUS_CHECKED && sv->check.duration >= 0)
- chunk_appendf(&trash, " in %lums</u>", sv->check.duration);
+ chunk_appendf(&trash, " in %lums", sv->check.duration);
+
+ chunk_appendf(&trash, "<div>%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, "</div></u>");
}
else
chunk_appendf(&trash, "</td><td>");
/* check failures: unique, fatal, down time */
if (sv->state & SRV_CHECKED) {
- chunk_appendf(&trash, "<td title=\"Failed Health Checks%s\"><u>%lld",
- ref->observe?"/Health Analyses":"", ref->counters.failed_checks);
+ chunk_appendf(&trash, "<td><u>%lld", ref->counters.failed_checks);
if (ref->observe)
chunk_appendf(&trash, "/%lld", ref->counters.failed_hana);
chunk_appendf(&trash,
- "</u></td>"
+ "<div>Failed Health Checks%s</div></u></td>"
"<td>%lld</td><td>%s</td>"
"",
+ ref->observe ? "/Health Analyses" : "",
ref->counters.down_trans, human_time(srv_downtime(sv), 1));
}
else if (sv != ref)
/* Column sub-heading for Enable or Disable server */
chunk_appendf(&trash, "<td></td>");
}
- chunk_appendf(&trash, "<td class=ac");
+ chunk_appendf(&trash,
+ "<td class=ac>"
+ /* name */
+ "%s<a name=\"%s/Backend\"></a>"
+ "<a class=lfsb href=\"#%s/Backend\">Backend</a>"
+ "",
+ (flags & ST_SHLGNDS)?"<u>":"",
+ px->id, px->id);
if (flags & ST_SHLGNDS) {
/* balancing */
- chunk_appendf(&trash, " title=\"balancing: %s",
+ chunk_appendf(&trash, "<div>balancing: %s",
backend_lb_algo_str(px->lbprm.algo & BE_LB_ALGO));
/* cookie */
chunk_htmlencode(&trash, &src);
chunk_appendf(&trash, "'");
}
- chunk_appendf(&trash, "\"");
+ chunk_appendf(&trash, "</div>");
}
chunk_appendf(&trash,
- /* name */
- ">%s<a name=\"%s/Backend\"></a>"
- "<a class=lfsb href=\"#%s/Backend\">Backend</a>%s</td>"
+ "%s</td>"
/* queue : current, max */
"<td>%s</td><td>%s</td><td></td>"
/* sessions rate : current, max, limit */
"<td>%s</td><td>%s</td><td></td>"
"",
- (flags & ST_SHLGNDS)?"<u>":"",
- px->id, px->id,
(flags & ST_SHLGNDS)?"</u>":"",
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 */
"<td>%s</td><td>%s</td><td>%s</td>"
- "<td"
+ "<td>%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)?"<u>":"", 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, "<div>%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%%)</div></u>",
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</td><td>%s</td>"
+ /* sessions: lbtot */
+ "</td><td>%s</td>"
/* bytes: in */
- "<td>%s</td><td"
+ "<td>%s</td>"
"",
- (px->mode == PR_MODE_HTTP)?"<u>":"",
- U2H6(px->be_counters.cum_conn),
- (px->mode == PR_MODE_HTTP)?"</u>":"",
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</td>"
- "",
+ /* bytes:out + compression stats (via hover): comp_in, comp_out, comp_byp */
+ "<td>%s%s<div>compression: in=%lld out=%lld bypassed=%lld savings=%d%%</div>%s</td>",
(px->be_counters.comp_in || px->be_counters.comp_byp) ? "<u>":"",
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) ? "</u>":"");
chunk_appendf(&trash,
/* errors : request, connect */
"<td></td><td>%s</td>"
/* errors : response */
- "<td title=\"Connection resets during transfers: %lld client, %lld server\"><u>%s</u></td>"
+ "<td><u>%s<div>Connection resets during transfers: %lld client, %lld server</div></u></td>"
/* warnings: retries, redispatches */
"<td>%lld</td><td>%lld</td>"
/* backend status: reflect backend status (up/down): we display UP
"",
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" :
chunk_appendf(&trash,
"<table class=\"tbl\" width=\"100%%\">\n"
"<tr class=\"titre\">"
- "<th class=\"pxname\" width=\"10%%\"");
+ "<th class=\"pxname\" width=\"10%%\">");
+
+ chunk_appendf(&trash,
+ "<a name=\"%s\"></a>%s"
+ "<a class=px href=\"#%s\">%s</a>",
+ px->id,
+ (uri->flags & ST_SHLGNDS) ? "<u>":"",
+ 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, "<div>cap: %s, mode: %s, id: %d",
proxy_cap_str(px->cap), proxy_mode_str(px->mode),
px->uuid);
- chunk_appendf(&trash, "\"");
+ chunk_appendf(&trash, "</div>");
}
chunk_appendf(&trash,
- ">%s<a name=\"%s\"></a>"
- "<a class=px href=\"#%s\">%s</a>%s</th>"
+ "%s</th>"
"<th class=\"%s\" width=\"90%%\">%s</th>"
"</tr>\n"
"</table>\n"
"<table class=\"tbl\" width=\"100%%\">\n"
"<tr class=\"titre\">",
- (uri->flags & ST_SHLGNDS) ? "<u>":"",
- px->id, px->id, px->id,
(uri->flags & ST_SHLGNDS) ? "</u>":"",
px->desc ? "desc" : "empty", px->desc ? px->desc : "");
"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"
"</style></head>\n",
(uri->flags & ST_SHNODE) ? " on " : "",