Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package nginx-module-vts for 
openSUSE:Factory checked in at 2026-04-17 21:25:33
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/nginx-module-vts (Old)
 and      /work/SRC/openSUSE:Factory/.nginx-module-vts.new.11940 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "nginx-module-vts"

Fri Apr 17 21:25:33 2026 rev:7 rq:1347789 version:0.2.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/nginx-module-vts/nginx-module-vts.changes        
2025-06-11 16:29:46.056586839 +0200
+++ 
/work/SRC/openSUSE:Factory/.nginx-module-vts.new.11940/nginx-module-vts.changes 
    2026-04-17 21:25:33.874434523 +0200
@@ -1,0 +2,8 @@
+Fri Apr 17 18:28:42 UTC 2026 - Jan Engelhardt <[email protected]>
+
+- Update to release 0.2.5
+  * Added new directive `ignore_status`
+    (`vhost_traffic_status_ignore_status 1xx 3xx;`)
+  * Add support to measure status_codes
+
+-------------------------------------------------------------------

Old:
----
  v0.2.4.tar.gz

New:
----
  v0.2.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ nginx-module-vts.spec ++++++
--- /var/tmp/diff_new_pack.vYRFj5/_old  2026-04-17 21:25:34.758470892 +0200
+++ /var/tmp/diff_new_pack.vYRFj5/_new  2026-04-17 21:25:34.762471057 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package nginx-module-vts
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %define project_name nginx-module-vts
 Name:           nginx-module-vts
-Version:        0.2.4
+Version:        0.2.5
 Release:        0
 Summary:        Nginx virtual host traffic status module
 License:        BSD-2-Clause

++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.vYRFj5/_old  2026-04-17 21:25:34.806472867 +0200
+++ /var/tmp/diff_new_pack.vYRFj5/_new  2026-04-17 21:25:34.810473032 +0200
@@ -1,5 +1,5 @@
-mtime: 1747393958
-commit: fd86153a291dae133ac4ae612bf049ba901ae0d9027c9d927307fd1b9ad7f1e2
+mtime: 1776450646
+commit: 4f6ad271273b7f0abdf7d6ac31350e9102fde608a1f1e2a09bf19be756c791c5
 url: https://src.opensuse.org/jengelh/nginx-module-vts
 revision: master
 

++++++ build.specials.obscpio ++++++

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2026-04-17 20:30:57.000000000 +0200
@@ -0,0 +1 @@
+.osc

++++++ v0.2.4.tar.gz -> v0.2.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nginx-module-vts-0.2.4/.github/workflows/ci.yml 
new/nginx-module-vts-0.2.5/.github/workflows/ci.yml
--- old/nginx-module-vts-0.2.4/.github/workflows/ci.yml 2025-03-12 
02:17:09.000000000 +0100
+++ new/nginx-module-vts-0.2.5/.github/workflows/ci.yml 2025-12-28 
12:08:30.000000000 +0100
@@ -73,10 +73,6 @@
         working-directory: nginx
         run: |
           patch -p1 < 
/home/runner/work/nginx-module-vts/nginx-module-vts/nginx_upstream_check/check_1.20.1+.patch
-      - name: 'patch upstream_check for freenginx'
-        working-directory: freenginx
-        run: |
-          patch -p1 < 
/home/runner/work/nginx-module-vts/nginx-module-vts/nginx_upstream_check/check_1.20.1+.patch
       - name: 'build nginx'
         working-directory: nginx
         run: |
@@ -90,7 +86,7 @@
       - name: 'build freenginx'
         working-directory: freenginx
         run: |
-          ./auto/configure --prefix=/usr/local/freenginx 
--with-ld-opt="-Wl,-rpath,/usr/local/lib" 
--add-module=/home/runner/work/nginx-module-vts/nginx-module-vts/ngx_devel_kit 
--add-module=/home/runner/work/nginx-module-vts/nginx-module-vts/lua-nginx-module
 
--add-module=/home/runner/work/nginx-module-vts/nginx-module-vts/nginx-module-vts
 
--add-module=/home/runner/work/nginx-module-vts/nginx-module-vts/nginx_upstream_check
+          ./auto/configure --prefix=/usr/local/freenginx 
--with-ld-opt="-Wl,-rpath,/usr/local/lib" 
--add-module=/home/runner/work/nginx-module-vts/nginx-module-vts/ngx_devel_kit 
--add-module=/home/runner/work/nginx-module-vts/nginx-module-vts/lua-nginx-module
 
--add-module=/home/runner/work/nginx-module-vts/nginx-module-vts/nginx-module-vts
           make
           sudo make install
           /usr/local/freenginx/sbin/nginx -V
@@ -122,8 +118,3 @@
         run: |
           echo "/usr/local/freenginx/sbin/" >> $GITHUB_PATH
           sudo PATH=/usr/local/freenginx/sbin:$PATH prove -r t
-      - name: 'test upstream check for freenginx'
-        working-directory: nginx-module-vts
-        run: |
-          echo "/usr/local/freenginx/sbin/" >> $GITHUB_PATH
-          sudo TEST_UPSTREAM_CHECK=1 TEST_NGINX_SLEEP=1 
PATH=/usr/local/freenginx/sbin:$PATH prove t/024.upstream_check.t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nginx-module-vts-0.2.4/CHANGELOG.md 
new/nginx-module-vts-0.2.5/CHANGELOG.md
--- old/nginx-module-vts-0.2.4/CHANGELOG.md     2025-03-12 02:17:09.000000000 
+0100
+++ new/nginx-module-vts-0.2.5/CHANGELOG.md     2025-12-28 12:08:30.000000000 
+0100
@@ -2,6 +2,28 @@
 ## [Unreleased]
 
 
