Aller au contenu

stats: Est un module statistique pour nginx basé sur nginx-module-lua. Les clés et valeurs statistiques sont configurables, peuvent utiliser les variables du noyau nginx et les variables de ce module. Le résultat statistique est stocké dans mongodb.

Installation

Si vous n'avez pas configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

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

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-stats v1.0.3 publié le 28 novembre 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 -- seconde
        local retry_interval = 0.2 -- seconde
        -- 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

  • Le module nginx_core prend en charge la variable : http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
  • Variables de ce module
    • date : date actuelle au format : 1970-09-28
    • time : heure actuelle au format : 12:00:00
    • year : année actuelle
    • month : mois actuel
    • day : date actuelle
    • hour : heure actuelle
    • minute : minute actuelle
    • second : seconde actuelle

Méthodes

Pour charger cette bibliothèque,

vous devez spécifier le chemin de cette bibliothèque dans la directive lua_package_path de ngx_lua. Par exemple :

http {
}

vous utilisez require pour charger la bibliothèque dans une variable Lua locale :

local stats = require("resty.stats")

add_def_stats

syntax: stats.add_def_stats()

ajoute les configurations statistiques prédéfinies qui contiennent :

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={}}
            },
    }
}
Après l'appel de cette méthode, lorsque vous utilisez la méthode stats.log(stats_name), vous pouvez utiliser ces statistiques prédéfinies.

add_stats_config

syntax: stats.add_stats_config(stats_name, stats_config)

Ajoute un élément de configuration statistique personnalisé qui contient stats_name et stats config. * stats_name est le nom des statistiques, et c'est aussi le nom de la table mongodb. Le nom sera utilisé lors de l'appel de la méthode stats.log(stats_name). * stats_config est utilisé pour définir les valeurs des statistiques. stats_config est une table qui contient certains champs : * selector une instruction de requête mongodb. comme : {date="$date",key="$host"} * update une instruction de mise à jour mongodb. comme : {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1, ["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}} * indexes une table qui contient tous les champs de l'index.

La configuration selector et update peut utiliser variables.
Notez que "$inc" n'est pas une variable nginx, c'est un opérateur mongodb.

init

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

Initialisation de la bibliothèque statistique. * mongo_cfg La configuration mongodb, contient les champs : * host hôte mongodb * port port mongodb * dbname nom de la base de données mongodb. * flush_interval intervalle de temps pour vider les données dans mongodb, l'unité de temps est en secondes. * retry_interval l'intervalle de temps de nouvelle tentative en cas d'erreur de vidage, l'unité de temps est en secondes.

log

syntax: stats.log(stats_name)

Collecte les informations statistiques spécifiées (par stats_name) à la phase de journalisation.
* stats_name est un nom statistique ajouté par stats.add_stats_config.
Si le stats_name est nil, la méthode log collectera toutes les statistiques qui ont été configurées.

Requête Simple Et API

lua-resty-stats avec une page de requête simple et une interface API, qui peut être utilisée dans les étapes suivantes : * ajouter la configuration de localisation à 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';
}
  • Accéder à la page de requête. par exemple http://192.168.1.xxx/stats :

docs/query-page.png

  • Accéder à l'API :
## par date
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=2020-02-20&limit=100
## par date, aujourd'hui
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=today&limit=10

## par clé (le paramètre date est ignoré.)
curl http://127.0.0.1:8020/stats/api?table=stats_uri&key=/path/to/uri
  • La réponse de l'API ressemblera à quelque chose comme ceci :
{
    "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 vous avez configuré d'autres champs dans votre mise à jour, cela sera différent

Démo Simple

Démo Simple Stats

Vous pouvez l'inclure dans nginx.conf en utilisant la directive include. Par exemple : include /path/to/simple_stats.conf;

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-stats.