美文网首页
通过 Prometheus 实现 OpenResty 的流量监控

通过 Prometheus 实现 OpenResty 的流量监控

作者: 猴子精h | 来源:发表于2021-09-14 20:05 被阅读0次

    监控方案

    Prometheus 实现 OpenResty 的流量监控目前有两个方案:

    1. OpenResty 部署虚拟主机流量统计模块 nginx-module-vts,它支持 Prometheus 采集的格式,它能对每个虚拟主机进行流量统计。
    image.png
    1. 在 OpenResty 中自己通过 Lua 实现,并通过 nginx-lua-prometheus 库暴露出指标给 Prometheus 采集。

    通过 Lua 脚本实现 OpenResty 虚拟主机流量统计

    流量统计需要在 OpenResty 的 Log 阶段实现,Log 处理阶段与流量相关的变量:

    • $bytes_sent: 流出流量,发送给客户端的总字节数;
    • $request_length: 流入流量,请求的长度(包括请求行,请求头和请求正文);

    nginx.conf:

    error_log logs/error.log warn;
    
    events {
        worker_connections 1024;
    }
    
    
    http {
        lua_shared_dict prometheus_metrics 10M;
        lua_package_path "lualib/nginx-lua-prometheus/?.lua;;";
    
        init_worker_by_lua_block {
            -- 初始化 prometheus
            prometheus = require("prometheus").init("prometheus_metrics")
            -- 创建 prometheus 指标
            metric_bandwidth = prometheus:counter("bandwidth",
                "Total bandwidth in bytes per virtual host in Nginx",
                {"type", "host"}
            )
        }
    
        log_by_lua_block {
            local body_size = ngx.var.bytes_sent
            local request_size = ngx.var.request_length
            local virtul_host = ngx.var.host
            -- 统计 in/out 流量
            metric_bandwidth:inc(tonumber(request_size), {"in", virtul_host})
            metric_bandwidth:inc(tonumber(body_size), {"out", virtul_host})
        }
    
    
        server {
            listen 8080;
    
            location / {
                content_by_lua_block {
                    ngx.say("hello, world")
                }
            }
        }
    
        server {
            listen 9145;
            allow 127.0.0.1;
            deny all;
    
            location /metrics {
                content_by_lua_block {
                    prometheus:collect()
                }
            }
        }
    }
    

    这样就能通过 http://<you_openresty_ip>:9145/metrics 获取到虚拟主机流量的相关指标了

    总结

    使用 nginx-module-vts 的方法优点是不需要自己写代码,且功能丰富,不过需要重新编译安装 Nginx。使用 nginx-lua-prometheus + Lua 脚本的方式部署相对简单,且灵活度较高。不过,最终使用那种方案需要根据当前各自的场景,使用之前一定要先压测!!

    参考

    相关文章

      网友评论

          本文标题:通过 Prometheus 实现 OpenResty 的流量监控

          本文链接:https://www.haomeiwen.com/subject/dgjlgltx.html