+## [v0.2.5] - 2025-12-28
+### Ci
+- temporarily disable FreeNginx CI due to lua-nginx-module compatibility
+
+### Docs
+- add documentation for vhost_traffic_status_measure_status_codes feature
+
+### Feat
+- add support for 'other' status code in traffic status display
+- add support for merging HTTP status code counters in JSON and Prometheus 
displays
+
+### Fix
+- add freenginx compatibility for request timing calculation
+- adjust status code slot calculation to reserve slot for other status codes
+- correct status code separator logic in JSON display
+- include measure_all_status_codes check in status code filtering
+
+### Refactor
+- update variable types and function signatures for consistency
+- define undefined status code slot constant for clarity
+
+
 ## [v0.2.4] - 2025-03-12
 ### Fix
 - escape uri in module side
@@ -358,7 +380,8 @@
 - added type casting(ngx_atomic_t) in the ngx_vhost_traffic_status_node_init() 
and ngx_vhost_traffic_status_node_set()
 
 
-[Unreleased]: https://github.com/vozlt/nginx-module-vts/compare/v0.2.4...HEAD
+[Unreleased]: https://github.com/vozlt/nginx-module-vts/compare/v0.2.5...HEAD
+[v0.2.5]: https://github.com/vozlt/nginx-module-vts/compare/v0.2.4...v0.2.5
 [v0.2.4]: https://github.com/vozlt/nginx-module-vts/compare/v0.2.3...v0.2.4
 [v0.2.3]: https://github.com/vozlt/nginx-module-vts/compare/v0.2.2...v0.2.3
 [v0.2.2]: https://github.com/vozlt/nginx-module-vts/compare/v0.2.1...v0.2.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nginx-module-vts-0.2.4/README.md 
