2小时快速搭建后端接口报警系统(基于阿里云日志服务分析nginx访问日志)

目标

  • 后端任一接口一分钟内5xx响应超过一定的量,马上收到报警提示
  • 报警及慢接口有详细列表可以查看
  • 低成本。几年前公司的日志报警系统是自研的,开发成本比较高,也没有达到阿里云日志服务这种产品化程度

机器部署情况

  • 阿里云EC服务器

功能概述

  • 阿里云日志服务,采集并分析nginx访问日志;写日志分析SQL,每分钟调度执行,符合条件就触发报警;
  • 根据响应状态码提供:接口5xx响应报警、接口4xx响应报警;报警通知方式为钉钉群机器人,5xx跟4xx响应分别通知到专用的后端跟前端同学群;
  • 修改日志分析SQL,在专用dashboard展示相关报警请求的详细信息列表
  • 根据响应时间提供:慢响应请求列表,同样放到dashboard

效果图

钉钉群报警【c是符合条件的个数,st是响应状态码】
图片描述

阿里云日志服务仪表盘-5xx报警接口详情
图片描述

操作步骤

配置日志采集

  • 新建Project;新建Logstore;
  • 配置nginx日志采集;

    • 日志路径:/path_to_logs/**/access.log
    • 模式:nginx配置;从线上nginx.conf文件里拷贝 log_format main,配置到页面;
    • Topic生成方式:文件路径正则;自定义正则:/path_to_logs/([^/]+)/access.log,正好把域名提取出来。可参考生成主题
    • Logtail机器组:配置nginx机器内网IP
  • nginx机器安装Logtail采集器;
  • 参考文档

配置日志分析SQL及报警

  • 日志库》查询分析》查询,可以写SQL实时查询/分析,然后另存为告警
  • 配置告警条件
  • 配置告警通知。一个告警可配置多个通知列表,可以同时通知到钉钉群跟短信

5xx报警SQL

  • 为了方便查看具体的错误接口,基于uri分组统计并报警,报警内容里包含uri信息
  • 为了方便确认严重程度,报警内容里包含响应状态码
__topic__:www.xyz.com and status in [500 600) | select count(1) as c, avg(status) as st, case when strpos(request_uri, '?') > 0 then split_part(request_uri, '?', 1) else request_uri end as uri group by uri having count(1)>=5 order by count(1) desc

分析SQL的写法可参考

告警条件配置
图片描述

告警通知配置
图片描述

上面的配置图可能会变,这个产品一直在进化,18年12月的时候发现有一次大的改版。

dashboard相关报警请求的详细信息列表SQL:

__topic__:www.xyz.com and status in [500 600) | select time_local, status, upstream_addr, __topic__ as vhost, case when strpos(request_uri, '?') > 0 then split_part(request_uri, '?', 1) else request_uri end as uri order by time_local desc

dashboard慢响应分析SQL:

__topic__:www.xyz.com and request_time > 0.3 | select count(1) as count, avg(request_time) as avg_request_time, min(__topic__) as vhost, case when strpos(request_uri, '?') > 0 then split_part(request_uri, '?', 1) else request_uri end as uri group by uri order by avg_request_time desc
阅读 832发布于 3月13日
推荐阅读
sandynz.tech
用户专栏

Java后端,一线经验

0 人关注
5 篇文章
专栏主页
目录