MINOR: counters: Review conditions to increment counters from analysers

Now, for these counters, the following rules are followed to know if it must be
incremented or not:

  * if it exists for a frontend, the counter is incremented
  * if stats must be collected for the session's listener, if the counter exists
    for this listener, it is incremented
  * if the backend is already assigned, if the counter exists for this backend,
    it is incremented
  * if a server is attached to the stream, if the counter exists for this
    server, it is incremented

It is not hardcoded rules. Some counters are still handled in a different
way. But many counters are incremented this way now.
diff --git a/src/fcgi-app.c b/src/fcgi-app.c
index 2e01cdb..f7108c3 100644
--- a/src/fcgi-app.c
+++ b/src/fcgi-app.c
@@ -474,10 +474,11 @@
 
   rewrite_err:
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.failed_rewrites, 1);
-	if (sess->fe != s->be)
-		_HA_ATOMIC_ADD(&s->be->be_counters.failed_rewrites, 1);
+	_HA_ATOMIC_ADD(&s->be->be_counters.failed_rewrites, 1);
 	if (sess->listener->counters)
 		_HA_ATOMIC_ADD(&sess->listener->counters->failed_rewrites, 1);
+	if (objt_server(s->target))
+		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.failed_rewrites, 1);
   hdr_rule_err:
 	node = ebpt_first(&hdr_rules);
 	while (node) {
diff --git a/src/http_ana.c b/src/http_ana.c
index cb87db2..5e8d0ab 100644
--- a/src/http_ana.c
+++ b/src/http_ana.c
@@ -650,7 +650,7 @@
 		req->analyse_exp = tick_add(now_ms, 0);
 	stream_inc_http_err_ctr(s);
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.denied_req, 1);
-	if (sess->fe != s->be)
+	if (s->flags & SF_BE_ASSIGNED)
 		_HA_ATOMIC_ADD(&s->be->be_counters.denied_req, 1);
 	if (sess->listener->counters)
 		_HA_ATOMIC_ADD(&sess->listener->counters->denied_req, 1);
@@ -668,7 +668,7 @@
 	s->logs.tv_request = now;
 	stream_inc_http_err_ctr(s);
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.denied_req, 1);
-	if (sess->fe != s->be)
+	if (s->flags & SF_BE_ASSIGNED)
 		_HA_ATOMIC_ADD(&s->be->be_counters.denied_req, 1);
 	if (sess->listener->counters)
 		_HA_ATOMIC_ADD(&sess->listener->counters->denied_req, 1);
@@ -679,6 +679,8 @@
 	if (!(s->flags & SF_ERR_MASK))
 		s->flags |= SF_ERR_INTERNAL;
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.internal_errors, 1);
+	if (s->flags & SF_BE_ASSIGNED)
+		_HA_ATOMIC_ADD(&s->be->be_counters.internal_errors, 1);
 	if (sess->listener->counters)
 		_HA_ATOMIC_ADD(&sess->listener->counters->internal_errors, 1);
 	goto return_prx_err;
@@ -941,6 +943,8 @@
 	if (!(s->flags & SF_ERR_MASK))
 		s->flags |= SF_ERR_INTERNAL;
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.internal_errors, 1);
+	if (s->flags & SF_BE_ASSIGNED)
+		_HA_ATOMIC_ADD(&sess->fe->be_counters.internal_errors, 1);
 	if (sess->listener->counters)
 		_HA_ATOMIC_ADD(&sess->listener->counters->internal_errors, 1);
 	goto return_prx_cond;
@@ -1101,6 +1105,8 @@
 	if (!(s->flags & SF_ERR_MASK))
 		s->flags |= SF_ERR_INTERNAL;
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.internal_errors, 1);
+	if (s->flags & SF_BE_ASSIGNED)
+		_HA_ATOMIC_ADD(&sess->fe->be_counters.internal_errors, 1);
 	if (sess->listener->counters)
 		_HA_ATOMIC_ADD(&sess->listener->counters->internal_errors, 1);
 	goto return_prx_cond;
