热力直达:使用 Elasticsearch 插件将 ES|QL 引入你的 Grafana 仪表板

0 阅读6分钟

作者:来自 Elastic Cauê Marcondes

现在,你可以通过 Elasticsearch 插件在 Grafana 中编写 ES|QL 查询。了解如何启用该功能,并直接在 Grafana 界面中编写基于管道(pipe)的查询。

通过以下方式亲身体验 Elasticsearch:深入探索 Elasticsearch Labs 仓库 中的示例 Notebooks,开始 免费云试用,或立即在你的 本地机器 上体验 Elastic。

Elasticsearch 数据源是 Grafana 生态系统中最受欢迎的插件之一,现在从 Grafana 13.0 开始,它新增了对 ES|QL 的实验性支持。ES|QL 是 Elasticsearch 现代化的基于管道(pipe)的查询语言,可用于查询日志、指标和追踪数据,并支持将 Elasticsearch 作为原生的 Prometheus PromQL 数据源,所有操作都可以直接在 Grafana 查询编辑器中完成。

该集成由 Elastic 与 Grafana Labs 合作开发,并贡献回 Grafana 开源项目 。只需启用一个功能开关(elasticsearchESQLQuery = true),即可启用基于 Monaco 编辑器的 ES|QL 查询体验,支持语法高亮、自动补全和内联错误提示。本文将介绍如何启用该功能,并编写你的第一个 ES|QL 查询,用于日志分析、时间序列可视化以及指标聚合。

背景

Elasticsearch 一直是 Grafana UI 中使用最广泛的插件之一。此前,Elasticsearch 插件仅支持 Lucene 和原始 Query DSL 查询。

ES|QL 是 Elastic 推出的现代化管道式查询语言,专为日志、指标和追踪数据分析而设计。相比 Query DSL 或 Lucene,其直观的语法使过滤、聚合和数据转换更加简单。

自 2024 年以来,这一直是社区持续提出的需求,详见:grafana/grafana#81765

如何在 Grafana 中启用 ES|QL 支持

该功能由 elasticsearchESQLQuery 功能开关控制。要启用它,请将以下配置添加到你的 grafana.ini

`

1.  [feature_toggles]
2.  elasticsearchESQLQuery = true

`AI写代码

保存配置后,重新启动 Grafana。该功能从 Grafana 13.0 开始提供。

Grafana 查询编辑器中的 ES|QL

启用该功能开关后,Elasticsearch 查询编辑器将新增一个 **查询语言(Query language)**选择器。你可以在同一个编辑器面板中,在 Lucene、Raw DSL 和 ES|QL 之间自由切换。

选择 ES|QL 后,编辑器会切换为基于 Monaco 的代码编辑器——与 VS Code 使用的是同一个编辑器引擎。你将开箱即用地获得语法高亮、错误高亮以及基础自动补全功能。

智能索引预填充(Smart index pre-population) 让你能够快速开始:如果数据源设置中配置了索引模式(index pattern),首次点击进入 ES|QL 编辑器时,会自动插入 FROM <index>。你可以自由修改或删除它。如果没有配置索引,则 FROM 子句会保持为空。

运行你的第一个查询

按严重级别统计日志条目数量

这是一个很好的入门查询,可以用来确认 ES|QL 已正常工作,同时帮助你熟悉其语法。

`

1.  FROM logs*
2.  | STATS count = COUNT(*) BY log.level
3.  | SORT count DESC

`AI写代码

Raw Data(原始数据)面板类型中运行它,就可以看到按日志级别(log level)统计的表格结果。

浏览最新错误(Browse the latest errors)

WHEREKEEPSORTLIMIT 让你可以轻松过滤出你真正关心的字段和行。

`

1.  FROM logs
2.  | WHERE log.level == "error"
3.  | KEEP @timestamp, host.name, service.name, message
4.  | SORT @timestamp DESC
5.  | LIMIT 20

`AI写代码

