跳到主要内容

ElasticSearch / OpenSearch

接入 ES 或 OpenSearch 集群,选择索引模式与时间字段,跑一条日志查询。

这页办完你会得到:一个接好的 ES 集群、一个可复用的索引模式, 以及一条在日志检索里真的查出日志的查询。

先说一条会影响你怎么用的差别:开源版里 ElasticSearch 能在日志检索和仪表盘里用, OpenSearch 只能用来配告警规则。 两者都能注册成数据源、都能配日志告警规则, 但 OpenSearch 用不了探索器和仪表盘。有日志检索需求的,优先用 ElasticSearch 类型。

开始之前​

  • ES 的 HTTP 地址,比如 http://10.0.0.21:9200;
  • 夜莺 Center 所在机器能访问它;
  • ES 8.x 默认开着 X-Pack security,准备好账号密码;
  • 索引里得有一个日期类型的字段(通常是 @timestamp),夜莺按它过滤时间范围。

1. 注册数据源​

集成中心 → 数据源 → 新增 → Elasticsearch。

HTTP 这一段是个可以加行的列表:点标题旁边的 + 可以填多个节点地址, 夜莺会在这些地址间轮询。

字段说明
名称必填,规则和查询里按它选数据源
HTTP节点地址,http://localhost:9200 这种写法。至少一个
超时(单位:ms)默认 10000
用户名 / 密码ES 开了认证就填。ES 8.x 默认要填
版本留空即可,保存时夜莺会自己去取。要指定就按 x.y.z 写,例如 7.10.2
最大并发分片请求数默认 5。分片特别多的集群把它调小,避免一次查询把 ES 打满
最小时间间隔(s)默认 10。按时间自动分组的下限,建议设成写入频率——每分钟写一次就填 60

「允许写入」这个开关开源版用不到,保持关闭。

Elasticsearch 数据源表单Elasticsearch 数据源表单

点 测试连通性并保存。ES 类型这一步做的是取版本号:取到了就把版本填进配置, 取不到不会阻断保存,但结果页会告诉你原因——所以看到「已保存,未验证连通性」别急着走, 先把原因看完。

2. 建一个索引模式​

查询时有两种指定数据范围的方式:

  • Indices:直接写索引名,支持通配符,比如 log-*。临时查一下用这个;
  • Index patterns:预先定义好的索引模式,把索引名和时间字段绑成一条记录, 之后查询和告警规则直接选它。

索引模式在 /log/index-patterns 这个页面管理(ES 查询编辑器里索引模式框右边那个齿轮 图标也能跳过去)。点 新增索引模式,一条索引模式包含:

字段填什么
数据源属于哪个 ES 数据源
名称索引名或通配符,比如 log-prod-*
时间字段@timestamp 之类的日期字段

列表里能看到的就是这三列加操作列。索引模式被告警规则引用时删不掉,会被挡下来。

为什么值得先建一个:时间字段只用填一次;换句话说, 之后每条查询和每条规则都不用再回答「哪个字段是时间」。

3. 跑一条日志查询​

数据查询 → 日志,数据源选你刚建的这个。左侧依次选:

  1. 检索方式:Indices 或 Index patterns;
  2. 索引 / 索引模式;
  3. 日期字段(选 Indices 时才需要单独选);
  4. 语法:KQL 或 Lucene;
  5. 查询条件:例如 status:500 AND method:GET。

有日志列表出来就说明通了。查不到日志先确认时间范围——右上角的时间选择器默认只查最近一段, 历史日志要主动往前拉。

4. 按查询结果告警​

日志类规则和指标规则的差别只在「查什么」:指标规则写 PromQL,日志规则写一次查询统计, 再对统计出来的数拿表达式判定。

在 告警通知 → 规则管理 → 新增 里,数据源类型选 Elasticsearch(或 OpenSearch), 查询部分除了索引、时间字段、查询条件,还多两组:

  • 值字段:用哪个数值参与判定。除了 count、sum、avg、min、max, 还支持 p90 / p95 / p99 这类分位数;
  • Group By:按某个字段分组。分几组就产生几条序列, 每组各自判定、各自出事件,事件标签里带着分组值。

举三个能直接照抄的形态:

  • 十分钟内 4xx 超过 2 条,按主机分组:查询条件筛出 4xx,值字段用 count,Group By 选 host.hostname,告警条件 > 2;
  • 接口 95 分位耗时超过 1700ms:值字段对 request_time 取 p95,Group By 选 remote_addr;
  • 慢请求条数超过 10 条:查询条件 request_time > 1900,值字段 count,Group By 选 request_uri。

写完点 数据预览,先确认这条查询真的返回了你预期的数字,再去配阈值。

OpenSearch 不一样的地方​

OpenSearch fork 自 ES 7.10,接入表单几乎一样(超时默认值是 100000 而不是 10000), 但在开源版里:

  • 能注册数据源、能配日志告警规则;
  • 不能在日志检索里检索,也不能在仪表盘上画图——这两处都不支持, OpenSearch 数据源在开源版的数据源下拉框里不会出现。

所以如果你的诉求是「先看日志再决定告警」,用 ElasticSearch 类型接入。

排障​

保存时提示取不到版本。 先在夜莺 Center 那台机器上 curl http://<es>:9200/_cluster/health:拿不到 200 就是网络或认证的问题; ES 8.x 默认自签证书,要打开「跳过 SSL 验证」。

能选到索引但查不到数据。 三件事按顺序查:日期字段选对没有、 索引通配符有没有匹配到真实索引、时间范围里是不是真的没数据。

跨多个集群怎么办。 一个集群一个数据源。同集群下跨索引查, 在索引里写通配符(log-prod-*)就行。

下一步​