@@ -1338,8 +1344,10 @@
   return_cli_abort:
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.cli_aborts, 1);
 	_HA_ATOMIC_ADD(&s->be->be_counters.cli_aborts, 1);
+	if (sess->listener->counters)
+		_HA_ATOMIC_ADD(&sess->listener->counters->cli_aborts, 1);
 	if (objt_server(s->target))
-		_HA_ATOMIC_ADD(&objt_server(s->target)->counters.cli_aborts, 1);
+		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.cli_aborts, 1);
 	if (!(s->flags & SF_ERR_MASK))
 		s->flags |= SF_ERR_CLICL;
 	status = 400;
@@ -1348,8 +1356,10 @@
   return_srv_abort:
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.srv_aborts, 1);
 	_HA_ATOMIC_ADD(&s->be->be_counters.srv_aborts, 1);
+	if (sess->listener->counters)
+		_HA_ATOMIC_ADD(&sess->listener->counters->srv_aborts, 1);
 	if (objt_server(s->target))
-		_HA_ATOMIC_ADD(&objt_server(s->target)->counters.srv_aborts, 1);
+		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.srv_aborts, 1);
 	if (!(s->flags & SF_ERR_MASK))
 		s->flags |= SF_ERR_SRVCL;
 	status = 502;
@@ -1359,8 +1369,11 @@
 	if (!(s->flags & SF_ERR_MASK))
 		s->flags |= SF_ERR_INTERNAL;
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.internal_errors, 1);
+	_HA_ATOMIC_ADD(&s->be->be_counters.internal_errors, 1);
 	if (sess->listener->counters)
 		_HA_ATOMIC_ADD(&sess->listener->counters->internal_errors, 1);
+	if (objt_server(s->target))
+		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.internal_errors, 1);
 	status = 500;
 	goto return_prx_cond;
 
@@ -1573,6 +1586,8 @@
 		else if ((rep->flags & CF_SHUTR) && ((s->req.flags & (CF_SHUTR|CF_SHUTW)) == (CF_SHUTR|CF_SHUTW))) {
 			_HA_ATOMIC_ADD(&sess->fe->fe_counters.cli_aborts, 1);
 			_HA_ATOMIC_ADD(&s->be->be_counters.cli_aborts, 1);
+			if (sess->listener->counters)
+				_HA_ATOMIC_ADD(&sess->listener->counters->cli_aborts, 1);
 			if (objt_server(s->target))
 				_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.cli_aborts, 1);
 
@@ -1631,6 +1646,8 @@
 				goto abort_keep_alive;
 
 			_HA_ATOMIC_ADD(&s->be->be_counters.failed_resp, 1);
+			if (objt_server(s->target))
+				_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.failed_resp, 1);
 			rep->analysers &= AN_RES_FLT_END;
 
 			if (!(s->flags & SF_ERR_MASK))
@@ -1827,7 +1844,10 @@
 	return 1;
 
  return_int_err:
+	_HA_ATOMIC_ADD(&sess->fe->fe_counters.internal_errors, 1);
 	_HA_ATOMIC_ADD(&s->be->be_counters.internal_errors, 1);
+	if (sess->listener->counters)
+		_HA_ATOMIC_ADD(&sess->listener->counters->internal_errors, 1);
 	if (objt_server(s->target))
 		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.internal_errors, 1);
 	txn->status = 500;
@@ -2136,9 +2156,12 @@
 	txn->status = 500;
 	if (!(s->flags & SF_ERR_MASK))
 		s->flags |= SF_ERR_INTERNAL;
+	_HA_ATOMIC_ADD(&sess->fe->fe_counters.internal_errors, 1);
 	_HA_ATOMIC_ADD(&s->be->be_counters.internal_errors, 1);
 	if (objt_server(s->target))
 		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.internal_errors, 1);
+	if (objt_server(s->target))
+		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.internal_errors, 1);
 	goto return_prx_err;
 
  return_bad_res:
@@ -2381,8 +2404,10 @@
   return_srv_abort:
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.srv_aborts, 1);
 	_HA_ATOMIC_ADD(&s->be->be_counters.srv_aborts, 1);
