使用ElastAlert+ELK实现日志监控钉钉告警
介绍
目前公司使用ELK做日志收集和展示分析.所以想对一些关键日志进行监控告警.比如Nginx的5xx日志,比如php-fpm的Fatal严重错误日志等.通过监控ES的日志数据,然后使用Python调用钉钉接口来实现日志的告警
ElastAlert介绍
ElastAlert是一个开源的工具,用于从Elastisearch中检索数据,并根据匹配模式发出告警.github项目地址如下:https://github.com/Yelp/elastalert
官方文档如下:https://elastalert.readthedocs.io/en/latest/elastalert.html
它支持多种监控模式和告警方式,具体可以查阅Github项目介绍.但是自带的ElastAlert并不支持钉钉告警,在github上有第三方的钉钉python项目.地址如下:https://github.com/xuyaoqiang/elastalert-dingtalk-plugin
第三方的钉钉告警插件并没有艾特相关人员的功能,所以我再此基础上进行了二次开发,增加了这个功能
ElastAlert安装
新版的ElastAlert不支持python2了.所以需要安装Python3环境
- 安装依赖
1 | sudo yum -y install python3 python3-devel python3-libs python3-setuptools git gcc |
如果是Ubuntu系统:
1 | sudo apt update |
- 安装elastalert模块
1 | pip3 install elastalert -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com |
- 克隆ElastAlert项目
1 | git clone https://github.com/Yelp/elastalert.git |
- 安装模块
1 | cd /data/elastalert/ |
- 创建ElastAlert的索引
1 | sudo elastalert-create-index --index elastalert |
- 修改ElastAlert的配置文件
1 | cp config.yaml.example config.yaml |
- 配置钉钉报警
1 | git clone https://github.com/xuyaoqiang/elastalert-dingtalk-plugin.git |
Rule规则
官方支持很多Rule模式,在example_rules
目录下也有很多参考Rule可以参考.一般常用的是类型(type)是frequence
rule的yaml配置要放在config.yml
配置文件中定义的目录下,我这里是rule目录.
下面这个rule是监控Nginx的5XX状态码,并且调用钉钉告警
1 | #rule名字,必须唯一 |
测试Rule文件是否正确.在elastalert目录下执行下个命令可以测试某个rule是否正常工作
1 | /usr/local/bin/elastalert-test-rule --config config.yaml rule/nginx.yaml |
这一步可能会有一些报错情况.一般都是扩展模块版本或者依赖关系的问题.比如下面这个问题,就需要执行pip3 install jira==2.0.0
:
1 | Traceback (most recent call last): |
执行ElastAlert
一切没问题后,就可以执行ElastAlert.如果是针对单个Rule执行就使用下列命令.(在ElastAlert目录下)
1 | [root@idc-function-elk10 elastalert]# python3 -m elastalert.elastalert --verbose --rule /data/elastalert/rule/nginx.yaml |
等待几秒钟后,钉钉会收到告警(我这里用的是200状态码测试).报警内容是Rule配置文件中自定义的格式和内容
Rule2. 监控php-fpm的Fatal错误信息
fpm的错误日志也收集到了ELK中.我们期望只要pfm日志中出现”Fatal”关键字错误信息就立即告警.最初计划是用ElastAlert的黑名单(blacklist)类型的Rule.但是由于fpm的错误日志没有解析,而是直接保存原始日志,所以不符合要求.
参考github上我提的ISSUE:balacklist query hits but no matches no alerts
也可以用Any类型的type.Rule文件如下:
1 | [root@idc-function-elk10 elastalert]# sed '/^#/d' rule/php-fpm.yaml | sed '/^$/d' |
启动ElastAlert
开启一个Screen然后,使用nohup挂起执行.
1 | nohup python3 -m elastalert.elastalert --verbose & |
钉钉告警二次开发
当前日志告警只是简单的发送到告警群,由于没有艾特相关人员,所以大家还是无法第一时间看到告警信息,所以需要增加这个功能,大致思路是根据业务线来艾特相关负责人.
但是中台的业务线有些复杂,因为不同的项目负责人不同.所以需要特殊对待.
准备工作:
日志告警中必须含有以下几个字段:
- 业务线
- 日志类型
- 如果是Nginx日志,则需要有Nginx的域名
修改原生的钉钉告警的alert动态方法,内容如下
1 | import re |