Elasticsearch 查询
从实际使用场景出发,介绍夜莺 Elasticsearch 日志告警:索引、query string 过滤、时间字段、数值提取与 Group By 分组,以及日志延迟的处理。
概述
Elasticsearch 日志告警对日志做查询和统计分析,及时发现异常并触发告警——比如「支付服务 5 分钟内错误日志超过 10 条」。它的思路是:先用查询过滤出目标日志,再用统计函数把日志压成一个数值,最后拿这个数值判阈值。
| 字段 | 必填 | 说明 |
|---|---|---|
| 数据源类型 / 数据源 | 是 | 选 Elasticsearch 类型,并选中已接入的 ES 数据源 |
| 索引 | 是 | 两种指定方式:直接填索引(单索引 gb、多索引 gb,us、前缀通配 g*,u*),或选择已管理的索引模式 |
| 过滤条件 | 否 | query string 语法过滤日志(见下文) |
| 时间字段 | 是 | 以日志中的哪个日期字段作为查询时间范围依据 |
| 查询时间范围 | 是 | 查询过去多长时间的日志(如 5 分钟) |
| 数值提取 | 是 | 对过滤后的日志做统计:count / sum / avg / min / max 等,结果赋给 $A |
| Group By | 否 | 按字段分组,每个分组独立产生告警 |
| 告警条件 | 是 | 基于统计值判阈值,如 $A > 10 |
| 高级配置:查询延迟 | 否 | 日志有写入延迟时,把查询窗口整体前移 N 秒 |
下面按实际使用场景介绍。
场景一:错误日志数量告警
最典型的日志告警——统计一段时间内的错误日志条数,超阈值就告警。「支付服务 5 分钟内 ERROR 日志超过 10 条」:
- 索引:
app-logs-* - 过滤条件:
level:ERROR AND service:payment - 时间范围:5 分钟
- 数值提取:
count() - 告警条件:
$A > 10
配好后点「数据预览」验证能查到日志、统计值合理,再保存。
场景二:按维度分组告警(Group By)
想让每台主机、每个接口单独告警,用 Group By。「按主机和状态码统计 5xx 错误,某台机器某状态码超过 50 次就告警」:
- 索引:
nginx-* - 过滤条件:
status:[500 TO 599] - 时间范围:15 分钟
- 数值提取:
count() - Group By:
host, status - 告警条件:
$A > 50
分组后每个 (host, status) 组合独立判定,事件标签里带对应的 host、status。
场景三:统计类告警(响应时间、唯一值)
数值提取不止 count,还能算平均值、唯一值等。「订单接口平均响应时间超过 1 秒」:
- 索引:
nginx-access-* - 过滤条件:
path:"/api/v1/order*" AND response_time:>500 - 时间范围:10 分钟
- 数值提取:
avg(response_time) - Group By:
path - 告警条件:
$A > 1000
query string 过滤语法速查
过滤条件用 ES 的 query string 语法:
| 用途 | 写法 |
|---|---|
| 字段包含某值 | status:active |
| 字段匹配多值之一 | title:(quick OR brown) |
| 完整短语 | author:"John Smith" |
| 通配符 | qu?ck(单字符)、bro*(多字符) |
| 模糊匹配 | quikc~、"fox quick"~5 |
| 数值/日期范围 | count:[1 TO 5]、age:>=10 |
| 布尔组合 | quick AND brown、quick OR brown、quick NOT fox |
完整语法见 ES query string 文档。
日志延迟:查不到刚写入的日志怎么办
有些场景日志会延迟入库。如果延迟 3 分钟,而你查最近 3 分钟,就会查不到数据。在高级配置里设「查询延迟」(如 180s),查询会把开始和结束时间都向前偏移 180 秒,避开尚未落盘的时间窗口。
常见问题
Q1:ES 查询返回的字段怎么对应到告警表达式?
A:「数值提取」的结果就是 $A(如 count() → $A)。配了 Group By 时,分组字段成为事件标签,可在表达式里用 $A.<字段名> 引用。例如按 host 分组,事件标签带 host=n9e01。
Q2:查询语句太复杂,怎么调试?
A:先在 Kibana 或直接 curl ES 把 query string 跑通,再复制到 n9e 的「数据预览」验证返回结构,最后写告警条件。别直接在告警页反复试——反馈太慢。
Q3:ES 8.x 和 7.x 兼容吗?
A:n9e 用 ES 标准 Search API,主流 7.x / 8.x 都兼容。区别主要在 ES 8 默认开启 security + HTTPS,数据源配置时注意账号密码和证书。
Q4:OpenSearch 能用 ES 告警类型吗?
A:可以,OpenSearch fork 自 ES 7.10,DSL 兼容。n9e 也提供独立的 OpenSearch 数据源类型,优先选 OpenSearch。