+	if (sess->listener->counters)
+		_HA_ATOMIC_ADD(&sess->listener->counters->srv_aborts, 1);
 	if (objt_server(s->target))
-		_HA_ATOMIC_ADD(&objt_server(s->target)->counters.srv_aborts, 1);
+		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.srv_aborts, 1);
 	if (!(s->flags & SF_ERR_MASK))
 		s->flags |= SF_ERR_SRVCL;
 	goto return_error;
@@ -2390,14 +2415,19 @@
   return_cli_abort:
 	_HA_ATOMIC_ADD(&sess->fe->fe_counters.cli_aborts, 1);
 	_HA_ATOMIC_ADD(&s->be->be_counters.cli_aborts, 1);
+	if (sess->listener->counters)
+		_HA_ATOMIC_ADD(&sess->listener->counters->cli_aborts, 1);
 	if (objt_server(s->target))
-		_HA_ATOMIC_ADD(&objt_server(s->target)->counters.cli_aborts, 1);
+		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.cli_aborts, 1);
 	if (!(s->flags & SF_ERR_MASK))
 		s->flags |= SF_ERR_CLICL;
 	goto return_error;
 
   return_int_err:
+	_HA_ATOMIC_ADD(&sess->fe->fe_counters.internal_errors, 1);
 	_HA_ATOMIC_ADD(&s->be->be_counters.internal_errors, 1);
+	if (sess->listener->counters)
+		_HA_ATOMIC_ADD(&sess->listener->counters->internal_errors, 1);
 	if (objt_server(s->target))
 		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.internal_errors, 1);
 	if (!(s->flags & SF_ERR_MASK))
@@ -2407,7 +2437,7 @@
   return_bad_res:
 	_HA_ATOMIC_ADD(&s->be->be_counters.failed_resp, 1);
 	if (objt_server(s->target)) {
-		_HA_ATOMIC_ADD(&objt_server(s->target)->counters.failed_resp, 1);
+		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.failed_resp, 1);
 		health_adjust(__objt_server(s->target), HANA_STATUS_HTTP_RSP);
 	}
 	if (!(s->flags & SF_ERR_MASK))
@@ -3032,7 +3062,7 @@
 					}
 
 					_HA_ATOMIC_ADD(&sess->fe->fe_counters.failed_rewrites, 1);
-					if (sess->fe != s->be)
+					if (s->flags & SF_BE_ASSIGNED)
 						_HA_ATOMIC_ADD(&s->be->be_counters.failed_rewrites, 1);
 					if (sess->listener->counters)
 						_HA_ATOMIC_ADD(&sess->listener->counters->failed_rewrites, 1);
@@ -3391,12 +3421,11 @@
 					}
 
 					_HA_ATOMIC_ADD(&sess->fe->fe_counters.failed_rewrites, 1);
-					if (sess->fe != s->be)
-						_HA_ATOMIC_ADD(&s->be->be_counters.failed_rewrites, 1);
+					_HA_ATOMIC_ADD(&s->be->be_counters.failed_rewrites, 1);
 					if (sess->listener->counters)
 						_HA_ATOMIC_ADD(&sess->listener->counters->failed_rewrites, 1);
 					if (objt_server(s->target))
-						_HA_ATOMIC_ADD(&objt_server(s->target)->counters.failed_rewrites, 1);
+						_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.failed_rewrites, 1);
 				}
 				free_trash_chunk(replace);
 				break;
@@ -5000,9 +5029,12 @@
 		}
 		else if (chn->flags & CF_SHUTW) {
 			txn->rsp.msg_state = HTTP_MSG_ERROR;
+			_HA_ATOMIC_ADD(&strm_sess(s)->fe->fe_counters.cli_aborts, 1);
 			_HA_ATOMIC_ADD(&s->be->be_counters.cli_aborts, 1);
+			if (strm_sess(s)->listener->counters)
+				_HA_ATOMIC_ADD(&strm_sess(s)->listener->counters->cli_aborts, 1);
 			if (objt_server(s->target))
-				_HA_ATOMIC_ADD(&objt_server(s->target)->counters.cli_aborts, 1);
+				_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.cli_aborts, 1);
 			goto end;
 		}
 		DBG_TRACE_LEAVE(STRM_EV_HTTP_ANA, s, txn);