日志随时间变化

使用 BUCKET 将日志数量按小时区间分组。这与 Metrics 面板类型配合效果很好,可以将其渲染为时间序列图。

`

1.  FROM logs*
2.  | STATS count = COUNT(*) BY bucket = BUCKET(@timestamp, 1 hour)
3.  | SORT bucket ASC

`AI写代码

按日志活动统计的 Top hosts

识别最活跃的 hosts 是一个常见的运维任务。使用 STATS 搭配 BY 和 LIMIT 可以让它更简洁。

`

1.  FROM logs*
2.  | STATS log_count = COUNT(*) BY host.name
3.  | SORT log_count DESC
4.  | LIMIT 10

`AI写代码

TS 命令用于时间序列指标

对于 时间序列数据流(Time Series Data Streams,TSDS) 中的指标数据,ES|QL 的 TS 源命令可以实现指标分析与时间序列聚合。

示例:

  • RATE():随时间变化的速率
  • AVG_OVER_TIME():在滑动窗口内的平均值
  • INCREASE():某个时间段内的总增长量
  • DELTA():首尾值之间的差值
  • LAST_OVER_TIME():窗口内的最新值

其模式遵循两层聚合:先对单个时间序列应用内部函数,再对结果进行外部聚合(例如按 host 或 service 分组)。

`

1.  TS metrics*
2.    | STATS SUM(RATE(metrics.system.cpu.time)) BY TBUCKET(10 m)

`AI写代码

你也可以使用 AVG_OVER_TIME()来计算一个 metric 在 sliding window 上的平均值,然后按 host 和 10-minute buckets 对结果进行拆分:

`

1.  TS metrics*
2.    | STATS MAX(AVG_OVER_TIME(metrics.system.memory.utilization)) BY host.name,TBUCKET(10m)

`AI写代码

TS 也会通过 ES|QL 向量化计算引擎执行查询。内部基准测试显示,相比在 TSDS 支持的数据上执行等价 Query DSL 查询,性能提升可达一个数量级或更高。

参考:

内联错误信息

ES|QL 查询通过 Elasticsearch 的 /_query HTTP 端点 执行。如果你的查询存在语法错误,或引用了不存在的字段,Elasticsearch 会返回结构化错误响应。插件会将其直接展示为查询编辑器中的内联提示,让你在 Grafana UI 中就能清楚看到问题所在。

在上面的示例中,host.nam 少了最后的 e。Elasticsearch 会将其识别为校验异常(verification exception),并返回无法解析的字段名称。该错误信息会以内联方式显示在查询编辑器中,就在查询下方。

技术细节

在底层实现中,该插件将 ES|QL 和其他查询类型分成不同的处理路径。ES|QL 查询会发送到 /_query 端点,并使用 Content-Type: application/json。Lucene 和 Query DSL 查询仍然使用 /_msearch,并采用 Content-Type: application/x-ndjson

这种拆分是有意设计的:/_query 返回的是不同结构的响应,插件会独立解析该响应,然后再将数据传递给 Grafana 的面板。

试用一下!

这也意味着现在是一个很好的时机去尝试并提供反馈。

上游 PR(upstream PR)以及原始跟踪 issue (original tracking issue)都是公开的。如果你遇到问题或有需求,都可以在这些地方留言。

下一步

  • 在你的 Grafana 13.0 实例中通过 elasticsearchESQLQuery = true 启用该功能

  • 在你自己的索引上尝试上面的示例查询

  • 对于指标数据,可以在 Elasticsearch 9.2 或 Serverless 数据源上尝试 ES|QL 的 TS 命令

  • 阅读完整的 ES|QL 概览 以探索该语言的更多能力

如果你还没有使用 Elasticsearch,可以在 Elastic Cloud 上启动免费试用。

原文:Piping Hot: Bringing ES|QL to Your Grafana Dashboards Using the Elasticsearch Plugin - Elasticsearch Labs