Pular para conteúdo

stats: É um módulo estatístico para o nginx baseado no nginx-module-lua. As chaves e valores estatísticos são configuráveis, podendo usar as variáveis do núcleo do nginx e as variáveis deste módulo. O resultado estatístico é armazenado no mongodb.

Instalação

Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.

CentOS/RHEL 7 ou 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 com o NGINX, certifique-se de que o nginx-module-lua está instalado.

Este documento descreve lua-resty-stats v1.0.3 lançado em 28 de novembro de 2020.


    #defina a variável de ambiente do ngx_lua:
    # inicialize o lua-resty-stats
    init_worker_by_lua '
        local stats = require("resty.stats")
        -- adicione as estatísticas padrão nomeadas "stats_host"
        stats.add_def_stats()
        -- a configuração das estatísticas gerais
        local update = {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1, 
                      ["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}}

        -- estatísticas por uri
        stats.add_stats_config("stats_uri", 
            {selector={date="$date",key="$uri"}, update=update,
             indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })

        -- estatísticas por 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={}}} })

        -- estatísticas por uri e 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={}}} })

        -- estatísticas por cabeçalho de requisição http
        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={}}} })

        -- estatísticas por cabeçalho de resposta http
        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 -- segundos
        local retry_interval = 0.2 -- segundos
        -- inicialize as estatísticas e inicie o temporizador de flush.
        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';
        }
    }

Variáveis

Métodos

Para carregar esta biblioteca,

você precisa especificar o caminho desta biblioteca na diretiva lua_package_path do ngx_lua. Por exemplo:

http {
}

você usa require para carregar a biblioteca em uma variável Lua local:

local stats = require("resty.stats")

add_def_stats

syntax: stats.add_def_stats()

adiciona as configurações de estatísticas pré-definidas que contêm:

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={}}
            },
    }
}
Depois que este método é chamado, quando você usar o método stats.log(stats_name), poderá usar essas estatísticas pré-definidas.

add_stats_config

syntax: stats.add_stats_config(stats_name, stats_config)

Adiciona um item de configuração estatística personalizada que contém stats_name e configuração de estatísticas. * stats_name é o nome das estatísticas e também é o nome da tabela do mongodb. O nome será usado ao chamar o método stats.log(stats_name). * stats_config é usado para definir os valores das estatísticas. stats_config é uma tabela que contém alguns campos: * selector uma declaração de consulta mongodb. como: {date="$date",key="$host"} * update uma declaração de atualização mongodb. como: {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1, ["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}} * indexes uma tabela que contém todos os campos do índice.

A configuração selector e update pode usar variáveis.
Note que "$inc" não é uma variável do nginx, é um operador do mongodb.

init

syntax: stats.init(mongo_cfg, flush_interval, retry_interval)

Inicializa a biblioteca estatística. * mongo_cfg A configuração do mongodb, contém os campos: * host host do mongodb * port porta do mongodb * dbname nome do banco de dados do mongodb. * flush_interval intervalo de tempo para enviar dados ao mongodb, a unidade de tempo é segundos. * retry_interval o intervalo de tempo para tentar novamente em caso de erro de flush, a unidade de tempo é segundos.

log

syntax: stats.log(stats_name)

Coleta as informações estatísticas especificadas (por stats_name) na fase de log.
* stats_name é um nome estatístico que foi adicionado por stats.add_stats_config.
se o stats_name for nil, o método de log coletará todas as estatísticas que foram configuradas.

Consulta Simples E API

lua-resty-stats com uma página de consulta simples e interface de API, que pode ser usada nos seguintes passos: * adicione a configuração de localização ao 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';
}
  • Acesse a página de consulta. ex. http://192.168.1.xxx/stats:

docs/query-page.png

  • Acesse a API:
## por data
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=2020-02-20&limit=100
## por data, hoje
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=today&limit=10

## por chave (o parâmetro de data é ignorado.)
curl http://127.0.0.1:8020/stats/api?table=stats_uri&key=/path/to/uri
  • A resposta da API será algo assim:
{
    "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"
        }
    ]
}

Se você configurou alguns outros campos na sua atualização, isso será diferente

Demo Simples

Demo Simples de Estatísticas

Você pode incluí-lo no nginx.conf usando a diretiva include. Como: include /path/to/simple_stats.conf;

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub do nginx-module-stats.