Zum Inhalt

stats: Ist ein statistisches Modul für NGINX, basierend auf nginx-module-lua. Statistische Schlüssel und Werte sind konfigurierbar, können die Variablen des NGINX-Kerns und die Variablen dieses Moduls verwenden. Das statistische Ergebnis wird in MongoDB gespeichert.

Installation

Wenn Sie noch kein RPM-Repository-Abonnement eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.

CentOS/RHEL 7 oder 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

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-stats v1.0.3, veröffentlicht am 28. November 2020.


    #setze die Umgebungsvariable von ngx_lua:
    # initiiere lua-resty-stats
    init_worker_by_lua '
        local stats = require("resty.stats")
        -- füge die Standardstatistiken hinzu, die "stats_host" genannt werden
        stats.add_def_stats()
        -- die Konfiguration der allgemeinen Statistiken
        local update = {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1, 
                      ["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}}

        -- Statistiken nach URI
        stats.add_stats_config("stats_uri", 
            {selector={date="$date",key="$uri"}, update=update,
             indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })

        -- Statistiken nach Argument        
        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={}}} })

        -- Statistiken nach URI und Argumenten 
        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={}}} })

        -- Statistiken nach HTTP-Anforderungsheader
        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={}}} })

        -- Statistiken nach HTTP-Antwortheader
        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 -- Sekunden
        local retry_interval = 0.2 -- Sekunden
        -- initialisiere Statistiken und starte den 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';
        }
    }

Variablen

  • Das nginx_core-Modul unterstützt Variablen: http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
  • Die Variablen dieses Moduls
    • date: aktuelles Datum im Format: 1970-09-28
    • time: aktuelle Uhrzeit im Format: 12:00:00
    • year: aktuelles Jahr
    • month: aktueller Monat
    • day: aktueller Tag
    • hour: aktuelle Stunde
    • minute: aktuelle Minute
    • second: aktuelle Sekunde

Methoden

Um diese Bibliothek zu laden,

müssen Sie den Pfad dieser Bibliothek in der lua_package_path-Direktive von ngx_lua angeben. Zum Beispiel:

http {
}

Sie verwenden require, um die Bibliothek in eine lokale Lua-Variable zu laden:

local stats = require("resty.stats")

add_def_stats

syntax: stats.add_def_stats()

Fügt die vordefinierten Statistik-Konfigurationen hinzu, die enthalten:

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={}}
            },
    }
}
Nachdem diese Methode aufgerufen wurde, können Sie beim Verwenden der Methode stats.log(stats_name) diese vordefinierten Statistiken verwenden.

add_stats_config

syntax: stats.add_stats_config(stats_name, stats_config)

Fügt ein benutzerdefiniertes statistisches Konfigurationselement hinzu, das stats_name und die Statistik-Konfiguration enthält. * stats_name ist der Name der Statistik und auch der Name der MongoDB-Tabelle. Der Name wird verwendet, wenn die Methode stats.log(stats_name) aufgerufen wird. * stats_config wird verwendet, um die Werte der Statistiken zu definieren. stats_config ist eine Tabelle, die einige Felder enthält: * selector eine MongoDB-Abfrageanweisung. wie: {date="$date",key="$host"} * update eine MongoDB-Aktualisierungsanweisung. wie: {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1, ["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}} * indexes eine Tabelle, die alle Felder des Index enthält.

Die Konfigurationen selector und update können Variablen verwenden.
Beachten Sie, dass "$inc" keine NGINX-Variable ist, sondern ein MongoDB-Operator.

init

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

Initialisierung der statistischen Bibliothek. * mongo_cfg Die MongoDB-Konfiguration, enthält Felder: * host Host von MongoDB * port Port von MongoDB * dbname Name der MongoDB-Datenbank. * flush_interval Zeitintervall zum Flushen von Daten in die MongoDB, die Zeiteinheit ist Sekunden. * retry_interval das Zeitintervall für den erneuten Versuch bei Flush-Fehlern, die Zeiteinheit ist Sekunden.

log

syntax: stats.log(stats_name)

Sammelt die angegebenen (von stats_name) statistischen Informationen in der Protokollphase.
* stats_name ist ein statistischer Name, der durch stats.add_stats_config hinzugefügt wurde.
Wenn stats_name nil ist, sammelt die Log-Methode alle konfigurierten Statistiken.

Einfache Abfrage und API

lua-resty-stats mit einer einfachen Abfrageseite und API-Schnittstelle, die in den folgenden Schritten verwendet werden kann: * Fügen Sie die Standortkonfiguration zu nginx.conf hinzu

location /stats {
    set $template_root /path/to/lua-resty-stats/view;
    content_by_lua_file '/path/to/lua-resty-stats/view/main.lua';
}
  • Greifen Sie auf die Abfrageseite zu. z.B. http://192.168.1.xxx/stats:

docs/query-page.png

  • Greifen Sie auf die API zu:
## nach Datum
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=2020-02-20&limit=100
## nach Datum, heute
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=today&limit=10

## nach Schlüssel (Der Datumsparameter wird ignoriert.)
curl http://127.0.0.1:8020/stats/api?table=stats_uri&key=/path/to/uri
  • Die API-Antwort wird ungefähr so aussehen:
{
    "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"
        }
    ]
}

Wenn Sie einige andere Felder in Ihrem Update konfiguriert haben, wird dies anders sein

Einfaches Demo

Einfache Stats-Demo

Sie können es in nginx.conf mit der Include-Direktive einfügen. Zum Beispiel: include /path/to/simple_stats.conf;

GitHub

Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-stats.