日志告警
夜莺监控(Nightingale)支持日志告警,可以针对 ElasticSearch、Loki、ClickHouse 等数据源中的日志数据配置告警规则,周期性查询数据源,当数据源中的数据满足告警阈值时,触发告警。日志告警和指标告警的区别主要是查询条件的写法不同。其他各个字段都是通用的,请一定先阅读指标告警的内容,这里不再赘述。
ElasticSearch 告警原理
ElasticSearch 支持不同的查询语法,比如 DSL、KQL、Lucene、EQL、SQL 等,夜莺作为一个告警引擎,本质就是让用户配置查询语句,然后周期性查询数据源,对查到的数据做阈值判断,满足阈值条件就触发告警。
最先支持的查询语法是 Lucene,即 query_string 方式,查到数据之后做一个基本的统计,比如做一个计数,统计一下查到的日志行数,或者针对日志中的某个字段做统计,计算其平均、最大值、分位值等。然后把统计结果和用户配置的阈值进行对比,满足阈值条件就触发告警。
ElasticSearch 告警配置
首先是配置数据源,即当前告警规则要生效到哪些 ElasticSearch 数据源上,这个和指标告警本质是一样的逻辑。

🟢 数据源的类型那里,只有配置了对应类型的数据源,这里才会展示。即:如果你只配置了 Prometheus 类型的数据源,创建告警规则的时候,是看不到 ElasticSearch、TDEngine、ClickHouse 等其他类型的。
然后配置查询统计条件:

首先要选择索引,支持通配符,我上面配置的是 fc*
,然后最关键的是过滤条件,我上面配置的是 message.status:>100
,过滤 message.status
字段大于 100 的日志。这个过滤条件是 Lucene 的语法,和 Kibana 的查询语法是不一样的。日志必然有个日期字段,需要通过配置告知夜莺,哪个字段是日期字段,然后配置一个时间间隔,上图配置的是 5 分钟,夜莺就根据日期字段过滤最近 5 分钟的数据。
然后下面是统计分析方法,上例中选择的是 count
,表示统计日志行数,并且没有任何 Group By 条件。
最后是阈值判断,即把上面 count
的结果,和阈值做比对,如果符合条件就产生告警事件。上例中阈值是 > 0
就告警,即 count
的结果大于 0 就告警。
稍等片刻,我们可以看到产生的告警事件:

ElasticSearch 过滤条件
过滤条件(即上例中的 message.status:>100
)还有哪些写法?可以点击过滤条件旁边的那个小问号的图标,会在侧拉板中展示过滤条件的写法样例说明。一些典型的写法如下:
status:active
查询 status 字段包含 active 的记录title:(quick OR brown)
查询 title 字段包含 quick 或 brown 的记录author:"John Smith"
查询 author 字段包含完整短语 “John Smith” 的记录count:[1 TO 5]
数据范围查询,闭区间,即包含 1 和 5date:[2022-01-01 TO 2022-12-31]
日期范围查询age:>=10
数值大小过滤,大于等于 10
注意,为了避免犯错,建议字段后面的冒号:
前后都不要加空格。另外,不同的条件之间可以使用 AND、OR 连接,比如 status:active AND age:>=10
。更多写法请参考 ElasticSearch 的官方文档。