lua-resty-stats

基于 ngx_lua 的 Nginx 统计模块,统计键值可配置,可以使用 Nginx 核心变量和该模块的变量。统计结果存储在 MongoDB 中。(github.com/jie123108/lua-resty-stats)

$ opm get jie123108/lua-resty-stats

名称

lua-resty-stats - 是一个基于 ngx_lua 的 Nginx 统计模块,统计键值可配置,可以使用 Nginx 核心变量和该模块的变量。统计结果存储在 MongoDB 中。

概要

        #set ngx_lua's environment variable:
        lua_package_path '/path/to/lua-resty-stats/lib/?.lua;/path/to/lua-resty-stats/lib/?/init.lua;/path/to/lua-resty-stats/view/?.lua;;';
        # 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 -- second
            local retry_interval = 0.2 -- second
            -- 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';
            }
        }

变量

  • Nginx 核心模块支持的变量:https://nginx.ac.cn/en/docs/http/ngx_http_core_module.html#variables

  • 该模块的变量

    • date: 当前日期,格式为:1970-09-28

    • time: 当前时间,格式为:12:00:00

    • year: 当前年份

    • month: 当前月份

    • day: 当前日期

    • hour: 当前小时

    • minute: 当前分钟

    • second: 当前秒数

方法

要加载此库,

您需要在 ngx_lua 的 lua_package_path 指令中指定此库的路径。例如

    http {
       lua_package_path '/path/to/lua-resty-stats/lib/?.lua;/path/to/lua-resty-stats/lib/?/init.lua;/path/to/lua-resty-stats/view/?.lua;;';
    }

您使用 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 配置的自定义统计配置项。

  • 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 包含所有索引字段的表。

selectorupdate 配置可以使用 变量。<br/> 请注意,“$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 指定)统计信息。<br/>

  • stats_name 是一个由 stats.add_stats_config 添加的统计名称。<br/> 如果 stats_name 为空,则 log 方法将收集所有已配置的统计信息。

简单查询和 API

lua-resty-stats 带有一个简单的查询页面和 API 接口,可以使用以下步骤

  • 在 nginx.conf 中添加 location 配置

    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

    # by date
    curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=2020-02-20&limit=100
    # by date, today
    curl http://127.0.0.1:8020/stats/api?table=stats_uri&date=today&limit=10
    
    # by key(The date parameter is ignored.)
    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"
            }
        ]
    }

如果您在 update 中配置了其他字段,这将有所不同

简单演示

简单的统计演示

您可以使用 include 指令将其包含在 nginx.conf 中。例如:include /path/to/simple_stats.conf;

作者

jie123108 <jie123108@163.com>。

版权和许可

该模块在 BSD 许可下授权。

版权所有 (C) 2020,由 jie123108 <jie123108@163.com>

保留所有权利。

在满足以下条件的情况下,允许以源代码和二进制形式重新分发和使用本软件,无论是否修改。

  • 重新分发的源代码必须保留上述版权声明、此条件列表以及以下免责声明。

  • 以二进制形式重新分发的软件必须在随分发提供的文档和/或其他材料中复制上述版权声明、此条件列表以及以下免责声明。

本软件由版权持有人和贡献者“按原样”提供,任何明示或暗示的保证,包括但不限于适销性和特定用途适用性的默示保证,均不作任何保证。在任何情况下,版权持有人或贡献者均不对因使用本软件而引起的任何直接的、间接的、附带的、特殊的、示范性的或后果性的损害(包括但不限于替代商品或服务的采购;使用损失、数据或利润损失;或业务中断)负责,无论其因何种责任理论而产生,无论是合同、严格责任或侵权(包括疏忽或其他原因)引起的,即使已告知可能发生此类损害。

作者

jie123108@163.com

许可

2bsd

依赖项

openresty >= 1.9.3.1

版本

  • 基于 ngx_lua 的 Nginx 统计模块,统计键值可配置,可以使用 Nginx 核心变量和该模块的变量。统计结果存储在 MongoDB 中。(github.com/jie123108/lua-resty-stats) 2020-11-28 14:35:20
  • 基于 ngx_lua 的 Nginx 统计模块,统计键值可配置,可以使用 Nginx 核心变量和该模块的变量。统计结果存储在 MongoDB 中。(github.com/jie123108/lua-resty-stats) 2019-05-09 10:38:15
  • 基于 ngx_lua 的 Nginx 统计模块,统计键值可配置,可以使用 Nginx 核心变量和该模块的变量。统计结果存储在 MongoDB 中。 2016-11-11 15:42:27