OpenSearch 查询
从实际使用场景出发,介绍夜莺 OpenSearch 日志告警:索引、query string 过滤、数值提取与 Group By 分组,以及与 Elasticsearch 配置的差异。
概述
OpenSearch fork 自 Elasticsearch 7.10,查询 DSL 兼容,因此夜莺的 OpenSearch 告警配置方式与 Elasticsearch 告警 几乎完全一致:先用查询过滤出目标日志,再用统计函数把日志压成一个数值,最后拿这个数值判阈值。
唯一的差异:Elasticsearch 可以在「索引」和「索引模式」两种方式之间选择,而 OpenSearch 只支持直接填写索引(不提供索引模式选项)。
| 字段 | 必填 | 说明 |
|---|---|---|
| 数据源类型 / 数据源 | 是 | 选 OpenSearch 类型并选中已接入的实例 |
| 索引 | 是 | 直接填索引名,支持通配符,如 log-*;多索引用逗号分隔 |
| 过滤条件 | 否 | query string 语法过滤日志 |
| 时间字段 | 是 | 以日志中的哪个日期字段作为查询时间范围依据 |
| 查询时间范围 | 是 | 查询过去多长时间的日志 |
| 数值提取 | 是 | 对过滤后的日志做统计: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*" - 数值提取:
avg(response_time) - Group By:
path - 告警条件:
$A > 1000
query string 过滤语法
与 Elasticsearch 完全一致(字段匹配、通配符、范围、布尔组合等),速查表见 Elasticsearch 查询 的对应章节。
常见问题
Q1:OpenSearch 和 Elasticsearch 的告警配置有什么不同?
A:只有索引的指定方式不同——OpenSearch 只能直接填索引名(支持通配符),没有「索引模式」选项。其余字段、语法、判定逻辑完全一致。
Q2:已有的 Elasticsearch 数据源能直接连 OpenSearch 吗?
A:建议使用独立的 OpenSearch 数据源类型。虽然 DSL 兼容,但用对应类型能获得更贴合的行为与后续兼容性保障。
Q3:查询语句怎么调试?
A:先在 OpenSearch Dashboards 或直接 curl 把 query string 跑通,再复制到 n9e 的「数据预览」验证返回结构,最后写告警条件。
Q4:日志有延迟,查不到刚写入的数据怎么办?
A:在高级配置里设「查询延迟」(如 180 秒),查询会把起止时间整体前移,避开尚未落盘的时间窗口。
参考资料
- Elasticsearch 查询(字段与语法说明通用)
- 告警表达式语法
- 告警规则基础配置
- OpenSearch Query DSL