[nginx] Upstream: the $upstream_bytes_received variable.
Vladimir Homutov
vl at nginx.com
Wed Aug 10 13:47:37 UTC 2016
details: http://hg.nginx.org/nginx/rev/c131f20c9562
branches:
changeset: 6654:c131f20c9562
user: Vladimir Homutov <vl at nginx.com>
date: Wed Aug 10 16:46:39 2016 +0300
description:
Upstream: the $upstream_bytes_received variable.
Unlike $upstream_response_length that only counts the body size,
the new variable also counts the size of response header and data
received after switching protocols when proxying WebSockets.
diffstat:
src/http/ngx_http_upstream.c | 22 +++++++++++++++++++++-
src/http/ngx_http_upstream.h | 1 +
2 files changed, 22 insertions(+), 1 deletions(-)
diffs (85 lines):
diff -r 7a6456398fc3 -r c131f20c9562 src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c Mon Aug 08 17:11:29 2016 +0300
+++ b/src/http/ngx_http_upstream.c Wed Aug 10 16:46:39 2016 +0300
@@ -391,6 +391,10 @@ static ngx_http_variable_t ngx_http_ups
ngx_http_upstream_response_length_variable, 0,
NGX_HTTP_VAR_NOCACHEABLE, 0 },
+ { ngx_string("upstream_bytes_received"), NULL,
+ ngx_http_upstream_response_length_variable, 1,
+ NGX_HTTP_VAR_NOCACHEABLE, 0 },
+
#if (NGX_HTTP_CACHE)
{ ngx_string("upstream_cache_status"), NULL,
@@ -2136,6 +2140,8 @@ ngx_http_upstream_process_header(ngx_htt
return;
}
+ u->state->bytes_received += n;
+
u->buffer.last += n;
#if 0
@@ -2642,6 +2648,7 @@ ngx_http_upstream_process_body_in_memory
return;
}
+ u->state->bytes_received += n;
u->state->response_length += n;
if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
@@ -3215,6 +3222,10 @@ ngx_http_upstream_process_upgraded(ngx_h
do_write = 1;
b->last += n;
+ if (from_upstream) {
+ u->state->bytes_received += n;
+ }
+
continue;
}
@@ -3411,6 +3422,7 @@ ngx_http_upstream_process_non_buffered_r
}
if (n > 0) {
+ u->state->bytes_received += n;
u->state->response_length += n;
if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
@@ -4095,6 +4107,8 @@ ngx_http_upstream_finalize_request(ngx_h
u->state->response_time = ngx_current_msec - u->state->response_time;
if (u->pipe && u->pipe->read_length) {
+ u->state->bytes_received += u->pipe->read_length
+ - u->pipe->preread_size;
u->state->response_length = u->pipe->read_length;
}
}
@@ -5242,7 +5256,13 @@ ngx_http_upstream_response_length_variab
state = r->upstream_states->elts;
for ( ;; ) {
- p = ngx_sprintf(p, "%O", state[i].response_length);
+
+ if (data == 1) {
+ p = ngx_sprintf(p, "%O", state[i].bytes_received);
+
+ } else {
+ p = ngx_sprintf(p, "%O", state[i].response_length);
+ }
if (++i == r->upstream_states->nelts) {
break;
diff -r 7a6456398fc3 -r c131f20c9562 src/http/ngx_http_upstream.h
--- a/src/http/ngx_http_upstream.h Mon Aug 08 17:11:29 2016 +0300
+++ b/src/http/ngx_http_upstream.h Wed Aug 10 16:46:39 2016 +0300
@@ -63,6 +63,7 @@ typedef struct {
ngx_msec_t connect_time;
ngx_msec_t header_time;
off_t response_length;
+ off_t bytes_received;
ngx_str_t *peer;
} ngx_http_upstream_state_t;
More information about the nginx-devel
mailing list