使用 LAL 收集并分析 Nginx access log

标签: lal 分析 nginx | 发表时间:2023-11-03 16:58 | 作者:SkyWalking中文站
出处:https://juejin.cn/backend

本篇文章演示如何将 Nginx access log 收集到 SkyWalking 中,并通过 LAL 进行指标分析

本文由社区贡献者  魏翔 撰写, SkyWalking 社区帐号发表

背景介绍

Nginx access log 中包含了丰富的信息,例如:日志时间、状态码、响应时间、body 大小等。通过收集并分析 access log,我们可以实现对 Nginx 中接口状态的监控。

在本案例中,将由 fluent-bit 收集 access log,并通过 HTTP 将日志信息发送给 SkyWalking OAP Server 进行进一步的分析。

环境准备

实验需要的 Nginx 及 Fluent-bit 相关配置文件都被上传到了 Github,有需要的读者可以自行 git clone 并通过 docker compose 启动,本文中将介绍配置文件中几个关键点。

Nginx日志格式配置

LAL 目前支持 JSON、YAML 及 REGEX 日志解析,为了方便获取到日志中的指标字段,我们将 Nginx 的日志格式定义为 JSON.

      http {
        ...
        ...

        log_format  main  '{"remote_addr": "$remote_addr",'
                '"remote_user": "$remote_user",'
                '"request": "$request",'
                '"time": "$time_iso8601",'
                '"status": "$status",'
                '"request_time":"$request_time",'
                '"body_bytes_sent": "$body_bytes_sent",'
                '"http_referer": "$http_referer",'
                '"http_user_agent": "$http_user_agent",'
                '"http_x_forwarded_for": "$http_x_forwarded_for"}';

        access_log  /var/log/nginx/access.log  main;
        
        ...
        ...
    }

Fluent bit Filter

我们通过 Fluent bit 的 lua filter 进行日志格式的改写,将其调整为 SkyWalking 所需要的格式,record的各个字段含义如下:

  • body:日志内容体
  • service:服务名称
  • serviceInstance:实例名称
  function rewrite_body(tag, timestamp, record)
    local newRecord = {}
    newRecord["body"] = { json = { json = record.log } }
    newRecord["service"] = "nginx::nginx"
    newRecord["serviceInstance"] = "localhost"
    return 1, timestamp, newRecord
end

OAP 日志分析

LAL定义

在 filter 中,我们通过条件判断,只处理 service=nginx::nginx 的服务,其他服务依旧走默认逻辑:

第一步,使用 json 指令对日志进行解析,解析的结果会被存放到 parsed 字段中,通过 parsed 字段我们可以获取 json 日志中的字段信息。

第二步,使用 timestamp 指令解析 parsed.time 并将其赋值给日志的 timestamp 字段,这里的 time 就是access log json 中的 time。

第三步,使用 tag 指令给日志打上对应的标签,标签的值依然可以通过 parsed 字段获取。

第四步,使用 metrics 指令从日志中提取出指标信息,我们共提取了四个指标:

  • nginx_log_count:Nginx 每次请求都会生成一条 access log,该指标可以帮助我们统计 Nginx 当前的请求数。
  • nginx_request_time:access log 中会记录请求时间,该指标可以帮助我们统计上游接口的响应时长。
  • nginx_body_bytes_sent:body 大小指标可以帮助我们了解网关上的流量情况。
  • nginx_status_code:状态码指标可以实现对状态码的监控,如果出现异常上涨可以结合 alarm 进行告警。
  rules:
  - name: default
    layer: GENERAL
    dsl: |
      filter {
        if (log.service == "nginx::nginx") {
          json {
            abortOnFailure true
          }
    
          extractor {
            timestamp parsed.time as String, "yyyy-MM-dd'T'HH:mm:ssXXX"
            tag status: parsed.status
            tag remote_addr: parsed.remote_addr
      
            metrics {
              timestamp log.timestamp as Long
              labels service: log.service, instance: log.serviceInstance
              name "nginx_log_count"
              value 1
            }
            metrics {
              timestamp log.timestamp as Long
              labels service: log.service, instance: log.serviceInstance
              name "nginx_request_time"
              value parsed.request_time as Double
            }
            metrics {
              timestamp log.timestamp as Long
              labels service: log.service, instance: log.serviceInstance
              name "nginx_body_bytes_sent"
              value parsed.body_bytes_sent as Long
            }
            metrics {
              timestamp log.timestamp as Long
              labels service: log.service, instance: log.serviceInstance, status: parsed.status
              name "nginx_status_code"
              value 1
            }
          }
        }
      
        sink {
        }
      }

经过 LAL 处理后,我们已经可以在日志面板看到日志信息了,接下来我们将对 LAL 中提取的指标进行进一步分析:

image.png

MAL定义

