Skip to content

Commit 19f4de1

Browse files
committed
Feature: added vhost_traffic_status_average_method to support for selecting an average formula
1 parent 50a88b1 commit 19f4de1

6 files changed

+126
-14
lines changed

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ Table of Contents
6060
* [vhost_traffic_status_limit_traffic_by_set_key](#vhost_traffic_status_limit_traffic_by_set_key)
6161
* [vhost_traffic_status_limit_check_duplicate](#vhost_traffic_status_limit_check_duplicate)
6262
* [vhost_traffic_status_set_by_filter](#vhost_traffic_status_set_by_filter)
63+
* [vhost_traffic_status_average_method](#vhost_traffic_status_average_method)
6364
* [See Also](#see-also)
6465
* [TODO](#todo)
6566
* [Donation](#donation)
@@ -1397,6 +1398,21 @@ For examples:
13971398
* cacheHit in cacheZones
13981399
* **vhost_traffic_status_set_by_filter** `$cacheHit` `cache/my_cache_name/cacheHit`
13991400

1401+
### vhost_traffic_status_average_method
1402+
1403+
- | -
1404+
--- | ---
1405+
**Syntax** | **vhost_traffic_status_average_method** \<AMM\|WMA\>
1406+
**Default** | AMM
1407+
**Context** | http, server, location
1408+
1409+
`Description:` Sets the method which is a formula that calculate the average of response processing times.
1410+
The corresponding values are `requestMsec` and `responseMsec` in JSON.
1411+
1412+
* **AMM**
1413+
* The AMM is the [arithmetic mean](https://en.wikipedia.org/wiki/Arithmetic_mean).
1414+
* **WMA**
1415+
* THE WMA is the [weighted moving average](https://en.wikipedia.org/wiki/Moving_average#Weighted_moving_average).
14001416

14011417
## See Also
14021418
* Stream traffic status

src/ngx_http_vhost_traffic_status_module.c

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ static ngx_conf_enum_t ngx_http_vhost_traffic_status_display_format[] = {
4141
};
4242

4343

44+
static ngx_conf_enum_t ngx_http_vhost_traffic_status_average_method[] = {
45+
{ ngx_string("AMM"), NGX_HTTP_VHOST_TRAFFIC_STATUS_AVERAGE_METHOD_AMM },
46+
{ ngx_string("WMA"), NGX_HTTP_VHOST_TRAFFIC_STATUS_AVERAGE_METHOD_WMA },
47+
{ ngx_null_string, 0 }
48+
};
49+
50+
4451
static ngx_command_t ngx_http_vhost_traffic_status_commands[] = {
4552

4653
{ ngx_string("vhost_traffic_status"),
@@ -149,6 +156,13 @@ static ngx_command_t ngx_http_vhost_traffic_status_commands[] = {
149156
0,
150157
NULL },
151158

159+
{ ngx_string("vhost_traffic_status_average_method"),
160+
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
161+
ngx_conf_set_enum_slot,
162+
NGX_HTTP_LOC_CONF_OFFSET,
163+
offsetof(ngx_http_vhost_traffic_status_loc_conf_t, average_method),
164+
&ngx_http_vhost_traffic_status_average_method },
165+
152166
ngx_null_command
153167
};
154168

@@ -541,16 +555,44 @@ ngx_http_vhost_traffic_status_create_loc_conf(ngx_conf_t *cf)
541555
return NULL;
542556
}
543557

544-
conf->start_msec = ngx_current_msec;
558+
/*
559+
* set by ngx_pcalloc():
560+
*
561+
* conf->shm_zone = { NULL, ... };
562+
* conf->enable = 0;
563+
* conf->filter = 0;
564+
* conf->filter_host = 0;
565+
* conf->filter_check_duplicate = 0;
566+
* conf->filter_keys = { NULL, ... };
567+
* conf->filter_vars = { NULL, ... };
568+
*
569+
* conf->limit = 0;
570+
* conf->limit_check_duplicate = 0;
571+
* conf->limit_traffics = { NULL, ... };
572+
* conf->limit_filter_traffics = { NULL, ... };
573+
*
574+
* conf->shm_name = { 0, NULL };
575+
* conf->stats = { 0, ... };
576+
* conf->start_msec = 0;
577+
* conf->format = 0;
578+
* conf->jsonp = { 0, NULL };
579+
* conf->sum_key = { 0, NULL };
580+
* conf->average_method = 0;
581+
*/
582+
583+
conf->shm_zone = NGX_CONF_UNSET_PTR;
545584
conf->enable = NGX_CONF_UNSET;
546585
conf->filter = NGX_CONF_UNSET;
547586
conf->filter_host = NGX_CONF_UNSET;
548587
conf->filter_check_duplicate = NGX_CONF_UNSET;
588+
conf->filter_vars = NGX_CONF_UNSET_PTR;
589+
549590
conf->limit = NGX_CONF_UNSET;
550591
conf->limit_check_duplicate = NGX_CONF_UNSET;
551-
conf->shm_zone = NGX_CONF_UNSET_PTR;
592+
593+
conf->start_msec = ngx_current_msec;
552594
conf->format = NGX_CONF_UNSET;
553-
conf->filter_vars = NGX_CONF_UNSET_PTR;
595+
conf->average_method = NGX_CONF_UNSET;
554596

555597
conf->node_caches = ngx_pcalloc(cf->pool, sizeof(ngx_rbtree_node_t *)
556598
* (NGX_HTTP_VHOST_TRAFFIC_STATUS_UPSTREAM_FG + 1));
@@ -638,21 +680,23 @@ ngx_http_vhost_traffic_status_merge_loc_conf(ngx_conf_t *cf, void *parent, void
638680
}
639681
}
640682

683+
ngx_conf_merge_ptr_value(conf->shm_zone, prev->shm_zone, NULL);
641684
ngx_conf_merge_value(conf->enable, prev->enable, 1);
642685
ngx_conf_merge_value(conf->filter, prev->filter, 1);
643686
ngx_conf_merge_value(conf->filter_host, prev->filter_host, 0);
644687
ngx_conf_merge_value(conf->filter_check_duplicate, prev->filter_check_duplicate, 1);
645688
ngx_conf_merge_value(conf->limit, prev->limit, 1);
646689
ngx_conf_merge_value(conf->limit_check_duplicate, prev->limit_check_duplicate, 1);
647-
ngx_conf_merge_ptr_value(conf->shm_zone, prev->shm_zone, NULL);
690+
ngx_conf_merge_ptr_value(conf->filter_vars, prev->filter_vars, NULL);
691+
648692
ngx_conf_merge_value(conf->format, prev->format,
649693
NGX_HTTP_VHOST_TRAFFIC_STATUS_FORMAT_JSON);
650694
ngx_conf_merge_str_value(conf->jsonp, prev->jsonp,
651695
NGX_HTTP_VHOST_TRAFFIC_STATUS_DEFAULT_JSONP);
652696
ngx_conf_merge_str_value(conf->sum_key, prev->sum_key,
653697
NGX_HTTP_VHOST_TRAFFIC_STATUS_DEFAULT_SUM_KEY);
654-
655-
ngx_conf_merge_ptr_value(conf->filter_vars, prev->filter_vars, NULL);
698+
ngx_conf_merge_value(conf->average_method, prev->average_method,
699+
NGX_HTTP_VHOST_TRAFFIC_STATUS_AVERAGE_METHOD_AMM);
656700

657701
name = ctx->shm_name;
658702

src/ngx_http_vhost_traffic_status_module.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
#define NGX_HTTP_VHOST_TRAFFIC_STATUS_FORMAT_HTML 2
3535
#define NGX_HTTP_VHOST_TRAFFIC_STATUS_FORMAT_JSONP 3
3636

37+
#define NGX_HTTP_VHOST_TRAFFIC_STATUS_AVERAGE_METHOD_AMM 0
38+
#define NGX_HTTP_VHOST_TRAFFIC_STATUS_AVERAGE_METHOD_WMA 1
39+
3740
#define NGX_HTTP_VHOST_TRAFFIC_STATUS_DEFAULT_SHM_NAME "ngx_http_vhost_traffic_status"
3841
#define NGX_HTTP_VHOST_TRAFFIC_STATUS_DEFAULT_SHM_SIZE 0xfffff
3942
#define NGX_HTTP_VHOST_TRAFFIC_STATUS_DEFAULT_JSONP "ngx_http_vhost_traffic_status_jsonp_callback"
@@ -436,6 +439,7 @@ typedef struct {
436439
ngx_flag_t format;
437440
ngx_str_t jsonp;
438441
ngx_str_t sum_key;
442+
ngx_flag_t average_method;
439443

440444
ngx_rbtree_node_t **node_caches;
441445
} ngx_http_vhost_traffic_status_loc_conf_t;

src/ngx_http_vhost_traffic_status_node.c

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,12 @@ void
251251
ngx_http_vhost_traffic_status_node_set(ngx_http_request_t *r,
252252
ngx_http_vhost_traffic_status_node_t *vtsn)
253253
{
254-
ngx_uint_t status;
255-
ngx_msec_int_t ms;
256-
ngx_http_vhost_traffic_status_node_t ovtsn;
254+
ngx_uint_t status;
255+
ngx_msec_int_t ms;
256+
ngx_http_vhost_traffic_status_node_t ovtsn;
257+
ngx_http_vhost_traffic_status_loc_conf_t *vtscf;
258+
259+
vtscf = ngx_http_get_module_loc_conf(r, ngx_http_vhost_traffic_status_module);
257260

258261
status = r->headers_out.status;
259262
ovtsn = *vtsn;
@@ -269,8 +272,8 @@ ngx_http_vhost_traffic_status_node_set(ngx_http_request_t *r,
269272
ngx_http_vhost_traffic_status_node_time_queue_insert(&vtsn->stat_request_times,
270273
ms);
271274

272-
vtsn->stat_request_time = ngx_http_vhost_traffic_status_node_time_queue_wma(
273-
&vtsn->stat_request_times);
275+
vtsn->stat_request_time = ngx_http_vhost_traffic_status_node_time_queue_average(
276+
&vtsn->stat_request_times, vtscf->average_method);
274277

275278
#if (NGX_HTTP_CACHE)
276279
if (r->upstream != NULL && r->upstream->cache_status != 0) {
@@ -349,6 +352,41 @@ ngx_http_vhost_traffic_status_node_time_queue_insert(
349352
}
350353

351354

355+
ngx_msec_t
356+
ngx_http_vhost_traffic_status_node_time_queue_average(
357+
ngx_http_vhost_traffic_status_node_time_queue_t *q,
358+
ngx_int_t method)
359+
{
360+
ngx_msec_t avg;
361+
362+
if (method == NGX_HTTP_VHOST_TRAFFIC_STATUS_AVERAGE_METHOD_AMM) {
363+
avg = ngx_http_vhost_traffic_status_node_time_queue_amm(q);
364+
} else {
365+
avg = ngx_http_vhost_traffic_status_node_time_queue_wma(q);
366+
}
367+
368+
return avg;
369+
}
370+
371+
372+
ngx_msec_t
373+
ngx_http_vhost_traffic_status_node_time_queue_amm(
374+
ngx_http_vhost_traffic_status_node_time_queue_t *q)
375+
{
376+
ngx_int_t i, j, k;
377+
378+
for (i = q->front, j = 1, k = 0; i != q->rear; i = (i + 1) % q->len, j++) {
379+
k += (ngx_int_t) q->times[i].msec;
380+
}
381+
382+
if (j != q->len) {
383+
ngx_http_vhost_traffic_status_node_time_queue_init(q);
384+
}
385+
386+
return (ngx_msec_t) (k / (q->len - 1));
387+
}
388+
389+
352390
ngx_msec_t
353391
ngx_http_vhost_traffic_status_node_time_queue_wma(
354392
ngx_http_vhost_traffic_status_node_time_queue_t *q)

src/ngx_http_vhost_traffic_status_node.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,12 @@ ngx_int_t ngx_http_vhost_traffic_status_node_time_queue_push(
113113
ngx_int_t ngx_http_vhost_traffic_status_node_time_queue_pop(
114114
ngx_http_vhost_traffic_status_node_time_queue_t *q,
115115
ngx_http_vhost_traffic_status_node_time_t *x);
116+
117+
ngx_msec_t ngx_http_vhost_traffic_status_node_time_queue_average(
118+
ngx_http_vhost_traffic_status_node_time_queue_t *q,
119+
ngx_int_t method);
120+
ngx_msec_t ngx_http_vhost_traffic_status_node_time_queue_amm(
121+
ngx_http_vhost_traffic_status_node_time_queue_t *q);
116122
ngx_msec_t ngx_http_vhost_traffic_status_node_time_queue_wma(
117123
ngx_http_vhost_traffic_status_node_time_queue_t *q);
118124

src/ngx_http_vhost_traffic_status_shm.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,10 @@ static ngx_int_t
171171
ngx_http_vhost_traffic_status_shm_add_node_upstream(ngx_http_request_t *r,
172172
ngx_http_vhost_traffic_status_node_t *vtsn, unsigned init)
173173
{
174-
ngx_msec_int_t ms;
174+
ngx_msec_int_t ms;
175+
ngx_http_vhost_traffic_status_loc_conf_t *vtscf;
176+
177+
vtscf = ngx_http_get_module_loc_conf(r, ngx_http_vhost_traffic_status_module);
175178

176179
ms = ngx_http_vhost_traffic_status_upstream_response_time(r);
177180

@@ -182,8 +185,9 @@ ngx_http_vhost_traffic_status_shm_add_node_upstream(ngx_http_request_t *r,
182185
vtsn->stat_upstream.response_time = (ngx_msec_t) ms;
183186

184187
} else {
185-
vtsn->stat_upstream.response_time = ngx_http_vhost_traffic_status_node_time_queue_wma(
186-
&vtsn->stat_upstream.response_times);
188+
vtsn->stat_upstream.response_time = ngx_http_vhost_traffic_status_node_time_queue_average(
189+
&vtsn->stat_upstream.response_times,
190+
vtscf->average_method);
187191
}
188192

189193
return NGX_OK;

0 commit comments

Comments
 (0)