夜莺日志监控如何获取日志原文
夜莺支持指标监控和日志监控,其中日志监控主要是对接的 ElasticSearch 和 Loki,社区用的比较多的是 ElasticSearch,有不少朋友咨询,我在夜莺的日志监控中,怎么配置才能在告警事件中包含日志原文呢?
我们先看一下开源版夜莺的日志告警规则是如何配置的:
首先选择类型为 ElasticSearch,然后选择具体针对哪个数据源做告警,然后就是配置查询统计条件,查询统计条件最终会查到一个数值,然后在「阈值判断」中对这个数值做阈值比对,如果超过阈值就触发告警。
这个查询统计条件,最终会转换成 ElasticSearch 的 DSL 发起查询,ElasticSearch 查完之后返回数值,注意,ElasticSearch 返回的仅仅是一个数值,而不是日志原文。所以夜莺侧是拿不到日志原文的。
其实个人不建议在告警事件中包含日志原文,比如我想监控 Error 关键字,查询最近 5 分钟的日志,包含 Error 关键字的日志行有 1000 行,难道要把这 1000 行日志原文都塞到告警事件里吗?显然不现实。当然,有其他办法来做这个事情,但需要投入更多心智负担,开源版以简单实用为主,解决核心问题就可以了,所以就没有提供获取日志原文的功能。
如果就想要获取日志原文,可以参考 FlashDuty 的方案。
FlashDuty 也是支持多种不同的数据源,其中就包括 ElasticSearch。日志原文的内容太多,FlashDuty 建议只获取第一条样例日志,不要把日志全部塞到告警事件中。本质上,查询 ElasticSearch 「统计带有某个关键字的日志行数」和「获取包含某个关键字的第一条样例数据」是两个不同的查询请求,所以,一条规则中就要包含两个请求。相比开源夜莺,FlashDuty 额外支持了一个附加查询功能,可以在附加查询中额外配置一个查询条件来获取日志原文。
即:告警阈值的查询条件是统计带有 Error 关键字的日志行数,附加查询条件是获取包含 Error 关键字的第一条样例数据。
FlashDuty 的日志告警是免费的,如果你不想用 SaaS,就想自己实现这个功能怎么做?其实也可以,通过自定义脚本来接收告警事件,然后在收到告警事件之后判断这是哪一条告警规则,进而根据不同的告警规则去查询 ElasticSearch 获取日志原文,然后再发送告警通知。这可以看做是一个 Enrichment 的逻辑。
如果你是夜莺商业版客户,也可以看到附加查询功能,只不过夜莺商业版用的是 DSL 的方式配置告警规则,而 FlashDuty 用的是 SQL 语法。ElasticSearch 支持不同的语法,常用的是 DSL、SQL、EQL 等,在告警这个场景,基本都够用。
结语
日志告警是监控系统的重要一环,告警事件中包含日志原文是一个常见需求,但是不建议把日志原文全部塞到告警事件中,而是建议只获取第一条样例日志。如果你的日志监控工具不支持获取日志原文,可以考虑使用 FlashDuty,或者自己实现一个类似的功能。本文介绍的思路希望对你有所帮助。