MINOR: stick-tables/counters: add http_fail_cnt and http_fail_rate data types
authorWilly Tarreau <w@1wt.eu>
Wed, 10 Feb 2021 11:07:15 +0000 (12:07 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 10 Feb 2021 11:27:01 +0000 (12:27 +0100)
commit826f3ab5e64e264fb23f4b01221504fc374fe688
tree76ffdaa278828f73faa11cb5fea26717b156b5ed
parente4d247e2179e5a02c7932d6b25773e885698a90a
MINOR: stick-tables/counters: add http_fail_cnt and http_fail_rate data types

Historically we've been counting lots of client-triggered events in stick
tables to help detect misbehaving ones, but we've been missing the same on
the server side, and there's been repeated requests for being able to count
the server errors per URL in order to precisely monitor the quality of
service or even to avoid routing requests to certain dead services, which
is also called "circuit breaking" nowadays.

This commit introduces http_fail_cnt and http_fail_rate, which work like
http_err_cnt and http_err_rate in that they respectively count events and
their frequency, but they only consider server-side issues such as network
errors, unparsable and truncated responses, and 5xx status codes other
than 501 and 505 (since these ones are usually triggered by the client).
Note that retryable errors are purposely not accounted for, so that only
what the client really sees is considered.

With this it becomes very simple to put some protective measures in place
to perform a redirect or return an excuse page when the error rate goes
beyond a certain threshold for a given URL, and give more chances to the
server to recover from this condition. Typically it could look like this
to bypass a URL causing more than 10 requests per second:

  stick-table type string len 80 size 4k expire 1m store http_fail_rate(1m)
  http-request track-sc0 base       # track host+path, ignore query string
  http-request return status 503 content-type text/html \
      lf-file excuse.html if { sc0_http_fail_rate gt 10 }

A more advanced mechanism using gpt0 could even implement high/low rates
to disable/enable the service.

Reg-test converteers_ref_cnt_never_dec.vtc was updated to test it.
doc/configuration.txt
include/haproxy/session.h
include/haproxy/stick_table-t.h
include/haproxy/stick_table.h
include/haproxy/stream.h
reg-tests/stick-table/converteers_ref_cnt_never_dec.vtc
src/http_act.c
src/http_ana.c
src/stick_table.c