diff --git a/src/stream.c b/src/stream.c
index 0920bee..d16def5 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -1616,6 +1616,8 @@
 			if (!(req->analysers) && !(res->analysers)) {
 				_HA_ATOMIC_ADD(&s->be->be_counters.cli_aborts, 1);
 				_HA_ATOMIC_ADD(&sess->fe->fe_counters.cli_aborts, 1);
+				if (sess->listener->counters)
+					_HA_ATOMIC_ADD(&sess->listener->counters->cli_aborts, 1);
 				if (srv)
 					_HA_ATOMIC_ADD(&srv->counters.cli_aborts, 1);
 				if (!(s->flags & SF_ERR_MASK))
@@ -1637,6 +1639,8 @@
 			if (!(req->analysers) && !(res->analysers)) {
 				_HA_ATOMIC_ADD(&s->be->be_counters.srv_aborts, 1);
 				_HA_ATOMIC_ADD(&sess->fe->fe_counters.srv_aborts, 1);
+				if (sess->listener->counters)
+					_HA_ATOMIC_ADD(&sess->listener->counters->srv_aborts, 1);
 				if (srv)
 					_HA_ATOMIC_ADD(&srv->counters.srv_aborts, 1);
 				if (!(s->flags & SF_ERR_MASK))
@@ -1890,6 +1894,8 @@
 			if (req->flags & CF_READ_ERROR) {
 				_HA_ATOMIC_ADD(&s->be->be_counters.cli_aborts, 1);
 				_HA_ATOMIC_ADD(&sess->fe->fe_counters.cli_aborts, 1);
+				if (sess->listener->counters)
+					_HA_ATOMIC_ADD(&sess->listener->counters->cli_aborts, 1);
 				if (srv)
 					_HA_ATOMIC_ADD(&srv->counters.cli_aborts, 1);
 				s->flags |= SF_ERR_CLICL;
@@ -1897,6 +1903,8 @@
 			else if (req->flags & CF_READ_TIMEOUT) {
 				_HA_ATOMIC_ADD(&s->be->be_counters.cli_aborts, 1);
 				_HA_ATOMIC_ADD(&sess->fe->fe_counters.cli_aborts, 1);
+				if (sess->listener->counters)
+					_HA_ATOMIC_ADD(&sess->listener->counters->cli_aborts, 1);
 				if (srv)
 					_HA_ATOMIC_ADD(&srv->counters.cli_aborts, 1);
 				s->flags |= SF_ERR_CLITO;
@@ -1904,6 +1912,8 @@
 			else if (req->flags & CF_WRITE_ERROR) {
 				_HA_ATOMIC_ADD(&s->be->be_counters.srv_aborts, 1);
 				_HA_ATOMIC_ADD(&sess->fe->fe_counters.srv_aborts, 1);
+				if (sess->listener->counters)
+					_HA_ATOMIC_ADD(&sess->listener->counters->srv_aborts, 1);
 				if (srv)
 					_HA_ATOMIC_ADD(&srv->counters.srv_aborts, 1);
 				s->flags |= SF_ERR_SRVCL;
@@ -1911,6 +1921,8 @@
 			else {
 				_HA_ATOMIC_ADD(&s->be->be_counters.srv_aborts, 1);
 				_HA_ATOMIC_ADD(&sess->fe->fe_counters.srv_aborts, 1);
+				if (sess->listener->counters)
+					_HA_ATOMIC_ADD(&sess->listener->counters->srv_aborts, 1);
 				if (srv)
 					_HA_ATOMIC_ADD(&srv->counters.srv_aborts, 1);
 				s->flags |= SF_ERR_SRVTO;
@@ -1936,6 +1948,8 @@
 			if (res->flags & CF_READ_ERROR) {
 				_HA_ATOMIC_ADD(&s->be->be_counters.srv_aborts, 1);
 				_HA_ATOMIC_ADD(&sess->fe->fe_counters.srv_aborts, 1);
+				if (sess->listener->counters)
+					_HA_ATOMIC_ADD(&sess->listener->counters->srv_aborts, 1);
 				if (srv)
 					_HA_ATOMIC_ADD(&srv->counters.srv_aborts, 1);
 				s->flags |= SF_ERR_SRVCL;
@@ -1943,6 +1957,8 @@
 			else if (res->flags & CF_READ_TIMEOUT) {
 				_HA_ATOMIC_ADD(&s->be->be_counters.srv_aborts, 1);
 				_HA_ATOMIC_ADD(&sess->fe->fe_counters.srv_aborts, 1);
+				if (sess->listener->counters)
+					_HA_ATOMIC_ADD(&sess->listener->counters->srv_aborts, 1);
 				if (srv)
 					_HA_ATOMIC_ADD(&srv->counters.srv_aborts, 1);
 				s->flags |= SF_ERR_SRVTO;
@@ -1950,6 +1966,8 @@
 			else if (res->flags & CF_WRITE_ERROR) {
 				_HA_ATOMIC_ADD(&s->be->be_counters.cli_aborts, 1);
 				_HA_ATOMIC_ADD(&sess->fe->fe_counters.cli_aborts, 1);
+				if (sess->listener->counters)
+					_HA_ATOMIC_ADD(&sess->listener->counters->cli_aborts, 1);
 				if (srv)
 					_HA_ATOMIC_ADD(&srv->counters.cli_aborts, 1);
 				s->flags |= SF_ERR_CLICL;
@@ -1957,6 +1975,8 @@
 			else {
 				_HA_ATOMIC_ADD(&s->be->be_counters.cli_aborts, 1);
 				_HA_ATOMIC_ADD(&sess->fe->fe_counters.cli_aborts, 1);
+				if (sess->listener->counters)
+					_HA_ATOMIC_ADD(&sess->listener->counters->cli_aborts, 1);
 				if (srv)
 					_HA_ATOMIC_ADD(&srv->counters.cli_aborts, 1);
 				s->flags |= SF_ERR_CLITO;
@@ -2374,6 +2394,7 @@
 
 		if (sess->fe->mode == PR_MODE_HTTP) {
 			_HA_ATOMIC_ADD(&sess->fe->fe_counters.p.http.rsp[n], 1);
+			_HA_ATOMIC_ADD(&sess->fe->fe_counters.p.http.cum_req, 1);
 		}
 		if ((s->flags & SF_BE_ASSIGNED) &&
 		    (s->be->mode == PR_MODE_HTTP)) {
diff --git a/src/tcp_rules.c b/src/tcp_rules.c
index 2d4310e..6027e12 100644
--- a/src/tcp_rules.c
+++ b/src/tcp_rules.c
@@ -412,13 +412,19 @@
 	return 1;
 
   deny:
+	_HA_ATOMIC_ADD(&s->sess->fe->fe_counters.denied_resp, 1);
 	_HA_ATOMIC_ADD(&s->be->be_counters.denied_resp, 1);
+	if (s->sess->listener->counters)
+		_HA_ATOMIC_ADD(&s->sess->listener->counters->denied_resp, 1);
 	if (objt_server(s->target))
 		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.denied_resp, 1);
 	goto reject;
 
  internal:
+	_HA_ATOMIC_ADD(&s->sess->fe->fe_counters.internal_errors, 1);
 	_HA_ATOMIC_ADD(&s->be->be_counters.internal_errors, 1);
+	if (s->sess->listener->counters)
+		_HA_ATOMIC_ADD(&s->sess->listener->counters->internal_errors, 1);
 	if (objt_server(s->target))
 		_HA_ATOMIC_ADD(&__objt_server(s->target)->counters.internal_errors, 1);
 	if (!(s->flags & SF_ERR_MASK))