From e3b3065877e4995844c36d4f7685bee4817072b2 Mon Sep 17 00:00:00 2001 From: willy tarreau Date: Sun, 21 May 2006 16:23:22 +0200 Subject: [PATCH] [MEDIUM] added counters for connect/response/security errors --- haproxy.c | 107 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 89 insertions(+), 18 deletions(-) diff --git a/haproxy.c b/haproxy.c index 37ee7573f..6a5df0343 100644 --- a/haproxy.c +++ b/haproxy.c @@ -588,6 +588,8 @@ struct server { 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 @@ struct proxy { 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 @@ int produce_content(struct session *s) { 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 @@ int produce_content(struct session *s) { px->nbconn, px->maxconn, px->totpend, px->nbpend, px->cum_conn); msglen += snprintf(trash + msglen, sizeof(trash) - msglen, - "\n" + "
\n" "" "" "" "" - "\n" + "\n" "" "" "" "" - "\n"); + "\n"); if (buffer_write(rep, trash, msglen) != 0) return 0; @@ -3302,7 +3307,12 @@ int produce_content(struct session *s) { "", 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, + "\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, "\n", @@ -3326,15 +3336,23 @@ int produce_content(struct session *s) { * 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 @@ int produce_content(struct session *s) { "", dispatch_sess, px->nbconn_max, px->maxconn, dispatch_cum); - /* failures : unique, fatal */ + /* errors : connect, response, security */ + msglen += snprintf(trash + msglen, sizeof(trash) - msglen, + "\n", + failed_conns, failed_resp, failed_secu); + + /* check failures : unique, fatal */ msglen += snprintf(trash + msglen, sizeof(trash) - msglen, "\n"); @@ -3379,7 +3402,12 @@ int produce_content(struct session *s) { "", px->nbconn, px->nbconn_max, px->maxconn, px->cum_conn); - /* failures : unique, fatal */ + /* errors : connect, response, security */ + msglen += snprintf(trash + msglen, sizeof(trash) - msglen, + "\n", + px->failed_conns, px->failed_resp, px->failed_secu); + + /* check failures : unique, fatal */ msglen += snprintf(trash + msglen, sizeof(trash) - msglen, "\n", failed_checks, down_trans); @@ -5209,7 +5237,10 @@ int srv_count_retry_down(struct session *t, int conn_err) { 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 @@ int srv_retryable_connect(struct session *t) { 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 @@ int srv_retryable_connect(struct session *t) { 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 @@ int srv_redispatch_connect(struct session *t) { 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 @@ int srv_redispatch_connect(struct session *t) { 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 @@ int process_srv(struct session *t) { 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 @@ int process_srv(struct session *t) { 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 @@ int process_srv(struct session *t) { 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 @@ int process_srv(struct session *t) { * 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 @@ int process_srv(struct session *t) { 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 @@ int process_srv(struct session *t) { 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 @@ int process_srv(struct session *t) { 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 @@ int process_srv(struct session *t) { //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 @@ int process_srv(struct session *t) { //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))
ServerQueueSessionsChecks
Errors
NameWeightStatusAct.Bck.Curr.Max.Curr.Max.LimitCumul.FailedFatal
Conn.Resp.Sec.CheckDown
%d%d%s%d%d%d%d%d%d
%d%d%d%d%d%d%d--
%d%d%d%d%d%d%d%d%d