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);