ES 查询
夜莺( Nightingale )ES日志告警规则

ES 日志告警可以通过对日志进行查询分析,来及时发现异常日志,并触发告警。
首先可以选择ES数据源,然后配置查询条件和告警条件,下面针对每个数字指向的功能,进行下详细说明
1 选择索引
支持多种配置方式
- 指定单个索引 gb 在 gb 索引中搜索所有的文档
- 指定多个索引 gb,us 在 gb 和 us 索引中搜索所有的文档
- 指定索引前缀 g*,u* 在任何以 g 或者 u 开头的索引中搜索所有的文档
2 设置过滤条件
目前支持的是 query string 语法
可以指定字段名称进行查询:
- status:active - 查询 status 字段包含 active 的记录
- title:(quick OR brown) - 查询 title 字段包含 quick 或 brown 的记录
- author:"John Smith" - 查询 author 字段包含完整短语 “John Smith” 的记录
支持使用 ? 和 * 通配符:
- qu?ck - ? 匹配单个字符
- bro* - * 匹配零个或多个字符
使用 ~ 运算符进行模糊匹配:
- quikc~ - 匹配与 quick 相似的词
- "fox quick"~5 - 短语查询中的词之间可以相隔最多5个位置
支持数值和日期范围:
- count:[1 TO 5] - 闭区间,包含1和5
- date:[2022-01-01 TO 2022-12-31]
- age:>=10 - 大于等于10
可以使用 AND、OR、NOT 等布尔操作符:
- quick AND brown - 同时包含两个词
- quick OR brown - 包含其中任意一个词
- quick NOT fox - 包含 quick 但不包含 fox
详细的语法可以参考 ES 文档
3 设置日期字段
点击可以选择日志中的日期字段,通过此字段来作为查询日志的时间范围的依据
4 设置查询日志的时间范围
如果是 5 分钟,表示在做告警查询时,会查询过去 5 分钟内的日志
5 数值提取
对日志进行统计分析的函数,比如 count、sum、avg、min、max 等
6 Group By
对日志进行分组,比如按照 host 字段进行分组,进行 count 统计, 查询到的结果会按照 host 字段进行分组
7 告警条件
统计分析得到的数值,会赋值给 告警条件中的 A、B、C 等变量,然后根据这些变量进行告警条件判断,比如 $A > 10 表示日志数量大于10条时触发告警
8 高级配置
在有的场景,日志会出现延迟,如果延迟3 分钟,查询最近 3 分钟的数据,会查不到数据,这时,可以在高级配置中,设置延迟查询时间,比如延迟 180s,表示查询查询的时候,把开始时间和终止时间都向前偏移 180s
使用样例
示例1:错误日志监控
- 索引:app-logs-*
- 查询条件:level:ERROR AND service:payment
- 时间范围:5分钟
- 数值提取:count()
- 告警条件:$A > 10 说明:监控支付服务在5分钟内的错误日志数量是否超过10条
示例2:接口响应时间监控
- 索引:nginx-access-*
- 查询条件:path:"/api/v1/order*" AND response_time:>500
- 时间范围:10分钟
- 数值提取:avg(response_time)
- Group By:path
- 告警条件:$A > 1000 说明:监控订单相关接口的平均响应时间是否超过1秒
示例3:异常状态码监控
- 索引:nginx-*
- 查询条件:status:[500 TO 599]
- 时间范围:15分钟
- 数值提取:count()
- Group By:host, status
- 告警条件:$A > 50 说明:按主机和状态码分组统计5xx错误,如果某台主机的某个状态码出现次数超过50次则告警
示例4:业务异常关键字监控
- 索引:business-logs-*
- 查询条件:message:(“timeout” OR “connection refused” OR “out of memory”)
- 时间范围:30分钟
- 数值提取:count()
- 告警条件:$A > 5 说明:监控包含特定错误关键字的日志数量
常见问题
Q1:ES 告警查询返回的字段怎么对应到告警表达式?
A:在告警规则里 ES 查询的"值字段"和"标签字段"决定 $A 的结构。例如查询返回 { "host": "n9e01", "error_count": 100 }:
- 值字段选
error_count→ 表达式里用$A.error_count; - 标签字段选
host→ 事件标签里会带host=n9e01。
Q2:ES 查询语句太复杂,怎么调试?
A:建议:
- 先在 Kibana / 直接 curl ES 把查询语法跑通;
- 复制到 n9e 的"数据预览"按钮验证返回结构;
- 再写告警表达式。
不要直接在告警规则页面调试 — 反馈循环太慢。
Q3:ES 8.x 跟 7.x 兼容吗?
A:n9e 用 ES Search API 标准查询,主流 ES 7.x / 8.x 都兼容。区别主要在 ES 8 默认开启 security + HTTPS — 数据源配置时注意账号密码和证书。
Q4:OpenSearch 能用 ES 告警查询类型吗?
A:可以 — OpenSearch fork 自 ES 7.10,DSL 兼容。n9e 也提供独立的 OpenSearch 数据源类型,优先选 OpenSearch。