目标
- 后端任一接口一分钟内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的写法可参考
- 告警-实时监控Nginx访问日志
- 实时分析简介。支持的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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。