Elasticsearch 日志监控方案
现在大部分公司都会选择将应用、中间件、系统等日志存储在 Elasticsearch 中,如何发现日志中的异常数据并且及时告警通知就显得十分重要。本文将会介绍两种主流的日志监控方案,分别是 Yelp 公司开源的 ElastAlert 和 Elastic 官方的商业版功能 Watcher。
如下图所示,日志数据源是一台 Nginx 服务器,在该服务器上安装 Filebeat 收集 Nginx 日志并输出到 Elasticsearch,之后会分别演示用 ElastAlert 和 Watcher 两种方案监控日志并进行告警。
部署 Nginx
安装依赖
下载安装包
编译安装
配置 Nginx
编辑配置文件 /usr/local/nginx/conf/nginx.conf,在 Nginx 上配置一个静态网页服务。
启动 Nginx:
访问 Nginx:
部署 Filebeat
下载并安装 Filebeat。
编辑 /etc/filebeat/filebeat.yml 配置文件,读取 Nginx 日志文件输出到 Elasticsearch 的 nginx 索引中,后缀是当前日期。
启动 Filebeat:
ElastAlert
ElastAlert 是 Yelp 公司开源的一套用 Python 写的 Elasticsearch 告警框架,可以从 Elasticsearch 当中查询出匹配规则的数据进行告警。
ElastAlert 有以下特点:
支持多种匹配规则(频率、阈值、数据变化、黑白名单、变化率等)。
支持多种告警类型(邮件、HTTP POST、自定义脚本等)。
支持用户自定义规则和告警类型。
匹配项汇总报警,重复告警抑制,告警失败重试和过期。
可用性强,状态信息保存到 Elasticsearch 的索引中。
支持调试和审计。
部署 Elastalert
安装 Python
检查 Python 版本:
安装依赖
安装 Elastalert
配置 Elastalert
克隆代码到本地:
我们可以在 ElastAlert 源码文件的根目录下找到一个叫做 config.yaml.example 的文件,修改文件名为 config.yaml:
创建存放规则的目录。
编辑 config.yaml 文件,修改主配置:
创建 rules/nginx.yaml 文件,编辑 rule:
规则内容为:在 1 分钟内如果查询 nginx-* 索引的 message 字段匹配 到 error 5 次就触发告警,往指定的 URL 发送一个 HTTP POST 请求。
https://webhook.site 网站提供了测试的 Webhook 接口,每个人的 URL 都是独立的,拷贝这个 URL 复制到 http_post_url 中。
ElastAlert 会把执行记录存放到一个索引中,可以方便我们审核和调试。使用以下命令创建这个索引的,默认情况下,索引名叫 elastalert_status。
发送 2 个请求,1 个是正确请求,1 个是错误请求。
在 Kibana 上可以看到 Nginx 的日志,错误请求会在 access.log 和 error.log 各写一次,因此这里看到 3 条记录。
运行 elastalert-test-rule 命令检验配置文件是否正确并且可以看到规则匹配的次数,elastalert-test-rule 命令并不会真正触发告警。
1 分钟内连续发送错误请求 5 次达到触发告警的阈值:
此时可以看到发送的告警格式。
使用以下命令运行 elastalert,可以看到触发了告警:
访问 https://webhook.site 网站可以看到 ElastAlert 发送的 HTTP POST 请求。
查询 elastalert_status 索引可以看到 ElastAlert 的执行记录。
Watcher
Watcher 是 Elastic 官方提供的一个对日志数据监控和报警的功能,Watcher 属于收费功能,我们可以在 License Management 中开启 30 天的试用。
Watcher 由以下 5 个部分组成:
trigger:定义 watcher 触发的时间或者周期。
input:定义数据的来源,可以是一个索引或者 HTTP 请求的结果等等。如果没有设置输入将为空。
condition:定义执行 action 触发的条件。如果没有设置默认总是触发 action。
transform(可选):修改 watcher 的 payload。
actions:定义执行的动作,例如 email,webhook,index,logging,slack 等等。
创建 1 个 Watcher:
trigger:每分钟运行一次。
input:通配符匹配 nginx-* 的索引,查询 message 字段中的 error 关键字,每次针对在过去 5 分钟内发生的事件来进行查询。
condition:如果在查询结果中,匹配到 1 次,就触发 action。
action:向指定 URL 发送一个 HTTP POST 请求。
查看刚刚创建的 watcher:
1 分钟内连续发送 5 次错误请求。
查看 watcher 状态,可以看到触发了 action。
访问 https://webhook.site 可以看到最新的 Webhook 事件已经被触发了,而且它的 Raw Content 和我们之前定义的 body 格式是一致的。
如果我们设置的 watcher 间隔时间比较久,Elasticsearch 为了方便我们测试,提供了_execute 接口,通过执行下面命令可以立即运行一下我们的 watcher。
参考资料
https://zhuanlan.zhihu.com/p/386722918
https://elastalert.readthedocs.io/
https://www.elastic.co/guide/en/elasticsearch/reference/7.14/xpack-alerting.html
https://blog.csdn.net/UbuntuTouch/article/details/106298651
https://elasticstack.blog.csdn.net/article/details/105340379
https://elasticstack.blog.csdn.net/article/details/103820572
欢迎关注
版权声明: 本文为 InfoQ 作者【Se7en】的原创文章。
原文链接:【http://xie.infoq.cn/article/3a3aa5fdc6f8d153f013ff298】。文章转载请联系作者。
评论