跳转至

traffic-accounting: 实时监控 NGINX 的进出流量指标

安装

您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:

  • RedHat Enterprise Linux 7、8、9 和 10
  • CentOS 7、8、9
  • AlmaLinux 8、9
  • Rocky Linux 8、9
  • Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-traffic-accounting
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 nginx-module-traffic-accounting

通过在 /etc/nginx/nginx.conf 顶部添加以下内容来启用该模块:

load_module modules/ngx_http_accounting_module.so;

本文档描述了 nginx-module-traffic-accounting v2.0.4,于 2022 年 5 月 16 日发布。


实时监控 NGINX 的进出流量指标。

这是一个实时流量和状态码监控解决方案,相比其他实时日志分析解决方案,它需要更少的内存和 CPU。 对于基于 NGINX 配置逻辑(按位置 / 服务器 / 用户定义变量)的流量计量非常有用。

FOSSA Status Financial Contributors on Open Collective

为什么?

实时日志分析解决方案需要多台机器进行存储和分析,对于应用监控来说过于繁重。

需要一种经济高效的解决方案来监控应用请求的流量指标/状态。 该解决方案应准确、灵敏、稳健、足够轻量,并且不受流量高峰的影响。

它是如何工作的?

该模块在其上下文中保持一个由 accounting_id 标识的 metrics 列表。

当新的 request 访问服务器时,模块将尝试找到其 accounting_id,计算统计数据,并将其 aggregate 到相应的 metrics 中。

对于每个时间段(由 interval 定义),会触发一个定时器事件,这些 metrics 会被轮换并导出到日志文件或发送到远程日志服务器。

仪表盘

仪表盘 - 使用 Grafana 可视化 Accounting Dashboard

配置

编辑您的 nginx.conf。

示例:

http {
    # 开启计量功能
    accounting  on;
    accounting_log  logs/http-accounting.log;
    ...
    server {
        server_name example.com;

        accounting_id  $http_host;  # 通过变量设置 accounting_id 字符串

        location / {
            accounting_id  accounting_id_str;  # 通过位置设置 accounting_id 字符串

            ...
        }

        location /api {
            accounting_id  API_PC;   # 针对 PC

            if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
                accounting_id  API_MOBILE;   # 针对移动设备
            }

            ...
        }
    }

}

指令

accounting

语法: accounting on | off

默认: accounting off

上下文: http

accounting_log

语法: accounting_log \ [level]

默认: -

上下文: http

配置日志记录。

支持本地 file 路径,或 stderr,或 syslog:。 第二个参数是日志级别。 有关支持参数的更多详细信息,请参阅 nginx.org 的此页面

如果未指定,计量日志将写入 /dev/log

accounting_id

语法: accounting_id \

默认: accounting_id default

上下文: http, server, location, if in location

通过用户定义变量设置 accounting_id 字符串。

该字符串用于确定请求/会话应聚合到哪个 metrics

accounting_interval

语法: accounting_interval \

默认: accounting_interval 60

上下文: http

指定报告间隔。默认值为 60 秒。

accounting_perturb

语法: accounting_perturb on | off

默认: accounting_perturb off

上下文: http

随机将报告间隔从通常时间延迟 20%。

使用

此模块可以配置为将 metrics 写入本地文件、远程日志服务器或本地 syslog 设备。

开源日志聚合软件如 logstash 也支持 syslog 输入,这将帮助您建立一个中央日志服务器。 请参见 samples/logstash/ 以获取示例。 [推荐]

要使用本地 syslog 收集日志,请参考 Lax/ngx_http_accounting_module-utils 以获取示例配置/工具。

docker / docker-compose

要使用 docker-compose 演示,请运行

docker-compose build
docker-compose up -d

在浏览器中打开 Grafana(地址: http://localhost:3000)。

创建并配置 elasticsearch 数据源,选项如下:

Type: elasticsearch
URL: http://elasticsearch:9200
Version: 5.6+
Min time interval: 1m

然后从 samples/accounting-dashboard-grafana.json 导入计量仪表盘。

Metrics 日志格式

## HTTP
2018/05/14 14:18:18 [notice] 5#0: pid:5|from:1526278638|to:1526278659|accounting_id:HTTP_ECHO_HELLO|requests:4872|bytes_in:438480|bytes_out:730800|latency_ms:0|upstream_latency_ms:0|200:4872
2018/05/14 14:18:18 [notice] 5#0: pid:5|from:1526278638|to:1526278659|accounting_id:INDEX|requests:4849|bytes_in:421863|bytes_out:1857167|latency_ms:0|upstream_latency_ms:0|301:4849

## Stream
2018/05/14 14:18:22 [notice] 5#0: pid:5|from:1526278642|to:1526278659|accounting_id:TCP_PROXY_ECHO|sessions:9723|bytes_in:860343|bytes_out:2587967|latency_ms:4133|upstream_latency_ms:3810|200:9723

日志输出的每一行包含特定 accounting_idmetrics,其中包含一系列键值对。

键名 值的含义
pid nginx 工作进程的 pid
from / to 指标在这两个时间戳之间的 period 被收集
accounting_id accounting_id 指令设置的计量单位标识
requests 当前周期内处理的总请求数(仅适用于 HTTP 模块)
sessions 当前周期内处理的总会话数(仅适用于 Stream 模块)
bytes_in 服务器接收的总字节数
bytes_out 服务器发送的总字节数
latency_ms 所有请求/会话的 $session_time 之和,以 毫秒 为单位
upstream_latency_ms $upstream_response_time 的总和,以 毫秒 为单位
200 / 302 / 400 / 404 / 500 ... 状态码为 200/302/400/404/500 等的请求/会话计数。注意 HTTP 代码和流代码之间的差异

配置示例

http {
  accounting        on;
  accounting_log    logs/http-accounting.log;
  accounting_id     $hostname;

  ...
}

stream {
  accounting        on;
  accounting_log    logs/stream-accounting.log;
  accounting_id     $hostname;

  ...
}

可视化

使用 KibanaGrafana 进行可视化非常简单。 请参见 samples/ 以获取示例。

分支

  • master : 主要开发分支。
  • tag v0.1 或 v2-freeze-20110526 : 旧版发布。适用于 nginx 版本(0.7.xx, 0.8.xx),未测试 nginx 0.9。与 nginx 1.0.x 以上版本不兼容。

GitHub

您可以在 nginx-module-traffic-accounting 的 GitHub 仓库 中找到此模块的其他配置提示和文档。