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 Byhost, status
  • 告警条件$A > 50

分组后每个 (host, status) 组合独立判定,事件标签里带对应的 hoststatus

场景三:统计类告警

数值提取不止 count,还能算平均值等。「订单接口平均响应时间超过 1 秒」:

  • 索引nginx-access-*
  • 过滤条件path:"/api/v1/order*"
  • 数值提取avg(response_time)
  • Group Bypath
  • 告警条件$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 秒),查询会把起止时间整体前移,避开尚未落盘的时间窗口。

参考资料

更新时间 2026-07-17

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云