stats: Es un módulo estadístico para nginx basado en nginx-module-lua. Las claves y valores estadísticos son configurables, pueden usar las variables del núcleo de nginx y las variables de este módulo. El resultado estadístico se almacena en mongodb.
Instalación
Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.
CentOS/RHEL 7 o Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-stats
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-stats
Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.
Este documento describe lua-resty-stats v1.0.3 lanzado el 28 de noviembre de 2020.
#set ngx_lua's environment variable:
# init the lua-resty-stats
init_worker_by_lua '
local stats = require("resty.stats")
-- add the default stats that named "stats_host"
stats.add_def_stats()
-- the general stats"s config
local update = {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1,
["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}}
-- stats by uri
stats.add_stats_config("stats_uri",
{selector={date="$date",key="$uri"}, update=update,
indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })
-- stats by arg
stats.add_stats_config("stats_arg",
{selector={date="$date",key="$arg_client_type"}, update=update,
indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })
-- stats by uri and args
stats.add_stats_config("stats_uri_arg",
{selector={date="$date",key="$uri?$arg_from"}, update=update,
indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })
-- stats by http request header
stats.add_stats_config("stats_header_in",
{selector={date="$date",key="city:$http_city"}, update=update,
indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })
-- stats by http response header
stats.add_stats_config("stats_header_out",
{selector={date="$date",key="cache:$sent_http_cache"}, update=update,
indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })
local mongo_cfg = {host="192.168.1.201", port=27017, dbname="ngx_stats"}
local flush_interval = 2 -- segundo
local retry_interval = 0.2 -- segundo
-- init stats and start flush timer.
stats.init(mongo_cfg, flush_interval, retry_interval)
';
server {
listen 80;
server_name localhost;
location /byuri {
echo "byuri: $uri";
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_uri")
stats.log("stats_host")
';
}
location /byarg {
echo_sleep 0.005;
echo "login $args";
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_arg")
';
}
location /byarg/404 {
request_stats statby_arg "clitype:$arg_client_type";
return 404;
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_arg")
';
}
location /byuriarg {
echo "$uri?$args";
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_uri_arg")
';
}
location /byhttpheaderin {
echo "city: $http_city";
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_header_in")
';
}
location /byhttpheaderout/ {
proxy_pass http://127.0.0.1:82;
log_by_lua '
local stats = require("resty.stats")
stats.log("stats_header_out")
';
}
}
server {
listen 82;
server_name localhost;
location /byhttpheaderout/hit {
add_header cache hit;
echo "cache: hit";
}
location /byhttpheaderout/miss {
add_header cache miss;
echo "cache: miss";
}
}
server {
listen 2000;
server_name localhost;
location /stats {
set $template_root /path/to/lua-resty-stats/view;
content_by_lua_file '/path/to/lua-resty-stats/view/main.lua';
}
}
Variables
- El módulo nginx_core soporta variables: http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
- Variables de este módulo
- date: fecha actual en el formato: 1970-09-28
- time: hora actual en el formato: 12:00:00
- year: año actual
- month: mes actual
- day: fecha actual
- hour: hora actual
- minute: minuto actual
- second: segundo actual
Métodos
Para cargar esta biblioteca,
necesitas especificar la ruta de esta biblioteca en la directiva lua_package_path de ngx_lua. Por ejemplo:
http {
}
usas require para cargar la biblioteca en una variable local de Lua:
local stats = require("resty.stats")
add_def_stats
syntax: stats.add_def_stats()
agrega las configuraciones de estadísticas predefinidas que contienen:
stats_name: stats_host
stats_config:
{
selector={date='$date',key='$host'},
update={['$inc']= {count=1, ['hour_cnt.$hour']=1, ['status.$status']=1,
['req_time.all']="$request_time", ['req_time.$hour']="$request_time"}},
indexes={
{keys={'date', 'key'}, options={unique=true}},
{keys={'key'}, options={}}
},
}
}
add_stats_config
syntax: stats.add_stats_config(stats_name, stats_config)
Agrega un elemento de configuración estadística personalizado que contiene stats_name y configuración de estadísticas.
* stats_name es el nombre de la estadística, y también es el nombre de la tabla de mongodb.
El nombre se utilizará al llamar al método stats.log(stats_name).
* stats_config se utiliza para definir los valores de las estadísticas.
stats_config es una tabla que contiene algunos campos:
* selector una declaración de consulta de mongodb. como: {date="$date",key="$host"}
* update una declaración de actualización de mongodb. como: {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1,
["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}}
* indexes una tabla que contiene todos los campos del índice.
La configuración de selector y update puede usar variables.
Ten en cuenta que "$inc" no es una variable de nginx, es un operador de mongodb.
init
syntax: stats.init(mongo_cfg, flush_interval, retry_interval)
Inicializa la biblioteca estadística.
* mongo_cfg La configuración de mongodb, contiene campos:
* host host de mongodb
* port puerto de mongodb
* dbname nombre de la base de datos de mongodb.
* flush_interval intervalo de tiempo para vaciar datos en mongodb, la unidad de tiempo es segundos.
* retry_interval el intervalo de tiempo de reintento en caso de error de vaciado, la unidad de tiempo es segundos.
log
syntax: stats.log(stats_name)
Recoge la información estadística especificada (por stats_name) en la fase de registro.
* stats_name es un nombre estadístico que se agrega mediante stats.add_stats_config.
si el stats_name es nil, el método de registro recogerá todas las estadísticas que han sido configuradas.
Consulta Simple Y API
lua-resty-stats con una página de consulta simple y una interfaz API, que se puede utilizar en los siguientes pasos: * agregar configuración de ubicación a nginx.conf
location /stats {
set $template_root /path/to/lua-resty-stats/view;
content_by_lua_file '/path/to/lua-resty-stats/view/main.lua';
}
- Acceder a la página de consulta. ej.
http://192.168.1.xxx/stats:

- Acceder a la API:
## por fecha
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=2020-02-20&limit=100
## por fecha, hoy
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=today&limit=10
## por clave (el parámetro de fecha se ignora)
curl http://127.0.0.1:8020/stats/api?table=stats_uri&key=/path/to/uri
- La respuesta de la API se verá algo así:
{
"stats": [
{
"hour_cnt": {
"19": 24
},
"count": 24,
"status": {
"200": 24
},
"total": 24,
"req_time": {
"19": 13.262,
"all": 13.262
},
"percent": 100,
"key": "/path/to/uri",
"date": "2020-09-24"
}
]
}
Si has configurado algunos otros campos en tu actualización, esto será diferente
Demo Simple
Puedes incluirlo en nginx.conf usando la directiva include. Como:
include /path/to/simple_stats.conf;
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-stats.