作者来自 Elastic Sergey SidorovFelix BarnsteinerKostas KrikellasCostin LeauElasticsearch 现在在 ES|QL 中原生支持 PromQL作为一等 source 命令。你可以直接在 Kibana 中对时间序列数据运行熟悉的 Prometheus 查询。许多团队在日常工作中已经依赖 PromQL。我们正在让 PromQL 成为 Elasticsearch 中一等公民的体验。ES|QL 中的新PROMQL命令让你可以用 PromQL 查询 Elasticsearch 中的时间序列数据无论这些数据来自 Prometheus Remote Write、OpenTelemetry还是其他来源。指标、日志和追踪数据——全部统一在一个地方并可在 Kibana 中直接进行探索。PROMQL 源命令PROMQL 是 ES|QL 中的一个 source 命令类似于FROM或TS。它接受标准的 PromQL 参数和一个 PromQL 表达式执行查询并将结果作为普通的 ES|QL 列返回之后你可以继续使用其他命令对其进行处理。其通用语法如下PROMQL [indexpattern] [stepduration] [starttimestamp] [endtimestamp] [value_column_name](PromQL expression)这些参数与 Prometheus HTTP API 的查询参数step、start、end一致因此如果你之前使用过 Prometheus 查询 API会感觉非常熟悉。基础范围查询该查询计算在滑动 5 分钟窗口内 HTTP 请求的每秒速率并按 instance 分组PROMQL indexmetrics-* step1m start2026-04-01T00:00:00Z end2026-04-01T01:00:00Z sum by (instance) (rate(http_requests_total[5m]))结果包含三列列名类型描述sum by (instance) (rate(http_requests_total[5m]))double计算得到的指标值stepdate每个评估步的时间戳instancekeyword来自by (instance)的分组标签当 PromQL 表达式包含跨时间序列聚合例如sum by (instance)时每个分组标签都会成为一个独立的输出列。当不存在跨时间序列聚合时所有标签会作为一个_timeseries列返回并以 JSON 字符串形式表示。命名 value 列默认情况下value 列的名称就是 PromQL 表达式本身。你可以指定一个自定义名称以便在后续命令中更方便地引用PROMQL indexmetrics-* step1m start2026-04-01T00:00:00Z end2026-04-01T01:00:00Z http_rate(sum by (instance) (rate(http_requests_total[5m]))) | SORT http_rate DESC这与在STATS中命名聚合的方式相同例如STATS avg_cpu avg(system.cpu.usage)。索引模式index参数支持与FROM和TS相同的模式包括通配符和逗号分隔的列表。如果未指定则默认使用*即查询所有配置了index.mode: time_series的索引。在生产环境中建议显式指定索引模式以避免扫描无关数据。底层是如何工作的PROMQL命令并不会运行一个独立的查询引擎。相反PROMQL命令是在 ES|QL 计算引擎内部执行的并且复用了通过TSsource 命令实现的时间序列聚合逻辑。考虑下面这个 PromQL 查询PROMQL indexmetrics-* step1m start2026-04-01T00:00:00Z end2026-04-01T01:00:00Z sum by (host.name) (rate(http_requests_total[5m]))在内部PROMQL命令会将该查询转换为一个等价的 ES|QL 查询并使用TSsource 来执行TS metrics-* | WHERE TRANGE(2026-04-01T00:00:00Z, 2026-04-01T01:00:00Z) | STATS SUM(RATE(http_requests_total, 5m)) BY TBUCKET(1m), host.name两个查询会产生相同的结果。PROMQL命令会解析 PromQL 语法将函数映射为 ES|QL 中的等价实现例如rate转换为RATEsum转换为SUMavg_over_time转换为AVG_OVER_TIME等并构建一个逻辑执行计划由 ES|QL 引擎执行。这种转换方式的一个实际好处是PromQL 查询可以自动受益于 ES|QL 引擎的所有优化能力包括 segment 级并行处理以及时间序列感知的数据访问模式。目前已有 19 个时间序列函数可用覆盖速率rates、差值deltas、导数derivatives以及多种*_over_time聚合函数。简化查询的智能默认值在 Prometheus 中PromQL 查询需要显式指定start、end和step参数。在 Kibana 中这些参数通常由时间选择器和面板大小决定。PROMQL命令提供了三个特性使查询能够自动适配这些上下文。自动 step如果你省略step参数系统会根据时间范围和目标桶数量自动推导 step默认100 个桶。你也可以通过设置bucketsn来显式指定目标桶数量。PROMQL indexmetrics-* start2026-04-01T00:00:00Z end2026-04-01T01:00:00Z sum by (instance) (rate(http_requests_total[5m]))在 1 小时时间范围内如果使用默认的 100 个桶目标step 将为 1m从而生成 60 个桶。这使用的是与 ES|QLBUCKET函数相同的日期取整逻辑。推断 start 和 endKibana 会通过对timestamp的 Query DSL range filter在每个 ES|QL 请求中自动添加时间范围过滤条件。PROMQL命令会提取这些边界并在查询未显式指定时将其作为start和end使用。该命令可以直接从请求上下文中读取 date picker 的范围无需额外配置。隐式范围选择器在标准 PromQL 中像rate这样的函数需要显式的范围选择器例如rate(http_requests_total[5m])。而PROMQL命令允许省略该范围选择器PROMQL sum by (instance) (rate(http_requests_total))当范围选择器缺失时窗口会自动确定为max(step, scrape_interval)。scrape_interval默认值为 1m如果你的数据有不同的采集间隔可以通过scrape_interval参数覆盖例如PROMQL scrape_interval15s sum(rate(http_requests_total))。最终结果结合这三个默认行为在 Kibana 中一个完全自适应的查询如下所示PROMQL sum(rate(http_requests_total))这个查询会响应 date picker 的时间范围选择根据所选时间范围自动调整 step 大小并相应地设置范围选择器窗口大小无需手动调优。使用 ES|QL 进行后处理由于PROMQL是一个 ES|QL source 命令它的输出会继续流入 ES|QL 的其余处理管道。你可以使用任意 ES|QL 命令对 PromQL 的结果进行过滤、排序、增强和转换。过滤结果PROMQL indexmetrics-* http_rate(sum by (instance) (rate(http_requests_total[5m]))) | WHERE http_rate 100排序与限制limitPROMQL indexmetrics-* http_rate(sum by (instance) (rate(http_requests_total[5m]))) | SORT http_rate DESC | LIMIT 10使用 lookup 进行数据增强PROMQL indexmetrics-* http_rate(sum by (instance) (rate(http_requests_total[5m]))) | LOOKUP JOIN instance_metadata ON instance这在 Prometheus 中是无法实现的。PromQL 的结果是自包含的没有办法将其与外部数据进行 join也无法进行任意的后处理。在 Elasticsearch 中PromQL 的输出只是查询的第一阶段之后可以继续使用任何 ES|QL 操作进行处理。当前覆盖范围与后续计划在 9.4 中PROMQL命令将作为技术预览提供并且在对主流 Grafana 开源仪表盘进行基准测试时查询覆盖率超过 80%。当前技术预览中最主要的缺失包括尚不支持 group 修饰符例如on(chip) group_left(chip_name)尚未支持布尔集合运算符or、and、unless部分函数仍未支持包括histogram_quantile、predict_linear和label_join这些功能都已在后续版本规划中。路线图包括更完整的 PromQL 函数与操作符覆盖、与 Prometheus 对齐的 step 语义以及对原生 histogram 的支持。体验方式PromQL 支持在 Elasticsearch Serverless 中作为技术预览直接使用无需额外配置。对于自管理集群从9.4 版本开始提供支持。在 Kibana 中体验方式如下进入 Dashboards创建一个新的 panel并选择 ES|QL 作为查询类型输入 PromQL 查询例如PROMQL indexmetrics-* sum by (host.name) (rate(http_requests_total))该命令会自动从 Kibana 的 date picker 推断时间范围因此无需额外参数。你也可以在 Discover 的 ES|QL 模式中运行 PromQL 查询以表格或 XY 图表形式查看结果。后续将在专门的 Kibana 博客中详细介绍 PromQL 在 Dashboards、Discover 和 Alerting 中的完整使用方式。完整命令参考包括所有选项与示例请查看 PROMQL command 文档。如果你想在自管理集群中体验可以使用 start-local 快速启动环境。如果遇到问题或有反馈可以在 Elasticsearch 仓库中提交 issue。原文https://www.elastic.co/observability-labs/blog/elasticsearch-supports-promql