From 35e4e08764e29be0a3617a0881cd27e9e1c92c64 Mon Sep 17 00:00:00 2001 From: Kirill A. Korinskiy Date: Thu, 28 May 2009 17:28:20 +0400 Subject: [PATCH] Add $loadavg_1m, $loadavg_5m and $loadavg_15m Cc: catap@catap.ru --- auto/os/features | 21 +++++++++ src/http/ngx_http_variables.c | 98 ++++++++++++++++++++++++++++++++++++++++- src/os/unix/ngx_user.c | 32 +++++++++++++ src/os/unix/ngx_user.h | 1 + 4 files changed, 151 insertions(+), 1 deletions(-) diff --git a/auto/os/features b/auto/os/features index ae0590e..75188e9 100644 --- a/auto/os/features +++ b/auto/os/features @@ -252,3 +252,24 @@ if [ $ngx_found != yes ]; then NGX_LIBDL="-ldl" fi fi + + +ngx_feature="sysinfo()" +ngx_feature_name="NGX_HAVE_SYSINFO" +ngx_feature_run=no +ngx_feature_incs="#include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="struct sysinfo s; + sysinfo(&s);" +. auto/feature + +ngx_feature="getloadavg()" +ngx_feature_name="NGX_HAVE_GETLOADAVG" +ngx_feature_run=no +ngx_feature_incs="#include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="double loadavg[1]; + getloadavg(loadavg, 1);" +. auto/feature diff --git a/src/http/ngx_http_variables.c b/src/http/ngx_http_variables.c index d41b996..9967604 100644 --- a/src/http/ngx_http_variables.c +++ b/src/http/ngx_http_variables.c @@ -88,6 +88,12 @@ static ngx_int_t ngx_http_variable_hostname(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); static ngx_int_t ngx_http_variable_pid(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_loadavg_1m(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_loadavg_5m(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_loadavg_15m(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); /* * TODO: @@ -250,6 +256,15 @@ static ngx_http_variable_t ngx_http_core_variables[] = { { ngx_string("pid"), NULL, ngx_http_variable_pid, 0, 0, 0 }, + { ngx_string("loadavg_1m"), NULL, ngx_http_variable_loadavg_1m, + 0, 0, 0 }, + + { ngx_string("loadavg_5m"), NULL, ngx_http_variable_loadavg_5m, + 0, 0, 0 }, + + { ngx_string("loadavg_15m"), NULL, ngx_http_variable_loadavg_15m, + 0, 0, 0 }, + { ngx_null_string, NULL, NULL, 0, 0, 0 } }; @@ -1590,7 +1605,7 @@ ngx_http_variable_pid(ngx_http_request_t *r, { u_char *p; - p = ngx_pnalloc(r->pool, NGX_INT64_LEN); + p = ngx_pnalloc(r->pool, NGX_INT_T_LEN); if (p == NULL) { return NGX_ERROR; } @@ -1605,6 +1620,87 @@ ngx_http_variable_pid(ngx_http_request_t *r, } +static ngx_int_t +ngx_http_variable_loadavg_1m(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + ngx_int_t la; + + p = ngx_pnalloc(r->pool, NGX_INT64_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + la = ngx_get_loadavg(0); + if (la == NGX_ERROR) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%i", la) - p; + v->valid = 1; + v->no_cacheable = 1; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_loadavg_5m(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + ngx_int_t la; + + p = ngx_pnalloc(r->pool, NGX_INT_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + la = ngx_get_loadavg(1); + if (la == NGX_ERROR) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%i", la) - p; + v->valid = 1; + v->no_cacheable = 1; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_variable_loadavg_15m(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + u_char *p; + ngx_int_t la; + + p = ngx_pnalloc(r->pool, NGX_INT_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + la = ngx_get_loadavg(2); + if (la == NGX_ERROR) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%i", la) - p; + v->valid = 1; + v->no_cacheable = 1; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + ngx_int_t ngx_http_variables_add_core_vars(ngx_conf_t *cf) { diff --git a/src/os/unix/ngx_user.c b/src/os/unix/ngx_user.c index 4bad1c3..0e4f949 100644 --- a/src/os/unix/ngx_user.c +++ b/src/os/unix/ngx_user.c @@ -7,6 +7,9 @@ #include #include +#if (NGX_HAVE_SYSINFO) +#include +#endif /* * Solaris has thread-safe crypt() @@ -106,3 +109,32 @@ ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) #endif #endif /* NGX_CRYPT */ + + +ngx_int_t ngx_get_loadavg(ngx_uint_t n) +{ +#if (NGX_HAVE_SYSINFO) + struct sysinfo s; + + if (sysinfo(&s)) { + goto error; + } + + return s.loads[n]/65536; + +#endif /* NGX_HAVE_SYSINFO */ + +#if (NGX_HAVE_GETLOADAVG) + double loadavg[1]; + + if (getloadavg(loadavg, 1) == -1) { + goto error; + } + + return (int)loadavg[n]; + +#endif /* NGX_HAVE_SYSINFO */ + +error: + return NGX_ERROR; +} diff --git a/src/os/unix/ngx_user.h b/src/os/unix/ngx_user.h index a24a66b..a4f151a 100644 --- a/src/os/unix/ngx_user.h +++ b/src/os/unix/ngx_user.h @@ -19,6 +19,7 @@ typedef gid_t ngx_gid_t; ngx_int_t ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted); +ngx_int_t ngx_get_loadavg(ngx_uint_t n); #endif /* _NGX_USER_H_INCLUDED_ */ -- 1.6.2