summaryrefslogtreecommitdiffhomepage
path: root/src/http
diff options
context:
space:
mode:
authorVladimir Homutov <vl@nginx.com>2018-11-21 13:40:40 +0300
committerVladimir Homutov <vl@nginx.com>2018-11-21 13:40:40 +0300
commitc24146731810f2711da608cd7f3bdca528a3eb14 (patch)
tree44c5ad93afcaf2c9a5b892c89df657eff1dfa2a3 /src/http
parent0f669b23a84785cdb1891b73d3ecb03a3174ea04 (diff)
downloadnginx-c24146731810f2711da608cd7f3bdca528a3eb14.tar.gz
nginx-c24146731810f2711da608cd7f3bdca528a3eb14.tar.bz2
Upstream: revised upstream response time variables.
Variables now do not depend on presence of the HTTP status code in response. If the corresponding event occurred, variables contain time between request creation and the event, and "-" otherwise. Previously, intermediate value of the $upstream_response_time variable held unix timestamp.
Diffstat (limited to 'src/http')
-rw-r--r--src/http/ngx_http_upstream.c32
-rw-r--r--src/http/ngx_http_upstream.h2
2 files changed, 19 insertions, 15 deletions
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index 22c2afd67..3fa86c8f9 100644
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -1505,8 +1505,8 @@ ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
r->connection->log->action = "connecting to upstream";
- if (u->state && u->state->response_time) {
- u->state->response_time = ngx_current_msec - u->state->response_time;
+ if (u->state && u->state->response_time == (ngx_msec_t) -1) {
+ u->state->response_time = ngx_current_msec - u->start_time;
}
u->state = ngx_array_push(r->upstream_states);
@@ -1518,7 +1518,9 @@ ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
- u->state->response_time = ngx_current_msec;
+ u->start_time = ngx_current_msec;
+
+ u->state->response_time = (ngx_msec_t) -1;
u->state->connect_time = (ngx_msec_t) -1;
u->state->header_time = (ngx_msec_t) -1;
@@ -2002,7 +2004,7 @@ ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u,
"http upstream send request");
if (u->state->connect_time == (ngx_msec_t) -1) {
- u->state->connect_time = ngx_current_msec - u->state->response_time;
+ u->state->connect_time = ngx_current_msec - u->start_time;
}
if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {
@@ -2413,7 +2415,7 @@ ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u)
/* rc == NGX_OK */
- u->state->header_time = ngx_current_msec - u->state->response_time;
+ u->state->header_time = ngx_current_msec - u->start_time;
if (u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE) {
@@ -4309,8 +4311,8 @@ ngx_http_upstream_finalize_request(ngx_http_request_t *r,
u->resolved->ctx = NULL;
}
- if (u->state && u->state->response_time) {
- u->state->response_time = ngx_current_msec - u->state->response_time;
+ if (u->state && u->state->response_time == (ngx_msec_t) -1) {
+ u->state->response_time = ngx_current_msec - u->start_time;
if (u->pipe && u->pipe->read_length) {
u->state->bytes_received += u->pipe->read_length
@@ -5419,18 +5421,18 @@ ngx_http_upstream_response_time_variable(ngx_http_request_t *r,
state = r->upstream_states->elts;
for ( ;; ) {
- if (state[i].status) {
- if (data == 1 && state[i].header_time != (ngx_msec_t) -1) {
- ms = state[i].header_time;
+ if (data == 1) {
+ ms = state[i].header_time;
- } else if (data == 2 && state[i].connect_time != (ngx_msec_t) -1) {
- ms = state[i].connect_time;
+ } else if (data == 2) {
+ ms = state[i].connect_time;
- } else {
- ms = state[i].response_time;
- }
+ } else {
+ ms = state[i].response_time;
+ }
+ if (ms != -1) {
ms = ngx_max(ms, 0);
p = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000);
diff --git a/src/http/ngx_http_upstream.h b/src/http/ngx_http_upstream.h
index f875b7485..af84e24be 100644
--- a/src/http/ngx_http_upstream.h
+++ b/src/http/ngx_http_upstream.h
@@ -365,6 +365,8 @@ struct ngx_http_upstream_s {
ngx_int_t (*rewrite_cookie)(ngx_http_request_t *r,
ngx_table_elt_t *h);
+ ngx_msec_t start_time;
+
ngx_http_upstream_state_t *state;
ngx_str_t method;