[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