From: Joseph Lynch Date: Fri, 16 Jan 2015 01:52:59 +0000 (-0800) Subject: MEDIUM: check: include server address and port in the send-state header X-Git-Tag: v1.6-dev2~300 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=514061c414080701cb046171041a2d00859660e8;p=thirdparty%2Fhaproxy.git MEDIUM: check: include server address and port in the send-state header This fixes an issue that occurs when backend servers run on different addresses or ports and you wish to healthcheck them via a consistent port. For example, if you allocate backends dynamically as containers that expose different ports and you use an inetd based healthchecking component that runs on a dedicated port. By adding the server address and port to the send-state header, the healthcheck component can deduce which address and port to check by reading the X-Haproxy-Server-State header out of the healthcheck and parsing out the address and port. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index 34a1e49156..e0aa485abb 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -3109,6 +3109,14 @@ http-check send-state checks on the total number before transition, just as appears in the stats interface. Next headers are in the form "=", indicating in no specific order some values available in the stats interface : + - a variable "address", containing the address of the backend server. + This corresponds to the
field in the server declaration. For + unix domain sockets, it will read "unix". + + - a variable "port", containing the port of the backend server. This + corresponds to the field in the server declaration. For unix + domain sockets, it will read "unix". + - a variable "name", containing the name of the backend followed by a slash ("/") then the name of the server. This can be used when a server is checked in multiple backends. diff --git a/src/checks.c b/src/checks.c index 2ef14d1029..89e5eeeb35 100644 --- a/src/checks.c +++ b/src/checks.c @@ -494,6 +494,8 @@ static int httpchk_build_status_header(struct server *s, char *buffer, int size) int sv_state; int ratio; int hlen = 0; + char addr[46]; + char port[6]; const char *srv_hlt_st[7] = { "DOWN", "DOWN %d/%d", "UP %d/%d", "UP", "NOLB %d/%d", "NOLB", @@ -524,8 +526,11 @@ static int httpchk_build_status_header(struct server *s, char *buffer, int size) (s->state != SRV_ST_STOPPED) ? (s->check.health - s->check.rise + 1) : (s->check.health), (s->state != SRV_ST_STOPPED) ? (s->check.fall) : (s->check.rise)); - hlen += snprintf(buffer + hlen, size - hlen, "; name=%s/%s; node=%s; weight=%d/%d; scur=%d/%d; qcur=%d", - s->proxy->id, s->id, + addr_to_str(&s->addr, addr, sizeof(addr)); + port_to_str(&s->addr, port, sizeof(port)); + + hlen += snprintf(buffer + hlen, size - hlen, "; address=%s; port=%s; name=%s/%s; node=%s; weight=%d/%d; scur=%d/%d; qcur=%d", + addr, port, s->proxy->id, s->id, global.node, (s->eweight * s->proxy->lbprm.wmult + s->proxy->lbprm.wdiv - 1) / s->proxy->lbprm.wdiv, (s->proxy->lbprm.tot_weight * s->proxy->lbprm.wmult + s->proxy->lbprm.wdiv - 1) / s->proxy->lbprm.wdiv,