Перейти к содержанию

stats: Это статистический модуль для nginx, основанный на nginx-module-lua. Статистические ключи и значения настраиваемы, могут использовать переменные ядра nginx и переменные этого модуля. Статистические результаты хранятся в mongodb.

Установка

Если вы еще не настроили подписку на RPM-репозиторий, зарегистрируйтесь. Затем вы можете продолжить с следующими шагами.

CentOS/RHEL 7 или 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

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что nginx-module-lua установлен.

Этот документ описывает lua-resty-stats v1.0.3, выпущенную 28 ноября 2020 года.


    #установите переменную окружения ngx_lua:
    # инициализируйте lua-resty-stats
    init_worker_by_lua '
        local stats = require("resty.stats")
        -- добавьте стандартные статистики с именем "stats_host"
        stats.add_def_stats()
        -- общая конфигурация статистики
        local update = {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1,
                      ["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}}

        -- статистика по 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.add_stats_config("stats_arg",
            {selector={date="$date",key="$arg_client_type"}, update=update,
             indexes={{keys={'date', 'key'}, options={unique=true}},{keys={'key'}, options={}}} })

        -- статистика по uri и аргументам
        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={}}} })

        -- статистика по заголовку 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={}}} })

        -- статистика по заголовку 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 -- секунды
        local retry_interval = 0.2 -- секунды
        -- инициализируйте статистику и запустите таймер сброса.
        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';
        }
    }

Переменные

  • Модуль nginx_core поддерживает переменные: http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
  • Переменные этого модуля
    • date: текущая дата в формате: 1970-09-28
    • time: текущее время в формате: 12:00:00
    • year: текущий год
    • month: текущий месяц
    • day: текущая дата
    • hour: текущий час
    • minute: текущая минута
    • second: текущая секунда

Методы

Чтобы загрузить эту библиотеку,

вам нужно указать путь к этой библиотеке в директиве lua_package_path ngx_lua. Например:

http {
}

вы используете require для загрузки библиотеки в локальную переменную Lua:

local stats = require("resty.stats")

add_def_stats

синтаксис: stats.add_def_stats()

добавляет предопределенные конфигурации статистики, которые содержат:

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={}}
            },
    }
}
После вызова этого метода, когда вы используете метод stats.log(stats_name), вы можете использовать эти предопределенные статистики.

add_stats_config

синтаксис: stats.add_stats_config(stats_name, stats_config)

Добавляет элемент пользовательской статистической конфигурации, который содержит stats_name и конфигурацию статистики. * stats_name — это имя статистики, а также имя таблицы mongodb. Имя будет использоваться при вызове метода stats.log(stats_name). * stats_config используется для определения значений статистики. stats_config — это таблица, которая содержит некоторые поля: * selector — это оператор запроса mongodb. например: {date="$date",key="$host"} * update — это оператор обновления mongodb. например: {["$inc"]= {count=1, ["hour_cnt.$hour"]=1, ["status.$status"]=1, ["req_time.all"]="$request_time", ["req_time.$hour"]="$request_time"}} * indexes — это таблица, которая содержит все поля индекса.

Конфигурации selector и update могут использовать переменные.
Обратите внимание, что "$inc" не является переменной nginx, это оператор mongodb.

init

синтаксис: stats.init(mongo_cfg, flush_interval, retry_interval)

Инициализация статистической библиотеки. * mongo_cfg Конфигурация mongodb, содержит поля: * host хост mongodb * port порт mongodb * dbname имя базы данных mongodb. * flush_interval интервал времени для сброса данных в mongodb, единица времени — секунды. * retry_interval интервал времени повторной попытки при ошибке сброса, единица времени — секунды.

log

синтаксис: stats.log(stats_name)

Собирает указанную (по stats_name) статистическую информацию на этапе логирования.
* stats_name — это одно статистическое имя, добавленное с помощью stats.add_stats_config.
Если stats_name равно nil, метод логирования соберет всю статистику, которая была настроена.

Простой запрос и API

lua-resty-stats имеет простую страницу запроса и интерфейс API, которые можно использовать в следующих шагах: * добавьте конфигурацию location в 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';
}
  • Доступ к странице запроса. например, http://192.168.1.xxx/stats:

docs/query-page.png

  • Доступ к API:
## по дате
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=2020-02-20&limit=100
## по дате, сегодня
curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=today&limit=10

## по ключу (параметр даты игнорируется)
curl http://127.0.0.1:8020/stats/api?table=stats_uri&key=/path/to/uri
  • Ответ API будет выглядеть примерно так:
{
    "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"
        }
    ]
}

Если вы настроили какие-либо другие поля в вашем обновлении, это будет отличаться

Простой демонстрационный пример

Простой демонстрационный пример статистики

Вы можете включить его в nginx.conf, используя директиву include. Например: include /path/to/simple_stats.conf;

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-stats.