在 MAL 中,我们可以对上一步 LAL 中提取的指标进行进一步的分析聚合,下面的例子里:

nginx_log_count、nginx_request_time、nginx_status_code 使用 sum 聚合函数处理,并使用 SUM 方式 downsampling,

nginx_request_time 使用 avg 聚合函数求平均值,默认使用 AVG 方式 downsampling。

完成聚合分析后,SkyWalking Meter System 会完成对上述指标的持久化。

  expSuffix: service(['service'], Layer.GENERAL)
metricPrefix: nginx
metricsRules:
  - name: cpm
    exp: nginx_log_count.sum(['service']).downsampling(SUM)
  - name: avg_request_time
    exp: nginx_request_time.avg(['service'])
  - name: body_bytes_sent_count
    exp: nginx_body_bytes_sent.sum(['service']).downsampling(SUM)
  - name: status_code_count
    exp: nginx_status_code.sum(['service','status']).downsampling(SUM)

最后,我们便可以来到 SkyWalking UI 页面新建 Nginx 仪表板,使用刚刚 MAL 中定义的指标信息创建 Nginx Dashboard(也可以通过上文提到 仓库中的 dashboard.json 直接导入测试):

image.png

参考文档

相关 [lal 分析 nginx] 推荐:

使用 LAL 收集并分析 Nginx access log

- - 掘金 后端
本篇文章演示如何将 Nginx access log 收集到 SkyWalking 中,并通过 LAL 进行指标分析. 本文由社区贡献者  魏翔 撰写, SkyWalking 社区帐号发表. Nginx access log 中包含了丰富的信息,例如:日志时间、状态码、响应时间、body 大小等.

goaccess分析nginx日志

- - C1G军火库
GoAcces是一款实时日志分析工具. 目前,我们可以通过这款软件查看的统计信息有:. 静态web请求,如图片、样式表、脚本等. 支持超大日志(分析速度很快). GoAccess的基本语法如下:. -b – 开启流量统计,如果希望加快分析速度不建议使用该参数. -s – 开启HTTP响应代码统计. -a – 开启用户代理统计.

shell脚本分析nginx日志

- - 互联网 - ITeye博客
以下脚本都是基于上面日志格式的,如果你的日志格式不同需要调整awk后面的参数. 分析日志中的UserAgent. 上面的脚本将分析出日志文件中最多的20个UserAgent. 分析日志中那些IP访问最多. 分析日志中那些Url请求访问次数最多. 已有 0 人发表留言,猛击->> 这里<<-参与讨论.

nginx源码分析--GDB调试

- - CSDN博客架构设计推荐文章
利用gdb[i]调试nginx[ii]和利用gdb调试其它程序没有两样,不过nginx可以是daemon程序,也可以以多进程运行,因此利用gdb调试和平常会有些许不一样. 当然,我们可以选择将nginx设置为非daemon模式并以单进程运行,而这需做如下设置即可:. master_process off; 这是第一种情况:.

shell 分析nginx日志 - 简书

- -
通过日志查看当天访问页面排前10的. 通过日志查看当天ip连接数,统计ip地址的总连接数. 通过日志查看当天访问次数最多的10个IP ,只需要在上一个命令后加上head命令. 通过日志查看当天指定ip访问次数过的url和访问次数. 通过日志查看当天访问次数最多的时间段.

Nginx日志分析常用脚本 |

- -
IP相关统计 统计IP访问量(独立ip访问数量). 查看某一时间段的IP访问量(4-5点). 查看访问最频繁的前100个IP. 查询某个IP的详细访问情况,按访问频率排序. 页面访问统计 查看访问最频的页面(TOP100). 查看访问最频的页面([排除php页面】(TOP100). 查看页面访问次数超过100次的页面.

[转]三大WEB服务器对比分析 (apache ,lighttpd,nginx)

- - junecauzhang的专栏
阿呆软件工作室 › 编程资料 › 转载文章 › 三大WEB服务器对比分析 (apache ,lighttpd,nginx). 三大WEB服务器对比分析 (apache ,lighttpd,nginx). 一.软件介绍(apache   lighttpd  nginx). Lighttpd是一个具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点.

Nginx 502 Bad Gateway问题分析与踩过的坑 - 凝雨 - Yun

- -
我相信使用Nginx的都会遇到过502 504 这种bad gateway错误,下面我把碰到这个问题分析过程记录并分享出来. 从字面上的意思理解,nginx从upstream没有接受到信息,第一感觉就是连接被close. 超时的话一般错误信息是 timeout. 下面是尝试解决这个问题尝试过的手段.

nginx配置ssl

- - 邢红瑞的blog
先生成网关证书 ,仿照CA模式.

Nginx安装

- - 企业架构 - ITeye博客
nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译环境可以使用以下指令. centos平台编译环境使用如下指令. 一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩.