# ElasticSearch / OpenSearch

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

最后校对于 2026-10-10

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

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

## 开始之前[​](#开始之前 "开始之前的直接链接")

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

## 1. 注册数据源[​](#1-注册数据源 "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 数据源表单](https://n9e.github.io/zh/img/docs/data/form-elasticsearch.zh.webp)![Elasticsearch 数据源表单](https://n9e.github.io/zh/img/docs/data/form-elasticsearch.zh.dark.webp)

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

## 2. 建一个索引模式[​](#2-建一个索引模式 "2. 建一个索引模式的直接链接")

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

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

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

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

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

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

## 3. 跑一条日志查询[​](#3-跑一条日志查询 "3. 跑一条日志查询的直接链接")

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

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

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

## 4. 按查询结果告警[​](#4-按查询结果告警 "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-不一样的地方 "OpenSearch 不一样的地方的直接链接")

OpenSearch fork 自 ES 7.10，接入表单几乎一样（超时默认值是 100000 而不是 10000）， 但在开源版里：

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

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

## 排障[​](#排障 "排障的直接链接")

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

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

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

## 下一步[​](#下一步 "下一步的直接链接")

* 认真写日志规则：[日志类告警规则](https://n9e.github.io/zh/docs/alerting/log-rules.md)
* 检索技巧和索引模式详解：[日志检索与索引模式](https://n9e.github.io/zh/docs/query/log-explorer.md)
* 换一种日志存储：[Loki / VictoriaLogs](https://n9e.github.io/zh/docs/data/loki-victorialogs.md)
