[MEDIUM] added counters for connect/response/security errors
diff --git a/haproxy.c b/haproxy.c
index 37ee757..6a5df03 100644
--- a/haproxy.c
+++ b/haproxy.c
@@ -588,6 +588,8 @@
unsigned int cum_sess; /* cumulated number of sessions really sent to this server */
unsigned int maxconn; /* max # of active sessions. 0 = unlimited. */
unsigned failed_checks, down_trans; /* failed checks and up-down transitions */
+ unsigned failed_conns, failed_resp; /* failed connect() and responses */
+ unsigned failed_secu; /* blocked responses because of security concerns */
struct proxy *proxy; /* the proxy this server belongs to */
};
@@ -695,6 +697,8 @@
int nbconn, nbconn_max; /* # of active sessions */
unsigned int cum_conn; /* cumulated number of processed sessions */
int maxconn; /* max # of active sessions */
+ unsigned failed_conns, failed_resp; /* failed connect() and responses */
+ unsigned failed_secu; /* blocked responses because of security concerns */
int conn_retries; /* maximum number of connect retries */
int options; /* PR_O_REDISP, PR_O_TRANSP, ... */
int mode; /* mode = PR_MODE_TCP, PR_MODE_HTTP or PR_MODE_HEALTH */
@@ -3190,6 +3194,7 @@
while (s->data_ctx.stats.px) {
int dispatch_sess, dispatch_cum;
int failed_checks, down_trans;
+ int failed_secu, failed_conns, failed_resp;
if (s->data_ctx.stats.px_st == DATA_ST_INIT) {
/* we are on a new proxy */
@@ -3231,17 +3236,17 @@
px->nbconn, px->maxconn, px->totpend, px->nbpend, px->cum_conn);
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
- "<table cols=\"13\" class=\"tbl\">\n"
+ "<table cols=\"16\" class=\"tbl\">\n"
"<tr align=\"center\" bgcolor=\"#20C0C0\">"
"<th colspan=5>Server</th>"
"<th colspan=2>Queue</th>"
"<th colspan=4>Sessions</th>"
- "<th colspan=2>Checks</th></tr>\n"
+ "<th colspan=5>Errors</th></tr>\n"
"<tr align=\"center\" bgcolor=\"#20C0C0\">"
"<th>Name</th><th>Weight</th><th>Status</th><th>Act.</th><th>Bck.</th>"
"<th>Curr.</th><th>Max.</th>"
"<th>Curr.</th><th>Max.</th><th>Limit</th><th>Cumul.</th>"
- "<th>Failed</th><th>Fatal</th></tr>\n");
+ "<th>Conn.</th><th>Resp.</th><th>Sec.</th><th>Check</th><th>Down</th></tr>\n");
if (buffer_write(rep, trash, msglen) != 0)
return 0;
@@ -3302,7 +3307,12 @@
"<td align=right>%d</td><td align=right>%d</td><td align=right>%s</td><td align=right>%d</td>",
sv->cur_sess, sv->cur_sess_max, sv->maxconn ? ultoa(sv->maxconn) : "-", sv->cum_sess);
- /* failures : unique, fatal */
+ /* errors : connect, response, security */
+ msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
+ "<td align=right>%d</td><td align=right>%d</td><td align=right>%d</td>\n",
+ sv->failed_conns, sv->failed_resp, sv->failed_secu);
+
+ /* check failures : unique, fatal */
if (sv->state & SRV_CHECKED)
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
"<td align=right>%d</td><td align=right>%d</td></tr>\n",
@@ -3326,15 +3336,23 @@
* might be interrupted multiple times.
*/
dispatch_sess = px->nbconn;
- dispatch_cum = px->cum_conn;
+ dispatch_cum = px->cum_conn;
+ failed_secu = px->failed_secu;
+ failed_conns = px->failed_conns;
+ failed_resp = px->failed_resp;
failed_checks = down_trans = 0;
sv = px->srv;
while (sv) {
dispatch_sess -= sv->cur_sess;
dispatch_cum -= sv->cum_sess;
- failed_checks += sv->failed_checks;
- down_trans += sv->down_trans;
+ failed_conns -= sv->failed_conns;
+ failed_resp -= sv->failed_resp;
+ failed_secu -= sv->failed_secu;
+ if (sv->state & SRV_CHECKED) {
+ failed_checks += sv->failed_checks;
+ down_trans += sv->down_trans;
+ }
sv = sv->next;
}
@@ -3355,7 +3373,12 @@
"<td align=right>%d</td><td align=right>%d</td><td align=right>%d</td><td align=right>%d</td>",
dispatch_sess, px->nbconn_max, px->maxconn, dispatch_cum);
- /* failures : unique, fatal */
+ /* errors : connect, response, security */
+ msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
+ "<td align=right>%d</td><td align=right>%d</td><td align=right>%d</td>\n",
+ failed_conns, failed_resp, failed_secu);
+
+ /* check failures : unique, fatal */
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
"<td align=right>-</td><td align=right>-</td></tr>\n");
@@ -3379,7 +3402,12 @@
"<td align=right><b>%d</b></td><td align=right><b>%d</b></td><td align=right><b>%d</b></td><td align=right><b>%d</b></td>",
px->nbconn, px->nbconn_max, px->maxconn, px->cum_conn);
+ /* errors : connect, response, security */
+ msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
+ "<td align=right>%d</td><td align=right>%d</td><td align=right>%d</td>\n",
+ px->failed_conns, px->failed_resp, px->failed_secu);
+
- /* failures : unique, fatal */
+ /* check failures : unique, fatal */
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
"<td align=right>%d</td><td align=right>%d</td></tr>\n",
failed_checks, down_trans);
@@ -5209,7 +5237,10 @@
tv_eternity(&t->cnexpire);
srv_close_with_err(t, conn_err, SN_FINST_C,
503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
-
+ if (t->srv)
+ t->srv->failed_conns++;
+ t->proxy->failed_conns++;
+
/* We used to have a free connection slot. Since we'll never use it,
* we have to inform the server that it may be used by another session.
*/
@@ -5246,6 +5277,9 @@
tv_eternity(&t->cnexpire);
srv_close_with_err(t, SN_ERR_INTERNAL, SN_FINST_C,
500, t->proxy->errmsg.len500, t->proxy->errmsg.msg500);
+ if (t->srv)
+ t->srv->failed_conns++;
+ t->proxy->failed_conns++;
/* release other sessions waiting for this server */
if (may_dequeue_tasks(t->srv, t->proxy))
task_wakeup(&rq, t->srv->queue_mgt);
@@ -5267,6 +5301,10 @@
if (may_dequeue_tasks(t->srv, t->proxy))
task_wakeup(&rq, t->srv->queue_mgt);
+ if (t->srv)
+ t->srv->failed_conns++;
+ t->proxy->failed_conns++;
+
t->flags &= ~(SN_DIRECT | SN_ASSIGNED | SN_ADDR_SET);
t->srv = NULL; /* it's left to the dispatcher to choose a server */
if ((t->flags & SN_CK_MASK) == SN_CK_VALID) {
@@ -5300,6 +5338,10 @@
tv_eternity(&t->cnexpire);
srv_close_with_err(t, SN_ERR_SRVTO, SN_FINST_C,
503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
+ if (t->srv)
+ t->srv->failed_conns++;
+ t->proxy->failed_conns++;
+
return 1;
case SRV_STATUS_QUEUED:
@@ -5318,6 +5360,10 @@
tv_eternity(&t->cnexpire);
srv_close_with_err(t, SN_ERR_INTERNAL, SN_FINST_C,
500, t->proxy->errmsg.len500, t->proxy->errmsg.msg500);
+ if (t->srv)
+ t->srv->failed_conns++;
+ t->proxy->failed_conns++;
+
/* release other sessions waiting for this server */
if (may_dequeue_tasks(t->srv, t->proxy))
task_wakeup(&rq, t->srv->queue_mgt);
@@ -5381,6 +5427,9 @@
t->logs.t_queue = tv_diff(&t->logs.tv_accept, &now);
srv_close_with_err(t, SN_ERR_SRVTO, SN_FINST_Q,
503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
+ if (t->srv)
+ t->srv->failed_conns++;
+ t->proxy->failed_conns++;
return 1;
}
}
@@ -5517,8 +5566,11 @@
tv_eternity(&t->srexpire);
tv_eternity(&t->swexpire);
fd_delete(t->srv_fd);
- if (t->srv)
+ if (t->srv) {
t->srv->cur_sess--;
+ t->srv->failed_secu++;
+ }
+ t->proxy->failed_secu++;
t->srv_state = SV_STCLOSE;
t->logs.status = 502;
client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
@@ -5545,8 +5597,11 @@
tv_eternity(&t->srexpire);
tv_eternity(&t->swexpire);
fd_delete(t->srv_fd);
- if (t->srv)
+ if (t->srv) {
t->srv->cur_sess--;
+ t->srv->failed_secu++;
+ }
+ t->proxy->failed_secu++;
t->srv_state = SV_STCLOSE;
t->logs.status = 502;
client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
@@ -5684,7 +5739,7 @@
* unless the response includes appropriate
* Cache-Control or Expires header fields."
*/
- if ((!t->flags & SN_POST) && (t->proxy->options & PR_O_CHK_CACHE))
+ if (!t->flags & SN_POST && (t->proxy->options & PR_O_CHK_CACHE))
t->flags |= SN_CACHEABLE | SN_CACHE_COOK;
break;
default:
@@ -5985,8 +6040,12 @@
tv_eternity(&t->srexpire);
tv_eternity(&t->swexpire);
fd_delete(t->srv_fd);
- if (t->srv)
+ if (t->srv) {
t->srv->cur_sess--;
+ t->srv->failed_resp++;
+ }
+ t->proxy->failed_resp++;
+
t->srv_state = SV_STCLOSE;
t->logs.status = 502;
client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
@@ -6020,8 +6079,11 @@
tv_eternity(&t->srexpire);
tv_eternity(&t->swexpire);
fd_delete(t->srv_fd);
- if (t->srv)
+ if (t->srv) {
t->srv->cur_sess--;
+ t->srv->failed_resp++;
+ }
+ t->proxy->failed_resp++;
t->srv_state = SV_STCLOSE;
t->logs.status = 504;
client_return(t, t->proxy->errmsg.len504, t->proxy->errmsg.msg504);
@@ -6122,8 +6184,11 @@
tv_eternity(&t->srexpire);
tv_eternity(&t->swexpire);
fd_delete(t->srv_fd);
- if (t->srv)
+ if (t->srv) {
t->srv->cur_sess--;
+ t->srv->failed_resp++;
+ }
+ t->proxy->failed_resp++;
t->srv_state = SV_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
t->flags |= SN_ERR_SRVCL;
@@ -6235,8 +6300,11 @@
//FD_CLR(t->srv_fd, StaticWriteEvent);
tv_eternity(&t->swexpire);
fd_delete(t->srv_fd);
- if (t->srv)
+ if (t->srv) {
t->srv->cur_sess--;
+ t->srv->failed_resp++;
+ }
+ t->proxy->failed_resp++;
//close(t->srv_fd);
t->srv_state = SV_STCLOSE;
if (!(t->flags & SN_ERR_MASK))
@@ -6313,8 +6381,11 @@
//FD_CLR(t->srv_fd, StaticReadEvent);
tv_eternity(&t->srexpire);
fd_delete(t->srv_fd);
- if (t->srv)
+ if (t->srv) {
t->srv->cur_sess--;
+ t->srv->failed_resp++;
+ }
+ t->proxy->failed_resp++;
//close(t->srv_fd);
t->srv_state = SV_STCLOSE;
if (!(t->flags & SN_ERR_MASK))