From d9b587f260b99045bce95b34cbe4c1cee7081262 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 26 Feb 2010 10:05:55 +0100 Subject: [PATCH] [STATS] report HTTP requests (total and rate) in frontends Now that we support keep-alive, it's important to report a separate counter for requests. Right now it just appears in the CSV output. --- include/proto/proxy.h | 9 +++++++++ include/types/counters.h | 2 ++ include/types/proxy.h | 1 + src/dumpstats.c | 15 +++++++++++++++ src/proto_http.c | 2 ++ 5 files changed, 29 insertions(+) diff --git a/include/proto/proxy.h b/include/proto/proxy.h index 5297d0806..288ca226a 100644 --- a/include/proto/proxy.h +++ b/include/proto/proxy.h @@ -89,6 +89,15 @@ static void inline proxy_inc_be_ctr(struct proxy *be) be->counters.be_sps_max = be->be_sess_per_sec.curr_ctr; } +/* increase the number of cumulated requests on the designated frontend */ +static void inline proxy_inc_fe_req_ctr(struct proxy *fe) +{ + fe->counters.cum_fe_req++; + update_freq_ctr(&fe->fe_req_per_sec, 1); + if (fe->fe_req_per_sec.curr_ctr > fe->counters.fe_rps_max) + fe->counters.fe_rps_max = fe->fe_req_per_sec.curr_ctr; +} + #endif /* _PROTO_PROXY_H */ /* diff --git a/include/types/counters.h b/include/types/counters.h index fa648a34e..2b4820783 100644 --- a/include/types/counters.h +++ b/include/types/counters.h @@ -25,9 +25,11 @@ struct pxcounters { unsigned int feconn_max, beconn_max; /* max # of active frontend and backend sessions */ + long long cum_fe_req; /* cumulated number of processed HTTP requests */ long long cum_feconn, cum_beconn; /* cumulated number of processed sessions */ long long cum_lbconn; /* cumulated number of sessions processed by load balancing */ + unsigned int fe_rps_max; /* maximum of new sessions per second seen on the frontend */ unsigned int fe_sps_max; /* maximum of new sessions per second seen on the frontend */ unsigned int be_sps_max; /* maximum of new sessions per second seen on the backend */ unsigned int nbpend_max; /* max number of pending connections with no server assigned yet */ diff --git a/include/types/proxy.h b/include/types/proxy.h index fabc93640..53c00f71e 100644 --- a/include/types/proxy.h +++ b/include/types/proxy.h @@ -225,6 +225,7 @@ struct proxy { int nbpend; /* number of pending connections with no server assigned yet */ int totpend; /* total number of pending connections on this instance (for stats) */ unsigned int feconn, beconn; /* # of active frontend and backends sessions */ + struct freq_ctr fe_req_per_sec; /* HTTP requests per second on the frontend */ struct freq_ctr fe_sess_per_sec; /* sessions per second on the frontend */ struct freq_ctr be_sess_per_sec; /* sessions per second on the backend */ unsigned int maxconn; /* max # of active sessions on the frontend */ diff --git a/src/dumpstats.c b/src/dumpstats.c index 35af8c12d..5f62dff77 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -248,6 +248,7 @@ int print_csv_header(struct chunk *msg) "rate,rate_lim,rate_max," "check_status,check_code,check_duration," "hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail," + "req_rate, req_rate_max, req_tot," "\n"); } @@ -358,6 +359,7 @@ int stats_sock_parse_request(struct stream_interface *si, char *line) else { px->counters.feconn_max = 0; px->counters.beconn_max = 0; + px->counters.fe_rps_max = 0; px->counters.fe_sps_max = 0; px->counters.be_sps_max = 0; px->counters.nbpend_max = 0; @@ -1512,6 +1514,11 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri) /* failed health analyses */ chunk_printf(&msg, ","); + /* requests : req_rate, req_rate_max, req_tot, */ + chunk_printf(&msg, "%u,%u,%lld,", + read_freq_ctr(&px->fe_req_per_sec), + px->counters.fe_rps_max, px->counters.cum_fe_req); + /* finish with EOL */ chunk_printf(&msg, "\n"); } @@ -1637,6 +1644,8 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri) ",,,,,," /* failed health analyses */ "," + /* requests : req_rate, req_rate_max, req_tot, */ + ",,," "\n", px->id, l->name, l->nbconn, l->counters->conn_max, @@ -2019,6 +2028,9 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri) /* failed health analyses */ chunk_printf(&msg, "%lld,", sv->counters.failed_hana); + /* requests : req_rate, req_rate_max, req_tot, */ + chunk_printf(&msg, ",,,"); + /* finish with EOL */ chunk_printf(&msg, "\n"); } @@ -2192,6 +2204,9 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri) /* failed health analyses */ chunk_printf(&msg, ","); + /* requests : req_rate, req_rate_max, req_tot, */ + chunk_printf(&msg, ",,,"); + /* finish with EOL */ chunk_printf(&msg, "\n"); diff --git a/src/proto_http.c b/src/proto_http.c index 8816699ac..0820be5bd 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2559,6 +2559,8 @@ int http_wait_for_request(struct session *s, struct buffer *req, int an_bit) * left uninitialized (for instance in the absence of headers). */ + proxy_inc_fe_req_ctr(s->fe); /* one more valid request for this FE */ + if (txn->flags & TX_WAIT_NEXT_RQ) { /* kill the pending keep-alive timeout */ txn->flags &= ~TX_WAIT_NEXT_RQ; -- 2.47.3