From 08f7e3c76a2308e39cdaf2e13260f6532b375f9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Tue, 4 Mar 2025 13:33:53 -0300 Subject: [PATCH 01/18] Add support to store status_codes to measure later --- src/ngx_http_vhost_traffic_status_module.c | 79 ++++++++++++++++++++++ src/ngx_http_vhost_traffic_status_module.h | 3 + 2 files changed, 82 insertions(+) diff --git a/src/ngx_http_vhost_traffic_status_module.c b/src/ngx_http_vhost_traffic_status_module.c index 9a4bc4b..5325c7b 100644 --- a/src/ngx_http_vhost_traffic_status_module.c +++ b/src/ngx_http_vhost_traffic_status_module.c @@ -21,6 +21,8 @@ static void ngx_http_vhost_traffic_status_rbtree_insert_value( 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, @@ -148,6 +150,13 @@ static ngx_command_t ngx_http_vhost_traffic_status_commands[] = { 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, @@ -475,6 +484,76 @@ 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) +{ + 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; + ngx_array_t *status_codes; + ngx_flag_t all; + + ctx = ngx_http_conf_get_module_main_conf(cf, ngx_http_vhost_traffic_status_module); + if (ctx == NULL) { + return NGX_CONF_ERROR; + } + + status_codes = ngx_array_create(cf->pool, 1, sizeof(ngx_int_t)); + previous_n = 0; + all = 0; + value = cf->args->elts; + + /* arguments process */ + for (i = 1; i < cf->args->nelts; i++) { + if (i == 1 && ngx_strncmp(value[i].data, "all", 3) == 0) { + for (n = 100; n < 600; n++) { + status_code = ngx_array_push(status_codes); + if (status_code == NULL) { + goto invalid; + } + *status_code = n; + } + all = 1; + break; + } + 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]); + goto invalid; + } + + if (n < previous_n) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "status codes must be ordered"); + goto invalid; + } + + if (n <100 || n > 599) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid status_code \"%V\"", &value[i]); + goto invalid; + } + + status_code = ngx_array_push(status_codes); + if (status_code == NULL) { + goto invalid; + } + + *status_code = n; + previous_n = n; + } + + ctx->measure_all_status_codes = all; + ctx->measure_status_codes = status_codes; + + return NGX_CONF_OK; + +invalid: + return NGX_CONF_ERROR; +} + + static char * ngx_http_vhost_traffic_status_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { diff --git a/src/ngx_http_vhost_traffic_status_module.h b/src/ngx_http_vhost_traffic_status_module.h index 27ad21e..3641e26 100644 --- a/src/ngx_http_vhost_traffic_status_module.h +++ b/src/ngx_http_vhost_traffic_status_module.h @@ -265,6 +265,9 @@ typedef struct { 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; From c54d9b99e7b4573e5830d0748e27571a1689c374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Tue, 4 Mar 2025 14:44:45 -0300 Subject: [PATCH 02/18] Add support for measuring HTTP status codes in traffic status node --- src/ngx_http_vhost_traffic_status_module.c | 2 +- src/ngx_http_vhost_traffic_status_node.c | 14 ++++--- src/ngx_http_vhost_traffic_status_node.h | 7 ++-- src/ngx_http_vhost_traffic_status_shm.c | 49 +++++++++++++++++++++- src/ngx_http_vhost_traffic_status_shm.h | 1 + 5 files changed, 62 insertions(+), 11 deletions(-) diff --git a/src/ngx_http_vhost_traffic_status_module.c b/src/ngx_http_vhost_traffic_status_module.c index 5325c7b..7828e8b 100644 --- a/src/ngx_http_vhost_traffic_status_module.c +++ b/src/ngx_http_vhost_traffic_status_module.c @@ -485,7 +485,7 @@ 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) +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; diff --git a/src/ngx_http_vhost_traffic_status_node.c b/src/ngx_http_vhost_traffic_status_node.c index a0d1ef7..0cb8106 100644 --- a/src/ngx_http_vhost_traffic_status_node.c +++ b/src/ngx_http_vhost_traffic_status_node.c @@ -321,7 +321,7 @@ ngx_http_vhost_traffic_status_node_zero(ngx_http_vhost_traffic_status_node_t *vt */ 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 +342,7 @@ ngx_http_vhost_traffic_status_node_init(ngx_http_request_t *r, 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 +352,7 @@ ngx_http_vhost_traffic_status_node_init(ngx_http_request_t *r, */ 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; @@ -364,7 +364,7 @@ ngx_http_vhost_traffic_status_node_set(ngx_http_request_t *r, 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, @@ -376,7 +376,7 @@ ngx_http_vhost_traffic_status_node_set(ngx_http_request_t *r, 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; @@ -390,6 +390,10 @@ ngx_http_vhost_traffic_status_node_update(ngx_http_request_t *r, 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, diff --git a/src/ngx_http_vhost_traffic_status_node.h b/src/ngx_http_vhost_traffic_status_node.h index 1638632..999650d 100644 --- a/src/ngx_http_vhost_traffic_status_node.h +++ b/src/ngx_http_vhost_traffic_status_node.h @@ -57,6 +57,7 @@ typedef struct { ngx_atomic_t stat_3xx_counter; ngx_atomic_t stat_4xx_counter; ngx_atomic_t stat_5xx_counter; + ngx_atomic_t *stat_status_code_counter; ngx_atomic_t stat_request_time_counter; ngx_msec_t stat_request_time; @@ -115,11 +116,11 @@ ngx_rbtree_node_t *ngx_http_vhost_traffic_status_node_lookup( 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); diff --git a/src/ngx_http_vhost_traffic_status_shm.c b/src/ngx_http_vhost_traffic_status_shm.c index 263a8c5..8b7b667 100644 --- a/src/ngx_http_vhost_traffic_status_shm.c +++ b/src/ngx_http_vhost_traffic_status_shm.c @@ -87,6 +87,7 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r, 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,17 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r, shpool = (ngx_slab_pool_t *) vtscf->shm_zone->shm.addr; + + status_code_slot = -1; + if (ctx->measure_all_status_codes) { + if (r->headers_out.status >= 100 && r->headers_out.status < 600) { + status_code_slot = r->headers_out.status - 100; + } + } 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 */ @@ -150,7 +162,18 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r, node->key = hash; vtsn->len = key->len; vtsn->ignore_status = vtscf->ignore_status; - ngx_http_vhost_traffic_status_node_init(r, vtsn); + + 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); + if (vtsn->stat_status_code_counter == NULL) { + ngx_slab_free_locked(shpool, node); + ngx_shmtx_unlock(&shpool->mutex); + return NGX_ERROR; + } + } + + 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); @@ -159,7 +182,7 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r, } 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 */ @@ -521,6 +544,28 @@ ngx_http_vhost_traffic_status_shm_add_upstream(ngx_http_request_t *r) 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_int_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) { + // Use Nginx error logging instead of printf + ngx_log_error(NGX_LOG_DEBUG, ngx_cycle->log, 0, + "Status code %ui not found in status_codes array", status); + return -1; + } + + ngx_int_t index = (ngx_int_t)(found - (ngx_uint_t *)status_codes->elts); + return index; +} #if (NGX_HTTP_CACHE) diff --git a/src/ngx_http_vhost_traffic_status_shm.h b/src/ngx_http_vhost_traffic_status_shm.h index bbc9d97..94c113b 100644 --- a/src/ngx_http_vhost_traffic_status_shm.h +++ b/src/ngx_http_vhost_traffic_status_shm.h @@ -22,6 +22,7 @@ typedef struct { 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_int_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); From cd05bf7d22144e10e436765ae83bf1b5bc7fc223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Tue, 4 Mar 2025 16:13:57 -0300 Subject: [PATCH 03/18] Add support fordisplaying HTTP status codes in JSON and Prometheus formats --- ...x_http_vhost_traffic_status_display_json.c | 31 +++++++++++++++++++ ...x_http_vhost_traffic_status_display_json.h | 4 +++ ..._vhost_traffic_status_display_prometheus.c | 17 ++++++++++ ..._vhost_traffic_status_display_prometheus.h | 3 ++ 4 files changed, 55 insertions(+) diff --git a/src/ngx_http_vhost_traffic_status_display_json.c b/src/ngx_http_vhost_traffic_status_display_json.c index d00a7c9..e34caf2 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.c +++ b/src/ngx_http_vhost_traffic_status_display_json.c @@ -61,7 +61,9 @@ ngx_http_vhost_traffic_status_display_set_server_node( ngx_int_t rc; ngx_str_t tmp, dst; 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,12 +93,40 @@ ngx_http_vhost_traffic_status_display_set_server_node( "display_set_server_node::escape_json_pool() failed"); } + u_char *status_codes_buf =(u_char *)""; + + if (ctx->measure_status_codes != NULL && vtsn->stat_status_code_counter != NULL) { + ngx_uint_t *status_code = NULL; + ngx_buf_t *b = ngx_create_temp_buf(r->pool, 10240); + if (b == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "display_set_server_node::ngx_create_temp_buf() failed"); + } + + ngx_memzero(b->start, 10240); + + u_char *wbuf = b->last; + status_codes_buf = b->last; + ngx_uint_t *status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts; + for (ngx_uint_t i = 0; i < ctx->measure_status_codes->nelts; i++) { + if (vtsn->stat_status_code_counter[i] == 0) { + continue; + } + status_code = &status_codes[i]; + + wbuf = ngx_sprintf(wbuf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE, + *status_code, vtsn->stat_status_code_counter[i]); + } + } + + #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, + status_codes_buf, vtsn->stat_1xx_counter, vtsn->stat_2xx_counter, vtsn->stat_3xx_counter, @@ -146,6 +176,7 @@ ngx_http_vhost_traffic_status_display_set_server_node( &dst, vtsn->stat_request_counter, vtsn->stat_in_bytes, vtsn->stat_out_bytes, + status_codes_buf, vtsn->stat_1xx_counter, vtsn->stat_2xx_counter, vtsn->stat_3xx_counter, diff --git a/src/ngx_http_vhost_traffic_status_display_json.h b/src/ngx_http_vhost_traffic_status_display_json.h index 05b107e..0b36c11 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.h +++ b/src/ngx_http_vhost_traffic_status_display_json.h @@ -46,6 +46,7 @@ "\"inBytes\":%uA," \ "\"outBytes\":%uA," \ "\"responses\":{" \ + "%s" \ "\"1xx\":%uA," \ "\"2xx\":%uA," \ "\"3xx\":%uA," \ @@ -97,6 +98,7 @@ "\"inBytes\":%uA," \ "\"outBytes\":%uA," \ "\"responses\":{" \ + "%s" \ "\"1xx\":%uA," \ "\"2xx\":%uA," \ "\"3xx\":%uA," \ @@ -128,6 +130,8 @@ "}," #endif +#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE "\"%uA\":%uA," + #define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_FILTER_S "\"filterZones\":{" #define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_UPSTREAM_S "\"upstreamZones\":{" diff --git a/src/ngx_http_vhost_traffic_status_display_prometheus.c b/src/ngx_http_vhost_traffic_status_display_prometheus.c index 858c2fb..cf2e40e 100644 --- a/src/ngx_http_vhost_traffic_status_display_prometheus.c +++ b/src/ngx_http_vhost_traffic_status_display_prometheus.c @@ -54,8 +54,10 @@ ngx_http_vhost_traffic_status_display_prometheus_set_server_node( 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,21 @@ ngx_http_vhost_traffic_status_display_prometheus_set_server_node( &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_code = NULL; + ngx_uint_t *status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts; + for (ngx_uint_t i = 0; i < ctx->measure_status_codes->nelts; i++) { + if (vtsn->stat_status_code_counter[i] == 0 && ctx->measure_all_status_codes) { + continue; + } + status_code = &status_codes[i]; + + buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_PROMETHEUS_FMT_SERVER_STATUS_CODE, + &server, *status_code, vtsn->stat_status_code_counter[i]); + } + } + /* histogram */ b = &vtsn->stat_request_buckets; diff --git a/src/ngx_http_vhost_traffic_status_display_prometheus.h b/src/ngx_http_vhost_traffic_status_display_prometheus.h index 60ab37f..5747612 100644 --- a/src/ngx_http_vhost_traffic_status_display_prometheus.h +++ b/src/ngx_http_vhost_traffic_status_display_prometheus.h @@ -56,6 +56,9 @@ "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_STATUS_CODE \ + "nginx_vts_server_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" From 54e29dbbcf927a15ca67da8b106b422d3893fccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 5 Mar 2025 09:03:46 -0300 Subject: [PATCH 04/18] fix status page when measure status code is enabled --- ...x_http_vhost_traffic_status_display_json.c | 55 ++++++++----------- ...x_http_vhost_traffic_status_display_json.h | 33 +++++------ 2 files changed, 35 insertions(+), 53 deletions(-) diff --git a/src/ngx_http_vhost_traffic_status_display_json.c b/src/ngx_http_vhost_traffic_status_display_json.c index e34caf2..8019f32 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.c +++ b/src/ngx_http_vhost_traffic_status_display_json.c @@ -93,45 +93,44 @@ ngx_http_vhost_traffic_status_display_set_server_node( "display_set_server_node::escape_json_pool() failed"); } - u_char *status_codes_buf =(u_char *)""; + ngx_http_vhost_traffic_status_display_encode_uri(r, &dst); + + 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) { ngx_uint_t *status_code = NULL; - ngx_buf_t *b = ngx_create_temp_buf(r->pool, 10240); - if (b == NULL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "display_set_server_node::ngx_create_temp_buf() failed"); - } - ngx_memzero(b->start, 10240); + buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE_START); - u_char *wbuf = b->last; - status_codes_buf = b->last; ngx_uint_t *status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts; for (ngx_uint_t i = 0; i < ctx->measure_status_codes->nelts; i++) { if (vtsn->stat_status_code_counter[i] == 0) { continue; } status_code = &status_codes[i]; - - wbuf = ngx_sprintf(wbuf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE, + if (i > 0) { + buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_SEPARATOR); + } + buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE, *status_code, vtsn->stat_status_code_counter[i]); } + + 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) - 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, - status_codes_buf, - 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_cache_miss_counter, vtsn->stat_cache_bypass_counter, vtsn->stat_cache_expired_counter, @@ -171,17 +170,7 @@ ngx_http_vhost_traffic_status_display_set_server_node( 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, - status_codes_buf, - 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, diff --git a/src/ngx_http_vhost_traffic_status_display_json.h b/src/ngx_http_vhost_traffic_status_display_json.h index 0b36c11..f933aa0 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.h +++ b/src/ngx_http_vhost_traffic_status_display_json.h @@ -40,19 +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\":{" \ - "%s" \ + "\"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," \ @@ -93,18 +94,7 @@ "}" \ "}," #else -#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER "\"%V\":{" \ - "\"requestCounter\":%uA," \ - "\"inBytes\":%uA," \ - "\"outBytes\":%uA," \ - "\"responses\":{" \ - "%s" \ - "\"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\":{" \ @@ -130,7 +120,10 @@ "}," #endif -#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE "\"%uA\":%uA," +#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_STATUS_SEPARATOR "," +#define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE_END "}, " #define NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_FILTER_S "\"filterZones\":{" From 255b55d8ad9ab6abeb4beab4fdfad7995b43c65f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 5 Mar 2025 09:11:04 -0300 Subject: [PATCH 05/18] refactor: define undefined status code slot constant for clarity --- src/ngx_http_vhost_traffic_status_shm.c | 5 ++--- src/ngx_http_vhost_traffic_status_shm.h | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ngx_http_vhost_traffic_status_shm.c b/src/ngx_http_vhost_traffic_status_shm.c index 8b7b667..e53816a 100644 --- a/src/ngx_http_vhost_traffic_status_shm.c +++ b/src/ngx_http_vhost_traffic_status_shm.c @@ -106,7 +106,7 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r, shpool = (ngx_slab_pool_t *) vtscf->shm_zone->shm.addr; - status_code_slot = -1; + status_code_slot = NGX_HTTP_VHOST_TRAFFIC_STATUS_STATUS_CODE_SLOT_UNDEFINED; if (ctx->measure_all_status_codes) { if (r->headers_out.status >= 100 && r->headers_out.status < 600) { status_code_slot = r->headers_out.status - 100; @@ -557,10 +557,9 @@ ngx_http_vhost_traffic_status_find_status_code_slot(ngx_uint_t status, ngx_array ngx_http_vhost_traffic_status_find_status_code_slot_cmp); if (found == NULL) { - // Use Nginx error logging instead of printf ngx_log_error(NGX_LOG_DEBUG, ngx_cycle->log, 0, "Status code %ui not found in status_codes array", status); - return -1; + return NGX_HTTP_VHOST_TRAFFIC_STATUS_STATUS_CODE_SLOT_UNDEFINED; } ngx_int_t index = (ngx_int_t)(found - (ngx_uint_t *)status_codes->elts); diff --git a/src/ngx_http_vhost_traffic_status_shm.h b/src/ngx_http_vhost_traffic_status_shm.h index 94c113b..f99241e 100644 --- a/src/ngx_http_vhost_traffic_status_shm.h +++ b/src/ngx_http_vhost_traffic_status_shm.h @@ -18,6 +18,7 @@ typedef struct { ngx_uint_t filter_used_node; } ngx_http_vhost_traffic_status_shm_info_t; +#define NGX_HTTP_VHOST_TRAFFIC_STATUS_STATUS_CODE_SLOT_UNDEFINED -1 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); From dcb24cc84d0a4f4880da3d7a0e8a51160221270a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 5 Mar 2025 09:15:21 -0300 Subject: [PATCH 06/18] fix: include measure_all_status_codes check in status code filtering --- src/ngx_http_vhost_traffic_status_display_json.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ngx_http_vhost_traffic_status_display_json.c b/src/ngx_http_vhost_traffic_status_display_json.c index 8019f32..e4cba86 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.c +++ b/src/ngx_http_vhost_traffic_status_display_json.c @@ -107,7 +107,7 @@ ngx_http_vhost_traffic_status_display_set_server_node( ngx_uint_t *status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts; for (ngx_uint_t i = 0; i < ctx->measure_status_codes->nelts; i++) { - if (vtsn->stat_status_code_counter[i] == 0) { + if (vtsn->stat_status_code_counter[i] == 0 && ctx->measure_all_status_codes) { continue; } status_code = &status_codes[i]; From d28faa54de66c14fac5eaf2cf6e0f3ad024ece82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 5 Mar 2025 09:58:55 -0300 Subject: [PATCH 07/18] feat: add support for merging HTTP status code counters in JSON and Prometheus displays --- src/ngx_http_vhost_traffic_status_display_json.c | 10 ++++++++++ src/ngx_http_vhost_traffic_status_display_prometheus.c | 9 +++++++++ src/ngx_http_vhost_traffic_status_node.c | 8 ++++++++ src/ngx_http_vhost_traffic_status_node.h | 1 + 4 files changed, 28 insertions(+) diff --git a/src/ngx_http_vhost_traffic_status_display_json.c b/src/ngx_http_vhost_traffic_status_display_json.c index e4cba86..d6b8264 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.c +++ b/src/ngx_http_vhost_traffic_status_display_json.c @@ -237,6 +237,12 @@ ngx_http_vhost_traffic_status_display_set_server(ngx_http_request_t *r, &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); + } + 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; @@ -875,6 +881,10 @@ ngx_http_vhost_traffic_status_display_set(ngx_http_request_t *r, 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); + } + /* main & connections */ buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_S); diff --git a/src/ngx_http_vhost_traffic_status_display_prometheus.c b/src/ngx_http_vhost_traffic_status_display_prometheus.c index cf2e40e..ffed76f 100644 --- a/src/ngx_http_vhost_traffic_status_display_prometheus.c +++ b/src/ngx_http_vhost_traffic_status_display_prometheus.c @@ -174,6 +174,11 @@ ngx_http_vhost_traffic_status_display_prometheus_set_server(ngx_http_request_t * &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); + } + #if (NGX_HTTP_CACHE) vtscf->stats.stat_cache_miss_counter += vtsn->stat_cache_miss_counter; @@ -514,6 +519,10 @@ ngx_http_vhost_traffic_status_display_prometheus_set(ngx_http_request_t *r, 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); + } + /* main & connections */ buf = ngx_http_vhost_traffic_status_display_prometheus_set_main(r, buf); diff --git a/src/ngx_http_vhost_traffic_status_node.c b/src/ngx_http_vhost_traffic_status_node.c index 0cb8106..f784061 100644 --- a/src/ngx_http_vhost_traffic_status_node.c +++ b/src/ngx_http_vhost_traffic_status_node.c @@ -596,6 +596,14 @@ ngx_http_vhost_traffic_status_node_time_queue_merge( (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 --git a/src/ngx_http_vhost_traffic_status_node.h b/src/ngx_http_vhost_traffic_status_node.h index 999650d..b817329 100644 --- a/src/ngx_http_vhost_traffic_status_node.h +++ b/src/ngx_http_vhost_traffic_status_node.h @@ -151,6 +151,7 @@ void ngx_http_vhost_traffic_status_node_time_queue_merge( 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, From 3f1dadc37e6b0859917ad8e3b28c69a32a7051cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 5 Mar 2025 10:08:44 -0300 Subject: [PATCH 08/18] fix: correct status code separator logic in JSON display --- src/ngx_http_vhost_traffic_status_display_json.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ngx_http_vhost_traffic_status_display_json.c b/src/ngx_http_vhost_traffic_status_display_json.c index d6b8264..cd827e4 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.c +++ b/src/ngx_http_vhost_traffic_status_display_json.c @@ -106,16 +106,18 @@ ngx_http_vhost_traffic_status_display_set_server_node( buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE_START); ngx_uint_t *status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts; + ngx_uint_t inserted = 0; for (ngx_uint_t i = 0; i < ctx->measure_status_codes->nelts; i++) { if (vtsn->stat_status_code_counter[i] == 0 && ctx->measure_all_status_codes) { continue; } status_code = &status_codes[i]; - if (i > 0) { + if (inserted > 0) { buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_SEPARATOR); } buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE, *status_code, vtsn->stat_status_code_counter[i]); + inserted++; } buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE_END); From 9d1d15eefd96b5c8892c2c0a80410af5be94f688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 5 Mar 2025 10:39:54 -0300 Subject: [PATCH 09/18] docs: add documentation for vhost_traffic_status_measure_status_codes feature --- README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/README.md b/README.md index 1490fcd..11d00dc 100644 --- a/README.md +++ b/README.md @@ -1887,6 +1887,41 @@ http { } ``` +### 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) From 69d192ef17aef1463e2b0a74915eec6f02b27fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 5 Mar 2025 11:09:03 -0300 Subject: [PATCH 10/18] use a independent metric for measure status codes --- src/ngx_http_vhost_traffic_status_display_prometheus.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ngx_http_vhost_traffic_status_display_prometheus.h b/src/ngx_http_vhost_traffic_status_display_prometheus.h index 5747612..a37256d 100644 --- a/src/ngx_http_vhost_traffic_status_display_prometheus.h +++ b/src/ngx_http_vhost_traffic_status_display_prometheus.h @@ -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" \ @@ -57,7 +59,7 @@ "nginx_vts_server_request_seconds{host=\"%V\"} %.3f\n" #define NGX_HTTP_VHOST_TRAFFIC_STATUS_PROMETHEUS_FMT_SERVER_STATUS_CODE \ - "nginx_vts_server_requests_total{host=\"%V\",code=\"%d\"} %uA\n" + "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\"," \ From c18cc20bde4bd6259fa23fc14e8fa6feecbb8ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Fri, 7 Mar 2025 15:29:49 -0300 Subject: [PATCH 11/18] add support to reset status codes using API --- src/ngx_http_vhost_traffic_status_display_json.c | 1 + src/ngx_http_vhost_traffic_status_display_prometheus.c | 1 + src/ngx_http_vhost_traffic_status_node.c | 4 ++++ src/ngx_http_vhost_traffic_status_node.h | 1 + src/ngx_http_vhost_traffic_status_shm.c | 1 + 5 files changed, 8 insertions(+) diff --git a/src/ngx_http_vhost_traffic_status_display_json.c b/src/ngx_http_vhost_traffic_status_display_json.c index cd827e4..d7c225a 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.c +++ b/src/ngx_http_vhost_traffic_status_display_json.c @@ -885,6 +885,7 @@ ngx_http_vhost_traffic_status_display_set(ngx_http_request_t *r, 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); + vtscf->stats.stat_status_code_length = ctx->measure_status_codes->nelts; } /* main & connections */ diff --git a/src/ngx_http_vhost_traffic_status_display_prometheus.c b/src/ngx_http_vhost_traffic_status_display_prometheus.c index ffed76f..e27b8fb 100644 --- a/src/ngx_http_vhost_traffic_status_display_prometheus.c +++ b/src/ngx_http_vhost_traffic_status_display_prometheus.c @@ -521,6 +521,7 @@ ngx_http_vhost_traffic_status_display_prometheus_set(ngx_http_request_t *r, 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); + vtscf->stats.stat_status_code_length = ctx->measure_status_codes->nelts; } /* main & connections */ diff --git a/src/ngx_http_vhost_traffic_status_node.c b/src/ngx_http_vhost_traffic_status_node.c index f784061..0fb2bb9 100644 --- a/src/ngx_http_vhost_traffic_status_node.c +++ b/src/ngx_http_vhost_traffic_status_node.c @@ -292,6 +292,10 @@ ngx_http_vhost_traffic_status_node_zero(ngx_http_vhost_traffic_status_node_t *vt vtsn->stat_request_time_counter_oc = 0; vtsn->stat_response_time_counter_oc = 0; + for (uint i=0; istat_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; diff --git a/src/ngx_http_vhost_traffic_status_node.h b/src/ngx_http_vhost_traffic_status_node.h index b817329..2d3cab4 100644 --- a/src/ngx_http_vhost_traffic_status_node.h +++ b/src/ngx_http_vhost_traffic_status_node.h @@ -57,6 +57,7 @@ typedef struct { 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; diff --git a/src/ngx_http_vhost_traffic_status_shm.c b/src/ngx_http_vhost_traffic_status_shm.c index e53816a..c7abe0e 100644 --- a/src/ngx_http_vhost_traffic_status_shm.c +++ b/src/ngx_http_vhost_traffic_status_shm.c @@ -170,6 +170,7 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r, 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); From 2d9f59eb6523ae8518baea8d41cbed48975a41ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Sun, 9 Mar 2025 10:47:15 -0300 Subject: [PATCH 12/18] Apply suggestions from code review Co-authored-by: Y.Horie --- ..._vhost_traffic_status_display_prometheus.c | 4 +- src/ngx_http_vhost_traffic_status_module.c | 43 ++++++++----------- src/ngx_http_vhost_traffic_status_shm.c | 14 ++++++ 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/ngx_http_vhost_traffic_status_display_prometheus.c b/src/ngx_http_vhost_traffic_status_display_prometheus.c index e27b8fb..967e631 100644 --- a/src/ngx_http_vhost_traffic_status_display_prometheus.c +++ b/src/ngx_http_vhost_traffic_status_display_prometheus.c @@ -79,16 +79,14 @@ ngx_http_vhost_traffic_status_display_prometheus_set_server_node( if (ctx->measure_status_codes != NULL && vtsn->stat_status_code_counter != NULL) { - ngx_uint_t *status_code = NULL; ngx_uint_t *status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts; for (ngx_uint_t i = 0; i < ctx->measure_status_codes->nelts; i++) { if (vtsn->stat_status_code_counter[i] == 0 && ctx->measure_all_status_codes) { continue; } - status_code = &status_codes[i]; buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_PROMETHEUS_FMT_SERVER_STATUS_CODE, - &server, *status_code, vtsn->stat_status_code_counter[i]); + &server, status_codes[i], vtsn->stat_status_code_counter[i]); } } diff --git a/src/ngx_http_vhost_traffic_status_module.c b/src/ngx_http_vhost_traffic_status_module.c index 7828e8b..8d60771 100644 --- a/src/ngx_http_vhost_traffic_status_module.c +++ b/src/ngx_http_vhost_traffic_status_module.c @@ -493,64 +493,57 @@ ngx_http_vhost_traffic_status_measure_status_codes(ngx_conf_t *cf, ngx_command_t ngx_int_t previous_n; ngx_uint_t i; ngx_int_t *status_code; - ngx_array_t *status_codes; - ngx_flag_t all; ctx = ngx_http_conf_get_module_main_conf(cf, ngx_http_vhost_traffic_status_module); if (ctx == NULL) { return NGX_CONF_ERROR; } - status_codes = ngx_array_create(cf->pool, 1, sizeof(ngx_int_t)); + ctx->measure_status_codes = ngx_array_create(cf->pool, 1, sizeof(ngx_int_t)); previous_n = 0; - all = 0; value = cf->args->elts; /* arguments process */ - for (i = 1; i < cf->args->nelts; i++) { - if (i == 1 && ngx_strncmp(value[i].data, "all", 3) == 0) { - for (n = 100; n < 600; n++) { - status_code = ngx_array_push(status_codes); - if (status_code == NULL) { - goto invalid; - } - *status_code = n; + 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; } - all = 1; - break; + *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]); - goto invalid; + return NGX_CONF_ERROR; } if (n < previous_n) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "status codes must be ordered"); - goto invalid; + return NGX_CONF_ERROR; } - if (n <100 || n > 599) { + if (n < 100 || n > 599) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid status_code \"%V\"", &value[i]); - goto invalid; + return NGX_CONF_ERROR; } - status_code = ngx_array_push(status_codes); + status_code = ngx_array_push(ctx->measure_status_codes); if (status_code == NULL) { - goto invalid; + return NGX_CONF_ERROR; } *status_code = n; previous_n = n; } - ctx->measure_all_status_codes = all; - ctx->measure_status_codes = status_codes; + ctx->measure_all_status_codes = 0; return NGX_CONF_OK; - -invalid: - return NGX_CONF_ERROR; } diff --git a/src/ngx_http_vhost_traffic_status_shm.c b/src/ngx_http_vhost_traffic_status_shm.c index c7abe0e..9cebf7a 100644 --- a/src/ngx_http_vhost_traffic_status_shm.c +++ b/src/ngx_http_vhost_traffic_status_shm.c @@ -166,6 +166,20 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r, 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); 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; From a0a72b6fc1895eda95c56ebd87991c612546e02c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Sun, 9 Mar 2025 10:51:42 -0300 Subject: [PATCH 13/18] Apply suggestions from code review[1] --- src/ngx_http_vhost_traffic_status_display_json.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ngx_http_vhost_traffic_status_display_json.c b/src/ngx_http_vhost_traffic_status_display_json.c index d7c225a..bdf3fb0 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.c +++ b/src/ngx_http_vhost_traffic_status_display_json.c @@ -101,8 +101,6 @@ ngx_http_vhost_traffic_status_display_set_server_node( vtsn->stat_out_bytes); if (ctx->measure_status_codes != NULL && vtsn->stat_status_code_counter != NULL) { - ngx_uint_t *status_code = NULL; - buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE_START); ngx_uint_t *status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts; @@ -111,12 +109,11 @@ ngx_http_vhost_traffic_status_display_set_server_node( if (vtsn->stat_status_code_counter[i] == 0 && ctx->measure_all_status_codes) { continue; } - status_code = &status_codes[i]; if (inserted > 0) { buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_SEPARATOR); } buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE, - *status_code, vtsn->stat_status_code_counter[i]); + status_codes[i], vtsn->stat_status_code_counter[i]); inserted++; } From 5f6c9a07c5480475b44893359d48acb3b48983ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Sun, 9 Mar 2025 11:27:19 -0300 Subject: [PATCH 14/18] feat: add support for 'other' status code in traffic status display --- ...ngx_http_vhost_traffic_status_display_json.c | 17 ++++++++--------- ...ngx_http_vhost_traffic_status_display_json.h | 4 ++-- ...tp_vhost_traffic_status_display_prometheus.c | 12 ++++++++---- ...tp_vhost_traffic_status_display_prometheus.h | 3 +++ src/ngx_http_vhost_traffic_status_shm.c | 8 ++++---- src/ngx_http_vhost_traffic_status_shm.h | 2 -- 6 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/ngx_http_vhost_traffic_status_display_json.c b/src/ngx_http_vhost_traffic_status_display_json.c index bdf3fb0..d971648 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.c +++ b/src/ngx_http_vhost_traffic_status_display_json.c @@ -103,18 +103,17 @@ ngx_http_vhost_traffic_status_display_set_server_node( 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]); + ngx_uint_t *status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts; - ngx_uint_t inserted = 0; + for (ngx_uint_t i = 0; i < ctx->measure_status_codes->nelts; i++) { - if (vtsn->stat_status_code_counter[i] == 0 && ctx->measure_all_status_codes) { + if (vtsn->stat_status_code_counter[i+1] == 0 && ctx->measure_all_status_codes) { continue; } - if (inserted > 0) { - buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_SEPARATOR); - } buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_STATUS_CODE, - status_codes[i], vtsn->stat_status_code_counter[i]); - inserted++; + 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); @@ -239,7 +238,7 @@ ngx_http_vhost_traffic_status_display_set_server(ngx_http_request_t *r, 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); + vtsn->stat_status_code_counter, ctx->measure_status_codes->nelts+1); } vtscf->stats.stat_request_counter_oc += vtsn->stat_request_counter_oc; @@ -881,7 +880,7 @@ ngx_http_vhost_traffic_status_display_set(ngx_http_request_t *r, 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); + 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; } diff --git a/src/ngx_http_vhost_traffic_status_display_json.h b/src/ngx_http_vhost_traffic_status_display_json.h index f933aa0..990ea3d 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.h +++ b/src/ngx_http_vhost_traffic_status_display_json.h @@ -121,8 +121,8 @@ #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_STATUS_SEPARATOR "," +#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\":{" diff --git a/src/ngx_http_vhost_traffic_status_display_prometheus.c b/src/ngx_http_vhost_traffic_status_display_prometheus.c index 967e631..c01a08d 100644 --- a/src/ngx_http_vhost_traffic_status_display_prometheus.c +++ b/src/ngx_http_vhost_traffic_status_display_prometheus.c @@ -80,13 +80,17 @@ ngx_http_vhost_traffic_status_display_prometheus_set_server_node( 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 (ngx_uint_t i = 0; i < ctx->measure_status_codes->nelts; i++) { - if (vtsn->stat_status_code_counter[i] == 0 && ctx->measure_all_status_codes) { + 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]); + &server, status_codes[i], vtsn->stat_status_code_counter[i+1]); } } @@ -174,7 +178,7 @@ ngx_http_vhost_traffic_status_display_prometheus_set_server(ngx_http_request_t * 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); + vtsn->stat_status_code_counter, ctx->measure_status_codes->nelts+1); } #if (NGX_HTTP_CACHE) @@ -518,7 +522,7 @@ ngx_http_vhost_traffic_status_display_prometheus_set(ngx_http_request_t *r, 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); + 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; } diff --git a/src/ngx_http_vhost_traffic_status_display_prometheus.h b/src/ngx_http_vhost_traffic_status_display_prometheus.h index a37256d..7a9becd 100644 --- a/src/ngx_http_vhost_traffic_status_display_prometheus.h +++ b/src/ngx_http_vhost_traffic_status_display_prometheus.h @@ -58,6 +58,9 @@ "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" diff --git a/src/ngx_http_vhost_traffic_status_shm.c b/src/ngx_http_vhost_traffic_status_shm.c index 9cebf7a..62d415d 100644 --- a/src/ngx_http_vhost_traffic_status_shm.c +++ b/src/ngx_http_vhost_traffic_status_shm.c @@ -106,7 +106,7 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r, shpool = (ngx_slab_pool_t *) vtscf->shm_zone->shm.addr; - status_code_slot = NGX_HTTP_VHOST_TRAFFIC_STATUS_STATUS_CODE_SLOT_UNDEFINED; + status_code_slot = 0; if (ctx->measure_all_status_codes) { if (r->headers_out.status >= 100 && r->headers_out.status < 600) { status_code_slot = r->headers_out.status - 100; @@ -164,7 +164,7 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r, 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); + 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) { @@ -574,11 +574,11 @@ ngx_http_vhost_traffic_status_find_status_code_slot(ngx_uint_t status, ngx_array if (found == NULL) { ngx_log_error(NGX_LOG_DEBUG, ngx_cycle->log, 0, "Status code %ui not found in status_codes array", status); - return NGX_HTTP_VHOST_TRAFFIC_STATUS_STATUS_CODE_SLOT_UNDEFINED; + return 0; } ngx_int_t index = (ngx_int_t)(found - (ngx_uint_t *)status_codes->elts); - return index; + return index + 1; } #if (NGX_HTTP_CACHE) diff --git a/src/ngx_http_vhost_traffic_status_shm.h b/src/ngx_http_vhost_traffic_status_shm.h index f99241e..7866792 100644 --- a/src/ngx_http_vhost_traffic_status_shm.h +++ b/src/ngx_http_vhost_traffic_status_shm.h @@ -18,8 +18,6 @@ typedef struct { ngx_uint_t filter_used_node; } ngx_http_vhost_traffic_status_shm_info_t; -#define NGX_HTTP_VHOST_TRAFFIC_STATUS_STATUS_CODE_SLOT_UNDEFINED -1 - 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); From 60af31ad473548871a02a280266b0e6958a0e5ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Sun, 9 Mar 2025 11:46:53 -0300 Subject: [PATCH 15/18] fix: adjust status code slot calculation to reserve slot for other status codes --- src/ngx_http_vhost_traffic_status_shm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ngx_http_vhost_traffic_status_shm.c b/src/ngx_http_vhost_traffic_status_shm.c index 62d415d..abbdd2b 100644 --- a/src/ngx_http_vhost_traffic_status_shm.c +++ b/src/ngx_http_vhost_traffic_status_shm.c @@ -109,7 +109,8 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r, status_code_slot = 0; if (ctx->measure_all_status_codes) { if (r->headers_out.status >= 100 && r->headers_out.status < 600) { - status_code_slot = r->headers_out.status - 100; + // 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, From 5fa408934a0a3a23c39f7954c336dc22437f0eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Mon, 10 Mar 2025 09:06:17 -0300 Subject: [PATCH 16/18] Apply suggestions from code review Co-authored-by: Y.Horie --- src/ngx_http_vhost_traffic_status_display_json.c | 7 ++++--- src/ngx_http_vhost_traffic_status_display_prometheus.c | 2 +- src/ngx_http_vhost_traffic_status_node.c | 2 +- src/ngx_http_vhost_traffic_status_shm.c | 5 ++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ngx_http_vhost_traffic_status_display_json.c b/src/ngx_http_vhost_traffic_status_display_json.c index d971648..fe680c8 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.c +++ b/src/ngx_http_vhost_traffic_status_display_json.c @@ -58,8 +58,9 @@ ngx_http_vhost_traffic_status_display_set_server_node( ngx_http_vhost_traffic_status_node_t *vtsn) { u_char *p, *c; - ngx_int_t rc; + ngx_int_t rc, 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; @@ -106,9 +107,9 @@ ngx_http_vhost_traffic_status_display_set_server_node( buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_JSON_FMT_SERVER_OTHER_STATUS_CODE, vtsn->stat_status_code_counter[0]); - ngx_uint_t *status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts; + *status_codes = (ngx_uint_t *) ctx->measure_status_codes->elts; - for (ngx_uint_t i = 0; i < ctx->measure_status_codes->nelts; i++) { + 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; } diff --git a/src/ngx_http_vhost_traffic_status_display_prometheus.c b/src/ngx_http_vhost_traffic_status_display_prometheus.c index c01a08d..f461299 100644 --- a/src/ngx_http_vhost_traffic_status_display_prometheus.c +++ b/src/ngx_http_vhost_traffic_status_display_prometheus.c @@ -84,7 +84,7 @@ ngx_http_vhost_traffic_status_display_prometheus_set_server_node( buf = ngx_sprintf(buf, NGX_HTTP_VHOST_TRAFFIC_STATUS_PROMETHEUS_FMT_SERVER_OTHER_STATUS_CODE, &server, vtsn->stat_status_code_counter[0]); - for (ngx_uint_t i = 0; i < ctx->measure_status_codes->nelts; i++) { + 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; } diff --git a/src/ngx_http_vhost_traffic_status_node.c b/src/ngx_http_vhost_traffic_status_node.c index 0fb2bb9..0cfe836 100644 --- a/src/ngx_http_vhost_traffic_status_node.c +++ b/src/ngx_http_vhost_traffic_status_node.c @@ -292,7 +292,7 @@ ngx_http_vhost_traffic_status_node_zero(ngx_http_vhost_traffic_status_node_t *vt vtsn->stat_request_time_counter_oc = 0; vtsn->stat_response_time_counter_oc = 0; - for (uint i=0; istat_status_code_length; i++) { + for (i = 0; i < vtsn->stat_status_code_length; i++) { vtsn->stat_status_code_counter[i] = 0; } diff --git a/src/ngx_http_vhost_traffic_status_shm.c b/src/ngx_http_vhost_traffic_status_shm.c index abbdd2b..4ed8743 100644 --- a/src/ngx_http_vhost_traffic_status_shm.c +++ b/src/ngx_http_vhost_traffic_status_shm.c @@ -565,7 +565,7 @@ static int ngx_http_vhost_traffic_status_find_status_code_slot_cmp(const void *o return (*(ngx_uint_t *) one - *(ngx_uint_t *) two); } -ngx_int_t +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, @@ -578,8 +578,7 @@ ngx_http_vhost_traffic_status_find_status_code_slot(ngx_uint_t status, ngx_array return 0; } - ngx_int_t index = (ngx_int_t)(found - (ngx_uint_t *)status_codes->elts); - return index + 1; + return found - (ngx_uint_t *)status_codes->elts + 1; } #if (NGX_HTTP_CACHE) From d35ee18b29e1061245bd97014a77ca66e33ed9fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Mon, 10 Mar 2025 09:15:13 -0300 Subject: [PATCH 17/18] refactor: update variable types and function signatures for consistency --- src/ngx_http_vhost_traffic_status_display_json.c | 7 ++++--- src/ngx_http_vhost_traffic_status_node.c | 2 ++ src/ngx_http_vhost_traffic_status_shm.c | 3 ++- src/ngx_http_vhost_traffic_status_shm.h | 3 +-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/ngx_http_vhost_traffic_status_display_json.c b/src/ngx_http_vhost_traffic_status_display_json.c index fe680c8..f06f378 100644 --- a/src/ngx_http_vhost_traffic_status_display_json.c +++ b/src/ngx_http_vhost_traffic_status_display_json.c @@ -58,9 +58,10 @@ ngx_http_vhost_traffic_status_display_set_server_node( ngx_http_vhost_traffic_status_node_t *vtsn) { u_char *p, *c; - ngx_int_t rc, i; + ngx_int_t rc; + ngx_uint_t i; ngx_str_t tmp, dst; - ngx_uint_t *status_codes + ngx_uint_t *status_codes; ngx_http_vhost_traffic_status_loc_conf_t *vtscf; ngx_http_vhost_traffic_status_ctx_t *ctx; @@ -107,7 +108,7 @@ ngx_http_vhost_traffic_status_display_set_server_node( 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; + 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) { diff --git a/src/ngx_http_vhost_traffic_status_node.c b/src/ngx_http_vhost_traffic_status_node.c index 0cfe836..c6938c5 100644 --- a/src/ngx_http_vhost_traffic_status_node.c +++ b/src/ngx_http_vhost_traffic_status_node.c @@ -267,6 +267,8 @@ ngx_http_vhost_traffic_status_node_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key, 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; diff --git a/src/ngx_http_vhost_traffic_status_shm.c b/src/ngx_http_vhost_traffic_status_shm.c index 4ed8743..df70be1 100644 --- a/src/ngx_http_vhost_traffic_status_shm.c +++ b/src/ngx_http_vhost_traffic_status_shm.c @@ -560,7 +560,8 @@ ngx_http_vhost_traffic_status_shm_add_upstream(ngx_http_request_t *r) return NGX_OK; } -static int ngx_http_vhost_traffic_status_find_status_code_slot_cmp(const void *one, const void *two) +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); } diff --git a/src/ngx_http_vhost_traffic_status_shm.h b/src/ngx_http_vhost_traffic_status_shm.h index 7866792..1a37f01 100644 --- a/src/ngx_http_vhost_traffic_status_shm.h +++ b/src/ngx_http_vhost_traffic_status_shm.h @@ -17,11 +17,10 @@ typedef struct { ngx_uint_t filter_used_size; ngx_uint_t filter_used_node; } ngx_http_vhost_traffic_status_shm_info_t; - 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_int_t ngx_http_vhost_traffic_status_find_status_code_slot(ngx_uint_t status, ngx_array_t *status_codes); +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); From f6ac33949be218110b5239daaaaa7705a49348de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Mon, 10 Mar 2025 09:17:16 -0300 Subject: [PATCH 18/18] restore empty lines --- src/ngx_http_vhost_traffic_status_shm.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ngx_http_vhost_traffic_status_shm.h b/src/ngx_http_vhost_traffic_status_shm.h index 1a37f01..8d351ca 100644 --- a/src/ngx_http_vhost_traffic_status_shm.h +++ b/src/ngx_http_vhost_traffic_status_shm.h @@ -17,6 +17,8 @@ typedef struct { ngx_uint_t filter_used_size; ngx_uint_t filter_used_node; } ngx_http_vhost_traffic_status_shm_info_t; + + 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);