diff --git a/include/haproxy/counters-t.h b/include/haproxy/counters-t.h index d98990f13..4966197e9 100644 --- a/include/haproxy/counters-t.h +++ b/include/haproxy/counters-t.h @@ -45,6 +45,10 @@ long long cli_aborts; /* aborted responses during DATA phase caused by the client */\ long long internal_errors; /* internal processing errors */\ long long failed_rewrites; /* failed rewrites (warning) */\ + long long req_in; /* number of bytes received from the client */\ + long long req_out; /* number of bytes sent to the server */\ + long long res_in; /* number of bytes received from the server */\ + long long res_out; /* number of bytes sent to the client */\ long long bytes_out; /* number of bytes transferred from the server to the client */\ long long bytes_in; /* number of bytes transferred from the client to the server */\ long long denied_resp; /* blocked responses because of security concerns */\ diff --git a/src/stream.c b/src/stream.c index 11cb96781..d8ed41935 100644 --- a/src/stream.c +++ b/src/stream.c @@ -867,10 +867,65 @@ void stream_process_counters(struct stream *s) } } + bytes = s->scf->bytes_in - s->logs.req_in; s->logs.req_in = s->scf->bytes_in; + if (bytes) { + if (sess->fe_tgcounters) + _HA_ATOMIC_ADD(&sess->fe_tgcounters->req_in, bytes); + if (s->be_tgcounters) + _HA_ATOMIC_ADD(&s->be_tgcounters->req_in, bytes); + + if (s->sv_tgcounters) + _HA_ATOMIC_ADD(&s->sv_tgcounters->req_in, bytes); + + if (sess->li_tgcounters) + _HA_ATOMIC_ADD(&sess->li_tgcounters->req_in, bytes); + } + + bytes = s->scb->bytes_out - s->logs.req_out; s->logs.req_out = s->scb->bytes_out; + if (bytes) { + if (sess->fe_tgcounters) + _HA_ATOMIC_ADD(&sess->fe_tgcounters->req_out, bytes); + if (s->be_tgcounters) + _HA_ATOMIC_ADD(&s->be_tgcounters->req_out, bytes); + + if (s->sv_tgcounters) + _HA_ATOMIC_ADD(&s->sv_tgcounters->req_out, bytes); + + if (sess->li_tgcounters) + _HA_ATOMIC_ADD(&sess->li_tgcounters->req_out, bytes); + } + + bytes = s->scb->bytes_in - s->logs.res_in; s->logs.res_in = s->scb->bytes_in; + if (bytes) { + if (sess->fe_tgcounters) + _HA_ATOMIC_ADD(&sess->fe_tgcounters->res_in, bytes); + if (s->be_tgcounters) + _HA_ATOMIC_ADD(&s->be_tgcounters->res_in, bytes); + + if (s->sv_tgcounters) + _HA_ATOMIC_ADD(&s->sv_tgcounters->res_in, bytes); + + if (sess->li_tgcounters) + _HA_ATOMIC_ADD(&sess->li_tgcounters->res_in, bytes); + } + + bytes = s->scf->bytes_out - s->logs.res_out; s->logs.res_out = s->scf->bytes_out; + if (bytes) { + if (sess->fe_tgcounters) + _HA_ATOMIC_ADD(&sess->fe_tgcounters->res_out, bytes); + if (s->be_tgcounters) + _HA_ATOMIC_ADD(&s->be_tgcounters->res_out, bytes); + + if (s->sv_tgcounters) + _HA_ATOMIC_ADD(&s->sv_tgcounters->res_out, bytes); + + if (sess->li_tgcounters) + _HA_ATOMIC_ADD(&sess->li_tgcounters->res_out, bytes); + } } /* Abort processing on the both channels in same time */