Saltar a contenido

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={}}
            },
    }
}
Después de que se llama a este método, cuando uses el método stats.log(stats_name), puedes usar estas estadísticas predefinidas.

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:

docs/query-page.png

  • 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

Demo Simple de Stats

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.