new/nginx-module-vts-0.2.5/README.md
--- old/nginx-module-vts-0.2.4/README.md        2025-03-12 02:17:09.000000000 
+0100
+++ new/nginx-module-vts-0.2.5/README.md        2025-12-28 12:08:30.000000000 
+0100
@@ -1887,6 +1887,41 @@
 }
 ```
 
+### vhost_traffic_status_measure_status_codes
+
+Allows tracking of specific HTTP status codes or all status codes in the Vhost 
Traffic Status module.
+
+
+| -   | - |
+| --- | --- |
+| **Syntax**  | vhost_traffic_status_measure_status_codes [all] [status_code1] 
[status_code2] ... |
+| **Default** | off |
+| **Context** | http |
+
+
+
+#### Parameters
+- `status_code1, status_code2, ...`: Specific HTTP status codes to track 
(100-599)
+- `all`: Track all HTTP status codes
+
+#### Examples
+
+Track specific status codes:
+```nginx
+vhost_traffic_status_measure_status_codes 200 404 500;
+```
+
+Track all status codes:
+```nginx
+vhost_traffic_status_measure_status_codes all;
+```
+
+#### Description
+- By default, no specific status code tracking is enabled
+- Status codes must be in ascending order
+- Only valid HTTP status codes between 100 and 599 are accepted
+- When using `all`, every status code will be tracked
+
 ## Releases
 
 To cut a release, create a changelog entry PR with 
[git-chglog](https://github.com/git-chglog/git-chglog)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_display.c 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_display.c
--- old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_display.c      
2025-03-12 02:17:09.000000000 +0100
+++ new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_display.c      
2025-12-28 12:08:30.000000000 +0100
@@ -322,7 +322,7 @@
 ngx_http_vhost_traffic_status_display_handler_default(ngx_http_request_t *r)
 {
     size_t                                     len;
-    u_char                                    *o, *s, *p;
+    u_char                                    *o, *s, *p, *last_symbol;
     ngx_str_t                                  uri, euri, type;
     ngx_int_t                                  size, format, rc;
     ngx_buf_t                                 *b;
@@ -386,7 +386,9 @@
             }
         }
 
-        if ((s = (u_char *) ngx_strchr(++s, '/')) == NULL) {
+        last_symbol = r->uri.data + r->uri.len;
+
+        if ((s = (u_char *) ngx_strlchr(++s, last_symbol, '/')) == NULL) {
             break;
         }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_display_json.c 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_display_json.c
--- old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_display_json.c 
2025-03-12 02:17:09.000000000 +0100
+++ new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_display_json.c 
2025-12-28 12:08:30.000000000 +0100
@@ -59,9 +59,13 @@
 {
     u_char                                    *p, *c;
     ngx_int_t                                  rc;
+    ngx_uint_t                                 i;
     ngx_str_t                                  tmp, dst;
+    ngx_uint_t                                *status_codes;
     ngx_http_vhost_traffic_status_loc_conf_t  *vtscf;
+    ngx_http_vhost_traffic_status_ctx_t       *ctx;
 
+    ctx = ngx_http_get_module_main_conf(r, 
ngx_http_vhost_traffic_status_module);
     vtscf = ngx_http_get_module_loc_conf(r, 
ngx_http_vhost_traffic_status_module);
 
     tmp = *key;
@@ -91,17 +95,42 @@
                       "display_set_server_node::escape_json_pool() failed");
     }
 
-#if (NGX_HTTP_CACHE)
     ngx_http_vhost_traffic_status_display_encode_uri(r, &dst);
-    buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER,
-                      &dst, vtsn->stat_request_counter,
-                      vtsn->stat_in_bytes,
-                      vtsn->stat_out_bytes,
-                      vtsn->stat_1xx_counter,
-                      vtsn->stat_2xx_counter,
-                      vtsn->stat_3xx_counter,
-                      vtsn->stat_4xx_counter,
-                      vtsn->stat_5xx_counter,
+
+    buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_START,
+        &dst, vtsn->stat_request_counter,
+        vtsn->stat_in_bytes,
+        vtsn->stat_out_bytes);
+
+    if (ctx->measure_status_codes != NULL && vtsn->stat_status_code_counter != 
NULL) {
+        buf = ngx_sprintf(buf, 
NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE_START);
+
+        buf = ngx_sprintf(buf, 
NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_OTHER_STATUS_CODE,
+            vtsn->stat_status_code_counter[0]);
+
+        status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts;
+
+        for (i = 0; i < ctx->measure_status_codes->nelts; i++) {
+            if (vtsn->stat_status_code_counter[i+1] == 0 && 
ctx->measure_all_status_codes) {
+                continue;
+            }
+            buf = ngx_sprintf(buf, 
NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE,
+                status_codes[i], vtsn->stat_status_code_counter[i+1]);
+        }
+
+        buf = ngx_sprintf(buf, 
NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE_END);
+    }
+
+    buf = ngx_sprintf(buf, 
NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_MIDDLE,
+        vtsn->stat_1xx_counter,
+        vtsn->stat_2xx_counter,
+        vtsn->stat_3xx_counter,
+        vtsn->stat_4xx_counter,
+        vtsn->stat_5xx_counter);
+
+
+#if (NGX_HTTP_CACHE)
+    buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_END,
                       vtsn->stat_cache_miss_counter,
                       vtsn->stat_cache_bypass_counter,
                       vtsn->stat_cache_expired_counter,
@@ -141,16 +170,7 @@
                       vtsn->stat_cache_scarce_counter_oc,
                       vtsn->stat_request_time_counter_oc);
 #else
-    ngx_http_vhost_traffic_status_display_encode_uri(r, &dst);
-    buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER,
-                      &dst, vtsn->stat_request_counter,
-                      vtsn->stat_in_bytes,
-                      vtsn->stat_out_bytes,
-                      vtsn->stat_1xx_counter,
-                      vtsn->stat_2xx_counter,
-                      vtsn->stat_3xx_counter,
-                      vtsn->stat_4xx_counter,
-                      vtsn->stat_5xx_counter,
+    buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_END,
                       vtsn->stat_request_time_counter,
                       ngx_http_vhost_traffic_status_node_time_queue_average(
                           &vtsn->stat_request_times, vtscf->average_method,
@@ -217,6 +237,12 @@
                 &vtscf->stats.stat_request_times,
                 &vtsn->stat_request_times, vtscf->average_period);
 
+            if (ctx->measure_status_codes != NULL && 
vtsn->stat_status_code_counter != NULL) {
+                ngx_http_vhost_traffic_status_status_code_merge(
+                    vtscf->stats.stat_status_code_counter,
+                    vtsn->stat_status_code_counter, 
ctx->measure_status_codes->nelts+1);
+            }
+
             vtscf->stats.stat_request_counter_oc += 
vtsn->stat_request_counter_oc;
             vtscf->stats.stat_in_bytes_oc += vtsn->stat_in_bytes_oc;
             vtscf->stats.stat_out_bytes_oc += vtsn->stat_out_bytes_oc;
@@ -855,6 +881,11 @@
     ngx_memzero(&vtscf->stats, sizeof(vtscf->stats));
     
ngx_http_vhost_traffic_status_node_time_queue_init(&vtscf->stats.stat_request_times);
 
+    if (ctx->measure_status_codes != NULL) {
+        vtscf->stats.stat_status_code_counter = ngx_pcalloc(r->pool, 
sizeof(ngx_atomic_t) * (ctx->measure_status_codes->nelts +1));
+        vtscf->stats.stat_status_code_length = 
ctx->measure_status_codes->nelts;
+    }
+
     /* main & connections */
     buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_S);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_display_json.h 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_display_json.h
--- old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_display_json.h 
2025-03-12 02:17:09.000000000 +0100
+++ new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_display_json.h 
2025-12-28 12:08:30.000000000 +0100
@@ -40,18 +40,20 @@
 
 #define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_S "\"serverZones\":{"
 
-#if (NGX_HTTP_CACHE)
-#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER "\"%V\":{"               
\
+#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_START "\"%V\":{"         
      \
     "\"requestCounter\":%uA,"                                                  
\
     "\"inBytes\":%uA,"                                                         
\
-    "\"outBytes\":%uA,"                                                        
\
-    "\"responses\":{"                                                          
\
+    "\"outBytes\":%uA,"
+
+#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_MIDDLE "\"responses\":{" 
\
     "\"1xx\":%uA,"                                                             
\
     "\"2xx\":%uA,"                                                             
\
     "\"3xx\":%uA,"                                                             
\
     "\"4xx\":%uA,"                                                             
\
-    "\"5xx\":%uA,"                                                             
\
-    "\"miss\":%uA,"                                                            
\
+    "\"5xx\":%uA"
+
+#if (NGX_HTTP_CACHE)
+#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_END ",\"miss\":%uA,"     
\
     "\"bypass\":%uA,"                                                          
\
     "\"expired\":%uA,"                                                         
\
     "\"stale\":%uA,"                                                           
\
@@ -92,17 +94,7 @@
     "}"                                                                        
\
     "},"
 #else
-#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER "\"%V\":{"               
\
-    "\"requestCounter\":%uA,"                                                  
\
-    "\"inBytes\":%uA,"                                                         
\
-    "\"outBytes\":%uA,"                                                        
\
-    "\"responses\":{"                                                          
\
-    "\"1xx\":%uA,"                                                             
\
-    "\"2xx\":%uA,"                                                             
\
-    "\"3xx\":%uA,"                                                             
\
-    "\"4xx\":%uA,"                                                             
\
-    "\"5xx\":%uA"                                                              
\
-    "},"                                                                       
\
+#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_END "},"                 
\
     "\"requestMsecCounter\":%uA,"                                              
\
     "\"requestMsec\":%M,"                                                      
\
     "\"requestMsecs\":{"                                                       
\
@@ -128,6 +120,11 @@
     "},"
 #endif
 
+#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE_START 
"\"statusCodes\":{"
+#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE 
",\"%uA\":%uA"
+#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_OTHER_STATUS_CODE 
"\"other\":%uA"
+#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE_END "}, "
+
 #define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_FILTER_S "\"filterZones\":{"
 
 #define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_UPSTREAM_S "\"upstreamZones\":{"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_display_prometheus.c
 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_display_prometheus.c
--- 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_display_prometheus.c
   2025-03-12 02:17:09.000000000 +0100
+++ 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_display_prometheus.c
   2025-12-28 12:08:30.000000000 +0100
@@ -54,8 +54,10 @@
     ngx_str_t                                               server;
     ngx_uint_t                                              i, n;
     ngx_http_vhost_traffic_status_loc_conf_t               *vtscf;
+    ngx_http_vhost_traffic_status_ctx_t                    *ctx;
     ngx_http_vhost_traffic_status_node_histogram_bucket_t  *b;
 
+    ctx = ngx_http_get_module_main_conf(r, 
ngx_http_vhost_traffic_status_module);
     vtscf = ngx_http_get_module_loc_conf(r, 
ngx_http_vhost_traffic_status_module);
 
     server = *key;
@@ -75,6 +77,23 @@
                                    &vtsn->stat_request_times, 
vtscf->average_method,
                                    vtscf->average_period) / 1000);
 
+
+    if (ctx->measure_status_codes != NULL && vtsn->stat_status_code_counter != 
NULL) {
+        ngx_uint_t *status_codes = (ngx_uint_t *) 
ctx->measure_status_codes->elts;
+
+        buf = ngx_sprintf(buf, 
NGX_HTTP_VHOST_TRAFFIC_STATUS_PROMETHEUS_FMT_SERVER_OTHER_STATUS_CODE,
+            &server, vtsn->stat_status_code_counter[0]);
+
+        for (i = 0; i < ctx->measure_status_codes->nelts; i++) {
+            if (vtsn->stat_status_code_counter[i+1] == 0 && 
ctx->measure_all_status_codes) {
+                continue;
+            }
+
+            buf = ngx_sprintf(buf, 
NGX_HTTP_VHOST_TRAFFIC_STATUS_PROMETHEUS_FMT_SERVER_STATUS_CODE,
+                &server, status_codes[i], vtsn->stat_status_code_counter[i+1]);
+        }
+    }
+
     /* histogram */
     b = &vtsn->stat_request_buckets;
 
@@ -157,6 +176,11 @@
                 &vtscf->stats.stat_request_times,
                 &vtsn->stat_request_times, vtscf->average_period);
 
+            if (ctx->measure_status_codes != NULL && 
vtsn->stat_status_code_counter != NULL) {
+                
ngx_http_vhost_traffic_status_status_code_merge(vtscf->stats.stat_status_code_counter,
+                    vtsn->stat_status_code_counter, 
ctx->measure_status_codes->nelts+1);
+            }
+
 #if (NGX_HTTP_CACHE)
             vtscf->stats.stat_cache_miss_counter +=
                                        vtsn->stat_cache_miss_counter;
@@ -497,6 +521,11 @@
     ngx_memzero(&vtscf->stats, sizeof(vtscf->stats));
     
ngx_http_vhost_traffic_status_node_time_queue_init(&vtscf->stats.stat_request_times);
 
+    if (ctx->measure_status_codes != NULL) {
+        vtscf->stats.stat_status_code_counter = ngx_pcalloc(r->pool, 
sizeof(ngx_atomic_t) * (ctx->measure_status_codes->nelts+1));
+        vtscf->stats.stat_status_code_length = 
ctx->measure_status_codes->nelts;
+    }
+
     /* main & connections */
     buf = ngx_http_vhost_traffic_status_display_prometheus_set_main(r, buf);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_display_prometheus.h
 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_display_prometheus.h
--- 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_display_prometheus.h
   2025-03-12 02:17:09.000000000 +0100
+++ 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_display_prometheus.h
   2025-12-28 12:08:30.000000000 +0100
@@ -35,6 +35,8 @@
     "# TYPE nginx_vts_server_bytes_total counter\n"                            
\
     "# HELP nginx_vts_server_requests_total The requests counter\n"            
\
     "# TYPE nginx_vts_server_requests_total counter\n"                         
\
+    "# HELP nginx_vts_status_code_requests_total The requests counter by 
status code \n" \
+    "# TYPE nginx_vts_status_code_requests_total counter\n"                    
\
     "# HELP nginx_vts_server_request_seconds_total The request processing "    
\
     "time in seconds\n"                                                        
\
     "# TYPE nginx_vts_server_request_seconds_total counter\n"                  
\
@@ -56,6 +58,12 @@
     "nginx_vts_server_request_seconds_total{host=\"%V\"} %.3f\n"               
\
     "nginx_vts_server_request_seconds{host=\"%V\"} %.3f\n"
 
+#define NGX_HTTP_VHOST_TRAFFIC_STATUS_PROMETHEUS_FMT_SERVER_OTHER_STATUS_CODE  
      \
+    "nginx_vts_status_code_requests_total{host=\"%V\",code=\"other\"} %uA\n"
+
+#define NGX_HTTP_VHOST_TRAFFIC_STATUS_PROMETHEUS_FMT_SERVER_STATUS_CODE        
\
+    "nginx_vts_status_code_requests_total{host=\"%V\",code=\"%d\"} %uA\n"
+
 #define NGX_HTTP_VHOST_TRAFFIC_STATUS_PROMETHEUS_FMT_SERVER_HISTOGRAM_BUCKET   
\
     "nginx_vts_server_request_duration_seconds_bucket{host=\"%V\","            
\
     "le=\"%.3f\"} %uA\n"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_module.c 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_module.c
--- old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_module.c       
2025-03-12 02:17:09.000000000 +0100
+++ new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_module.c       
2025-12-28 12:08:30.000000000 +0100
@@ -21,6 +21,8 @@
     ngx_rbtree_node_t *sentinel);
 static ngx_int_t ngx_http_vhost_traffic_status_init_zone(
     ngx_shm_zone_t *shm_zone, void *data);
+static char *ngx_http_vhost_traffic_status_measure_status_codes(ngx_conf_t *cf,
+    ngx_command_t *cmd, void *conf);
 static char *ngx_http_vhost_traffic_status_zone(ngx_conf_t *cf,
     ngx_command_t *cmd, void *conf);
 static char *ngx_http_vhost_traffic_status_dump(ngx_conf_t *cf,
@@ -59,6 +61,15 @@
     { ngx_null_string, 0 }
 };
 
+static ngx_conf_bitmask_t ngx_http_vhost_traffic_status_ignore_status_masks[] 
= {
+    { ngx_string("1xx"), NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_1XX },
+    { ngx_string("2xx"), NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_2XX },
+    { ngx_string("3xx"), NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_3XX },
+    { ngx_string("4xx"), NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_4XX },
+    { ngx_string("5xx"), NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_5XX },
+    { ngx_string("off"), NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_OFF },
+    { ngx_null_string, 0 }
+};
 
 static ngx_command_t ngx_http_vhost_traffic_status_commands[] = {
 
@@ -139,6 +150,13 @@
       0,
       NULL },
 
+    { ngx_string("vhost_traffic_status_measure_status_codes"),
+        NGX_HTTP_MAIN_CONF|NGX_CONF_NOARGS|NGX_CONF_1MORE,
+        ngx_http_vhost_traffic_status_measure_status_codes,
+        0,
+        0,
+        NULL },
+
     { ngx_string("vhost_traffic_status_dump"),
       NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12,
       ngx_http_vhost_traffic_status_dump,
@@ -217,6 +235,13 @@
       offsetof(ngx_http_vhost_traffic_status_loc_conf_t, stats_by_upstream),
       NULL },
 
+    { ngx_string("vhost_traffic_status_ignore_status"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
+      ngx_conf_set_bitmask_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_vhost_traffic_status_loc_conf_t, ignore_status),
+      &ngx_http_vhost_traffic_status_ignore_status_masks },
+
     ngx_null_command
 };
 
@@ -323,13 +348,19 @@
 ngx_msec_int_t
 ngx_http_vhost_traffic_status_request_time(ngx_http_request_t *r)
 {
-    ngx_time_t      *tp;
     ngx_msec_int_t   ms;
 
+#if (defined freenginx && nginx_version >= 1029000)
+    ms = (ngx_msec_int_t)
+             (ngx_current_msec - r->start_time);
+#else
+    ngx_time_t      *tp;
+
     tp = ngx_timeofday();
 
     ms = (ngx_msec_int_t)
              ((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec));
+#endif
     return ngx_max(ms, 0);
 }
 
@@ -460,6 +491,69 @@
 
 
 static char *
+ngx_http_vhost_traffic_status_measure_status_codes(ngx_conf_t *cf, 
ngx_command_t *cmd, void *conf)
+{
+    ngx_http_vhost_traffic_status_ctx_t  *ctx;
+    ngx_str_t                            *value;
+    ngx_int_t                            n;
+    ngx_int_t                            previous_n;
+    ngx_uint_t                           i;
+    ngx_int_t                            *status_code;
+
+    ctx = ngx_http_conf_get_module_main_conf(cf, 
ngx_http_vhost_traffic_status_module);
+    if (ctx == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+    ctx->measure_status_codes = ngx_array_create(cf->pool, 1, 
sizeof(ngx_int_t));
+    previous_n = 0;
+    value = cf->args->elts;
+
+    /* arguments process */
+    if (ngx_strncmp(value[1].data, "all", 3) == 0) {
+        for (n = 100; n < 600; n++) {
+            status_code = ngx_array_push(ctx->measure_status_codes);
+            if (status_code == NULL) {
+                return NGX_CONF_ERROR;
+            }
+            *status_code = n;
+        }
+        ctx->measure_all_status_codes = 1;
+        return NGX_OK;
+    }
+    for (i = 1; i < cf->args->nelts; i++) {
+        n = ngx_atoi(value[i].data, value[i].len);
+        if (n == NGX_ERROR || n == 0) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter 
\"%V\"", &value[i]);
+            return NGX_CONF_ERROR;
+        }
+
+        if (n < previous_n) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "status codes must be 
ordered");
+            return NGX_CONF_ERROR;
+        }
+
+        if (n < 100 || n > 599) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid status_code 
\"%V\"", &value[i]);
+            return NGX_CONF_ERROR;
+        }
+
+        status_code = ngx_array_push(ctx->measure_status_codes);        
+        if (status_code == NULL) {
+            return NGX_CONF_ERROR;
+        }
+
+        *status_code = n;
+        previous_n = n;
+    }
+
+    ctx->measure_all_status_codes = 0;
+
+    return NGX_CONF_OK;
+}
+
+
+static char *
 ngx_http_vhost_traffic_status_zone(ngx_conf_t *cf, ngx_command_t *cmd, void 
*conf)
 {
     u_char                               *p;
@@ -1031,6 +1125,8 @@
     ngx_conf_merge_value(conf->bypass_stats, prev->bypass_stats, 0);
 
     ngx_conf_merge_value(conf->stats_by_upstream, prev->stats_by_upstream, 1);
+    ngx_conf_merge_bitmask_value(conf->ignore_status, prev->ignore_status,
+(NGX_CONF_BITMASK_SET|NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_OFF));
 
     name = ctx->shm_name;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_module.h 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_module.h
--- old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_module.h       
2025-03-12 02:17:09.000000000 +0100
+++ new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_module.h       
2025-12-28 12:08:30.000000000 +0100
@@ -24,7 +24,7 @@
  * I.E "v0.2.0+h0a1s2h"
  *
  */
-#define NGX_HTTP_VTS_MODULE_VERSION "v0.2.4"
+#define NGX_HTTP_VTS_MODULE_VERSION "v0.2.5"
 
 #define NGX_HTTP_VHOST_TRAFFIC_STATUS_UPSTREAM_NO          0
 #define NGX_HTTP_VHOST_TRAFFIC_STATUS_UPSTREAM_UA          1
@@ -55,6 +55,13 @@
 #define NGX_HTTP_VHOST_TRAFFIC_STATUS_DEFAULT_AVG_PERIOD   60
 #define NGX_HTTP_VHOST_TRAFFIC_STATUS_DEFAULT_DUMP_PERIOD  60
 
+#define  NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_OFF     0x0002
+#define  NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_1XX     0x0004
+#define  NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_2XX     0x0008
+#define  NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_3XX     0x0010
+#define  NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_4XX     0x0020
+#define  NGX_HTTP_VHOST_TRAFFIC_STATUS_IGNORE_STATUS_5XX     0x0040
+
 #define ngx_http_vhost_traffic_status_add_rc(s, n) {                           
\
     if(s < 200) {n->stat_1xx_counter++;}                                       
\
     else if(s < 300) {n->stat_2xx_counter++;}                                  
\
@@ -63,6 +70,8 @@
     else {n->stat_5xx_counter++;}                                              
\
 }
 
+#define ngx_http_vhost_traffic_status_ignore_status(i, s) (                    
(((i & (1<<2)) && 100 <= s && s < 200)                                       || 
((i & (1<<3)) && 200 <= s && s < 300)                                   || ((i 
& (1<<4)) && 300 <= s && s < 400)                                   || ((i & 
(1<<5)) && 400 <= s && s < 500)                                   || ((i & 
(1<<6)) && 500 <= s && s < 600)) ? 1 : 0)
+
 #if (NGX_HTTP_CACHE)
 
 #if !defined(nginx_version) || nginx_version < 1005007
@@ -256,6 +265,9 @@
     ngx_str_t                               dump_file;
     ngx_msec_t                              dump_period;
     ngx_event_t                             dump_event;
+
+    ngx_flag_t                              measure_all_status_codes;
+    ngx_array_t                             *measure_status_codes;
 } ngx_http_vhost_traffic_status_ctx_t;
 
 
@@ -298,6 +310,7 @@
     ngx_flag_t                              bypass_stats;
 
     ngx_flag_t                              stats_by_upstream;
+    ngx_uint_t                              ignore_status;
 
     ngx_rbtree_node_t                     **node_caches;
 } ngx_http_vhost_traffic_status_loc_conf_t;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_node.c 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_node.c
--- old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_node.c 
2025-03-12 02:17:09.000000000 +0100
+++ new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_node.c 
2025-12-28 12:08:30.000000000 +0100
@@ -267,6 +267,8 @@
 void
 ngx_http_vhost_traffic_status_node_zero(ngx_http_vhost_traffic_status_node_t 
*vtsn)
 {
+    ngx_uint_t  i;
+
     vtsn->stat_request_counter = 0;
     vtsn->stat_in_bytes = 0;
     vtsn->stat_out_bytes = 0;
@@ -292,6 +294,10 @@
     vtsn->stat_request_time_counter_oc = 0;
     vtsn->stat_response_time_counter_oc = 0;
 
+    for (i = 0; i < vtsn->stat_status_code_length; i++) {
+        vtsn->stat_status_code_counter[i] = 0;
+    }
+
 #if (NGX_HTTP_CACHE)
     vtsn->stat_cache_miss_counter = 0;
     vtsn->stat_cache_bypass_counter = 0;
@@ -321,7 +327,7 @@
 */
 void
 ngx_http_vhost_traffic_status_node_init(ngx_http_request_t *r,
-    ngx_http_vhost_traffic_status_node_t *vtsn)
+    ngx_http_vhost_traffic_status_node_t *vtsn, ngx_int_t status_code_slot)
 {
     ngx_msec_int_t  ms;
 
@@ -342,7 +348,7 @@
     ms = ngx_http_vhost_traffic_status_request_time(r);
     vtsn->stat_request_time = (ngx_msec_t) ms;
 
-    ngx_http_vhost_traffic_status_node_update(r, vtsn, ms);
+    ngx_http_vhost_traffic_status_node_update(r, vtsn, ms, status_code_slot);
 }
 
 
@@ -352,7 +358,7 @@
 */
 void
 ngx_http_vhost_traffic_status_node_set(ngx_http_request_t *r,
-    ngx_http_vhost_traffic_status_node_t *vtsn)
+    ngx_http_vhost_traffic_status_node_t *vtsn, ngx_int_t status_code_slot)
 {
     ngx_msec_int_t                             ms;
     ngx_http_vhost_traffic_status_node_t       ovtsn;
@@ -362,8 +368,9 @@
 
     ovtsn = *vtsn;
 
+    vtsn->ignore_status = vtscf->ignore_status;
     ms = ngx_http_vhost_traffic_status_request_time(r);
-    ngx_http_vhost_traffic_status_node_update(r, vtsn, ms);
+    ngx_http_vhost_traffic_status_node_update(r, vtsn, ms, status_code_slot);
 
     vtsn->stat_request_time = 
ngx_http_vhost_traffic_status_node_time_queue_average(
                                   &vtsn->stat_request_times, 
vtscf->average_method,
@@ -375,16 +382,24 @@
 
 void
 ngx_http_vhost_traffic_status_node_update(ngx_http_request_t *r,
-    ngx_http_vhost_traffic_status_node_t *vtsn, ngx_msec_int_t ms)
+    ngx_http_vhost_traffic_status_node_t *vtsn, ngx_msec_int_t ms, ngx_int_t 
status_code_slot)
 {
     ngx_uint_t status = r->headers_out.status;
 
+    if (ngx_http_vhost_traffic_status_ignore_status(vtsn->ignore_status, 
status)) {
+        return;
+    }
+
     vtsn->stat_request_counter++;
     vtsn->stat_in_bytes += (ngx_atomic_uint_t) r->request_length;
     vtsn->stat_out_bytes += (ngx_atomic_uint_t) r->connection->sent;
 
     ngx_http_vhost_traffic_status_add_rc(status, vtsn);
 
+    if (status_code_slot != -1 && vtsn->stat_status_code_counter != NULL ) {
+        vtsn->stat_status_code_counter[status_code_slot]++;
+    }
+
     vtsn->stat_request_time_counter += (ngx_atomic_uint_t) ms;
 
     
ngx_http_vhost_traffic_status_node_time_queue_insert(&vtsn->stat_request_times,
@@ -587,6 +602,14 @@
     (void) ngx_cpymem(a, &q, sizeof(q));
 }
 
+void ngx_http_vhost_traffic_status_status_code_merge(ngx_atomic_t *dst, 
ngx_atomic_t *src, ngx_uint_t n)
+{
+    ngx_uint_t i;
+
+    for (i = 0; i < n; i++) {
+        dst[i] += src[i];
+    }
+}
 
 void
 ngx_http_vhost_traffic_status_node_histogram_bucket_init(ngx_http_request_t *r,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_node.h 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_node.h
--- old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_node.h 
2025-03-12 02:17:09.000000000 +0100
+++ new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_node.h 
2025-12-28 12:08:30.000000000 +0100
@@ -11,7 +11,6 @@
 #define NGX_HTTP_VHOST_TRAFFIC_STATUS_DEFAULT_QUEUE_LEN    64
 #define NGX_HTTP_VHOST_TRAFFIC_STATUS_DEFAULT_BUCKET_LEN   32
 
-
 typedef struct {
     ngx_msec_t                                             time;
     ngx_msec_int_t                                         msec;
@@ -58,6 +57,8 @@
     ngx_atomic_t                                           stat_3xx_counter;
     ngx_atomic_t                                           stat_4xx_counter;
     ngx_atomic_t                                           stat_5xx_counter;
+    uint                                                   
stat_status_code_length;
+    ngx_atomic_t                                           
*stat_status_code_counter;
 
     ngx_atomic_t                                           
stat_request_time_counter;
     ngx_msec_t                                             stat_request_time;
@@ -101,6 +102,7 @@
 
     ngx_http_vhost_traffic_status_node_upstream_t          stat_upstream;
     size_t                                                 len;
+    ngx_uint_t                                             ignore_status;
     u_char                                                 data[1];
 } ngx_http_vhost_traffic_status_node_t;
 
@@ -115,11 +117,11 @@
 void ngx_http_vhost_traffic_status_node_zero(
     ngx_http_vhost_traffic_status_node_t *vtsn);
 void ngx_http_vhost_traffic_status_node_init(ngx_http_request_t *r,
-    ngx_http_vhost_traffic_status_node_t *vtsn);
+    ngx_http_vhost_traffic_status_node_t *vtsn, ngx_int_t status_code_slot);
 void ngx_http_vhost_traffic_status_node_set(ngx_http_request_t *r,
-    ngx_http_vhost_traffic_status_node_t *vtsn);
+    ngx_http_vhost_traffic_status_node_t *vtsn, ngx_int_t status_code_slot);
 void ngx_http_vhost_traffic_status_node_update(ngx_http_request_t *r,
-    ngx_http_vhost_traffic_status_node_t *vtsn, ngx_msec_int_t ms);
+    ngx_http_vhost_traffic_status_node_t *vtsn, ngx_msec_int_t ms, ngx_int_t 
status_code_slot);
 
 void ngx_http_vhost_traffic_status_node_time_queue_zero(
     ngx_http_vhost_traffic_status_node_time_queue_t *q);
@@ -150,6 +152,7 @@
     ngx_http_vhost_traffic_status_node_time_queue_t *a,
     ngx_http_vhost_traffic_status_node_time_queue_t *b,
     ngx_msec_t period);
+void ngx_http_vhost_traffic_status_status_code_merge(ngx_atomic_t *dst, 
ngx_atomic_t *src, ngx_uint_t n);
 
 void ngx_http_vhost_traffic_status_node_histogram_bucket_init(
     ngx_http_request_t *r,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_shm.c 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_shm.c
--- old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_shm.c  
2025-03-12 02:17:09.000000000 +0100
+++ new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_shm.c  
2025-12-28 12:08:30.000000000 +0100
@@ -87,6 +87,7 @@
     size_t                                     size;
     unsigned                                   init;
     uint32_t                                   hash;
+    ngx_int_t                                  status_code_slot;
     ngx_slab_pool_t                           *shpool;
     ngx_rbtree_node_t                         *node, *lrun;
     ngx_http_vhost_traffic_status_ctx_t       *ctx;
@@ -104,6 +105,18 @@
 
     shpool = (ngx_slab_pool_t *) vtscf->shm_zone->shm.addr;
 
+
+    status_code_slot = 0;
+    if (ctx->measure_all_status_codes) {
+        if (r->headers_out.status >= 100 && r->headers_out.status < 600) {
+            // slot 0 is reserved to other status codes <100 and >600
+            status_code_slot = r->headers_out.status - 99;
+        }
+    } else if (ctx->measure_status_codes != NULL) {
+        status_code_slot = 
ngx_http_vhost_traffic_status_find_status_code_slot(r->headers_out.status,
+                                                                              
ctx->measure_status_codes);
+    }
+
     ngx_shmtx_lock(&shpool->mutex);
 
     /* find node */
@@ -149,7 +162,34 @@
 
         node->key = hash;
         vtsn->len = key->len;
-        ngx_http_vhost_traffic_status_node_init(r, vtsn);
+        vtsn->ignore_status = vtscf->ignore_status;
+
+        if (ctx->measure_status_codes != NULL) {
+            vtsn->stat_status_code_counter = ngx_slab_alloc_locked(shpool, 
sizeof(ngx_atomic_t) * (ctx->measure_status_codes->nelts + 1));
+            if (vtsn->stat_status_code_counter == NULL) {
+                shm_info = ngx_pcalloc(r->pool, 
sizeof(ngx_http_vhost_traffic_status_shm_info_t));
+                if (shm_info == NULL) {
+                    ngx_slab_free_locked(shpool, node);
+                    ngx_shmtx_unlock(&shpool->mutex);
+                    return NGX_ERROR;
+                }
+
+                ngx_http_vhost_traffic_status_shm_info(r, shm_info);
+
+                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+                              "shm_add_node::ngx_slab_alloc_locked() failed: "
+                              "used_size[%ui], used_node[%ui]",
+                              shm_info->used_size, shm_info->used_node);
+
+                ngx_slab_free_locked(shpool, node);
+                ngx_shmtx_unlock(&shpool->mutex);
+                return NGX_ERROR;
+            }
+            vtsn->stat_status_code_length = ctx->measure_status_codes->nelts;
+        }
+
+        ngx_http_vhost_traffic_status_node_init(r, vtsn, status_code_slot);
+
         vtsn->stat_upstream.type = type;
         ngx_memcpy(vtsn->data, key->data, key->len);
 
@@ -158,7 +198,7 @@
     } else {
         init = NGX_HTTP_VHOST_TRAFFIC_STATUS_NODE_FIND;
         vtsn = (ngx_http_vhost_traffic_status_node_t *) &node->color;
-        ngx_http_vhost_traffic_status_node_set(r, vtsn);
+        ngx_http_vhost_traffic_status_node_set(r, vtsn, status_code_slot);
     }
 
     /* set addition */
@@ -520,6 +560,27 @@
     return NGX_OK;
 }
 
+static int
+ngx_http_vhost_traffic_status_find_status_code_slot_cmp(const void *one, const 
void *two)
+{
+    return (*(ngx_uint_t *) one - *(ngx_uint_t *) two);
+}
+
+ngx_uint_t
+ngx_http_vhost_traffic_status_find_status_code_slot(ngx_uint_t status, 
ngx_array_t *status_codes)
+{
+    ngx_uint_t *found = (ngx_uint_t *) bsearch(&status, status_codes->elts, 
status_codes->nelts,
+        sizeof(ngx_uint_t),
+        ngx_http_vhost_traffic_status_find_status_code_slot_cmp);
+
+    if (found == NULL) {
+        ngx_log_error(NGX_LOG_DEBUG, ngx_cycle->log, 0,
+            "Status code %ui not found in status_codes array", status);
+        return 0;
+    }
+
+    return found - (ngx_uint_t *)status_codes->elts + 1;
+}
 
 #if (NGX_HTTP_CACHE)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_shm.h 
new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_shm.h
--- old/nginx-module-vts-0.2.4/src/ngx_http_vhost_traffic_status_shm.h  
2025-03-12 02:17:09.000000000 +0100
+++ new/nginx-module-vts-0.2.5/src/ngx_http_vhost_traffic_status_shm.h  
2025-12-28 12:08:30.000000000 +0100
@@ -22,6 +22,7 @@
 ngx_int_t ngx_http_vhost_traffic_status_shm_add_server(ngx_http_request_t *r);
 ngx_int_t ngx_http_vhost_traffic_status_shm_add_filter(ngx_http_request_t *r);
 ngx_int_t ngx_http_vhost_traffic_status_shm_add_upstream(ngx_http_request_t 
*r);
+ngx_uint_t ngx_http_vhost_traffic_status_find_status_code_slot(ngx_uint_t 
status, ngx_array_t *status_codes);
 
 #if (NGX_HTTP_CACHE)
 ngx_int_t ngx_http_vhost_traffic_status_shm_add_cache(ngx_http_request_t *r);

Reply via email to