使用 Elasticsearch 作为 Grafana 的直接替代 Prometheus 后端

📅 2026/7/8 16:11:26 👁️ 阅读次数 📝 编程学习
使用 Elasticsearch 作为 Grafana 的直接替代 Prometheus 后端

作者:来自 Elastic Felix Barnsteiner

使用 Elasticsearch 作为 Grafana 仪表盘的 Prometheus 后端,在无需更改 PromQL workflows 的情况下,支持自动补全、Metrics Drilldown 和告警。

在不改变 PromQL workflows 的情况下,将 Elasticsearch 用作 Grafana 仪表盘、自动补全、Metrics Drilldown 和告警的 Prometheus 后端。

Elasticsearch 已经是 Grafana 生态系统中最受欢迎的插件之一,现在我们进一步增强了它在 metrics 使用场景中的能力。如果你目前运行 Prometheus,并使用 Grafana 可视化 metrics,现在可以直接将 Grafana 的 Prometheus data source 指向 Elasticsearch。无需 sidecar,无需 adapter,也无需修改 pipeline。

Elasticsearch 现在实现了原生 Prometheus 兼容 API 层,覆盖了通过 Remote Write 进行的摄入,以及通过 PromQL 进行的查询。本文将端到端展示 Grafana 配置流程。配套文章还介绍了 Kibana 中的 PromQL 和 Remote Write 架构。

为什么使用 Elasticsearch 作为 Prometheus 后端?

过去一年中,Elasticsearch 已经成为先进的 metrics 存储系统:时间序列 data streams、ES|QL 的 TS 命令,以及能够为 Prometheus 风格工作负载提供高性能 metrics 处理能力 的存储和查询优化。Prometheus 兼容 API 层让你可以通过团队已经使用的工具访问这个引擎。

许多团队已经在基于 Prometheus 的工具链上投入了大量资源:仪表盘、引用 PromQL 查询的运行手册(runbook)、围绕 Grafana 面板构建的 on-call 工作流。Elasticsearch 的 Prometheus 兼容端点允许你迁移 metrics 存储,同时保留这些 Grafana 工作流。

如果你已经使用 Elasticsearch 存储日志或 traces,并希望将可观测性数据整合到单一平台,同时保持现有的 Grafana 工作流,这一点尤其重要。

Elasticsearch Prometheus API 包含哪些内容

Elasticsearch Prometheus API 提供三类端点。

查询 API

核心查询端点允许 Grafana 针对存储在 Elasticsearch 中的数据执行 PromQL 表达式:

  • GETPOST /_prometheus/api/v1/query_range:在指定时间窗口内执行 PromQL 表达式,并返回 matrix 结果。这是大多数 Grafana 仪表盘面板的基础。

  • GETPOST /_prometheus/api/v1/query:在单个时间点执行 PromQL 表达式,并返回 vector 结果。

两个端点都实现了标准 Prometheus 响应封装,包括结果类型(vector、matrix、scalar、string)、状态码以及错误处理。对于POST请求,需要在application/x-www-form-urlencodedbody 中发送参数,与 Prometheus client 的行为保持一致。

元数据 API

Grafana 的 metrics explorer、自动补全以及变量下拉列表依赖元数据端点来发现可用内容。Elasticsearch 支持:

  • GETPOST /_prometheus/api/v1/series:返回匹配 label selector 的时间序列。

  • GETPOST /_prometheus/api/v1/labels:返回所有可用的 label 名称。

  • GET /_prometheus/api/v1/label/{name}/values:返回指定 label 的所有值。

  • GET /_prometheus/api/v1/metadata:返回每个 metric 名称的类型和帮助文本。

这些端点支持 Grafana 中的自动补全和 metric 浏览器。/metadata端点还支持 Grafana 的 Metrics Drilldown:这是一个交互式 metric explorer,它以实时 sparkline 网格的形式展示所有可用 metrics,并允许你无需编写 PromQL 查询即可深入查看任意 metric。

索引预过滤

所有查询和元数据端点都支持可选的{index}路径段,该路径段紧跟在/_prometheus/之后,例如:

GET /_prometheus/metrics-prod-*/api/v1/query_range

该预过滤会在执行任何表达式计算之前,先限制 PromQL 查询运行的 Elasticsearch 索引范围。对于跨多个 data streams 的大量 metrics 数据,限制查询范围可以减少仪表盘查询工作量。

你可以针对不同 index pattern 配置独立的 Grafana data source,从而让团队只访问自己的 metrics。

Remote Write 摄入

Elasticsearch 同样实现了 Prometheus Remote Write 协议,允许你通过标准remote_write配置,将 metrics 从 Prometheus 发送到 Elasticsearch。在现有 Prometheus 配置中添加 Elasticsearch 作为 remote write 目标,只需要增加一个代码块:

remote_write: - url: "<es_endpoint>/_prometheus/api/v1/write" authorization: type: ApiKey credentials: <api_key>

默认情况下,metrics 会存储在metrics-generic.prometheus-defaultdata stream 中。你可以使用 dataset 和 namespace 路径段,将来自不同 Prometheus 实例或环境的 metrics 路由到不同 data streams:

  • POST /_prometheus/metrics/{dataset}/api/v1/write:将 metrics 存储到metrics-{dataset}.prometheus-default

  • POST /_prometheus/metrics/{dataset}/{namespace}/api/v1/write:将 metrics 存储到metrics-{dataset}.prometheus-{namespace}

如何将 Grafana 连接到 Elasticsearch

第 1 步:创建 serverless 项目

登录 cloud.elastic.co,创建一个新的Observabilityserverless 项目。项目创建完成后,你会直接进入 Kibana。

要查找 Elasticsearch 端点,返回 Elastic Cloud 控制台,打开Manage > Application endpoints, cluster and component IDs,然后点击Elasticsearch旁边的复制图标。该端点格式如下:

https://<project-id>.es.<region>.<provider>.elastic.cloud

第 2 步:创建 API keys

创建两个具有受限权限范围的 API keys:一个用于摄入(ingestion),一个用于查询(querying)。使用独立的 keys 意味着:即使 Grafana key 泄露,也无法被用于写入数据;即使 ingest key 泄露,也无法被用于读取数据。

在你的项目中,打开Admin and settings(侧边导航栏左下角的 ⚙️ 图标),进入API keys,并创建第一个 key。

Ingest keyprometheus-remote-write):限制只能访问写入 metrics data streams。在Control security privileges部分,粘贴以下 role descriptor:

{ "ingest": { "indices": [ { "names": ["metrics-*"], "privileges": ["auto_configure", "create_doc"] } ] } }

在同一部分创建第二个用于 Grafana 的 key。

Query keyprometheus-grafana):限制只能访问读取 metrics data streams。

{ "query": { "indices": [ { "names": ["metrics-*"], "privileges": ["read", "view_index_metadata"] } ] } }

在关闭之前复制两个 key 的值。之后你将无法再次获取它们。

第 3 步:运行 Prometheus 和 Grafana

创建一个prometheus.yml,让它抓取 Prometheus 自身的 metrics,并将这些 metrics 转发到 Elasticsearch。将<es_endpoint>替换为第 1 步中的端点,并将<ingest_api_key>替换为第 2 步中的 ingest key:

global: scrape_interval: 15s scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] remote_write: - url: "<es_endpoint>/_prometheus/api/v1/write" authorization: type: ApiKey credentials: <ingest_api_key>

接下来,创建 Grafana provisioning 目录:

mkdir -p grafana/provisioning/datasources grafana/provisioning/dashboards

然后创建一个指向 Elasticsearch Prometheus API 的 Grafana data source 配置。创建grafana/provisioning/datasources/datasource.yml,将<es_endpoint><query_api_key>替换为第 1 步和第 2 步中的值:

apiVersion: 1 datasources: - name: Elasticsearch type: prometheus access: proxy url: "<es_endpoint>/_prometheus" uid: elasticsearch-prometheus isDefault: true jsonData: httpHeaderName1: Authorization secureJsonData: httpHeaderValue1: "ApiKey <query_api_key>"

该配置会创建一个由 Elasticsearch 支持的 Prometheus 类型 data source。Grafana 默认通过POST发送 Prometheus queries,Elasticsearch 可以在经过身份验证的 HTTPS 端点(例如 Serverless)上接受这些请求。

创建grafana/provisioning/dashboards/dashboards.yml,用于告诉 Grafana 从哪里查找已配置的 dashboards:

apiVersion: 1 providers: - name: default type: file options: path: /var/lib/grafana/dashboards

最后,创建一个docker-compose.yml来启动所有组件:

services: prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro download-dashboard: image: curlimages/curl:latest user: root volumes: - dashboards:/dashboards command: > sh -c 'curl -fsSL https://grafana.com/api/dashboards/3662/revisions/2/download | sed "s/\$${DS_THEMIS}/elasticsearch-prometheus/g" > /dashboards/prometheus-overview.json' grafana: image: grafana/grafana:latest ports: - "3000:3000" depends_on: download-dashboard: condition: service_completed_successfully environment: - GF_SECURITY_ADMIN_PASSWORD=grafana volumes: - ./grafana/provisioning:/etc/grafana/provisioning:ro - dashboards:/var/lib/grafana/dashboards:ro volumes: dashboards:

download-dashboardservice 会从 Grafana marketplace 获取 Prometheus 2.0 Overview dashboard,并对其进行修改,使其使用 Elasticsearch data source。sed会将 dashboard 中的${DS_THEMIS}data source 占位符替换为我们的 data source UID。这是必要的,因为 Grafana 的 provisioning 不会自行解析这些占位符(grafana#10786)。Grafana 会等待下载完成后再启动。

使用以下命令启动两者:

docker compose up -d

Prometheus 会开始抓取自身的 metrics,并每 15 秒将它们发送到 Elasticsearch。在打开 dashboard 之前,等待一个或两个 scrape interval。

第 4 步:打开 dashboard

http://localhost:3000打开 Grafana,并使用admin/grafana登录。进入Dashboards,打开Prometheus 2.0 Overview

该 dashboard 展示你的 Prometheus 自监控 metrics,这些 metrics 通过 PromQL queries 从 Elasticsearch 中获取。

第 5 步:使用 Grafana 的 Metrics Drilldown 探索 metrics

由于 Elasticsearch 实现了 Prometheus 元数据和发现端点,Grafana 的 Metrics Drilldown 可以直接使用。

在 Grafana 中,进入左侧导航栏的Drilldown > Metrics,并选择Elasticsearch作为 data source。Grafana 会从 Elasticsearch 加载所有可用的 metrics,并以实时 sparklines 网格的形式展示。从这里开始,你可以通过 label 进行过滤,通过名称搜索,并且无需编写 PromQL 即可深入查看任意 metric。

当前限制和未来计划

这是第一个实现版本,后续会持续更新。目前以下功能都在积极开发中:

PromQL 覆盖范围尚未完整

使用 group modifiers(例如on(instance, job))、set operators(orandunless)以及某些函数(例如topk)的查询目前尚不支持。

Form-encoded POST 有部署要求

带有application/x-www-form-urlencodedbody 的POST请求需要启用安全功能、在 Elasticsearch HTTP 接口上启用 TLS,并且请求必须经过身份验证。Serverless 默认满足这些要求。

如果 TLS 在 Elasticsearch 之前终止,而节点接收到的是普通 HTTP,则应改用带有 query-string 参数的GET请求。

目前仅支持 Remote Write v1

Remote Write v2 支持计划后续提供。

Instant queries 目前还不是时间点查询

instant query 端点当前底层运行的是一个短范围查询,并返回最后一个 sample。未来会替换为真正的时间点评估。

即将支持:更广泛的 PromQL 函数和操作符覆盖、Remote Write v2,以及 exemplar 端点。

常见问题

Grafana 可以查询存储在 Elasticsearch 中的 Prometheus metrics 吗?

可以。当 URL 指向/_prometheus时,Grafana 可以使用 Elasticsearch 作为 Prometheus data source。查询使用 PromQL,并返回标准 Prometheus 响应格式,用于 Grafana dashboards、变量、Metrics Drilldown 和告警。

我需要修改 Prometheus 或 Grafana dashboards 才能使用 Elasticsearch 吗?

对于常见的 Grafana 使用场景,你不需要重写 PromQL queries 或 dashboard panels。配置 Prometheus Remote Write,将 metrics 发送到 Elasticsearch,然后将 Grafana 的 Prometheus data source 指向 Elasticsearch 的/_prometheusendpoint 即可。

为什么使用 Elasticsearch,而不是单独的 Prometheus 长期存储后端?

使用 Elasticsearch 作为 Prometheus 后端,可以在相同的访问控制和 retention 模型下,将 metrics 与日志和 traces 存储在一起。最近 Elasticsearch metrics engine 的相关工作也为 Prometheus 风格工作负载提供了出色的性能。有关基准测试详情,请查看 Elasticsearch metrics 性能文章。

目前 Elasticsearch 支持哪些 PromQL 功能?

Elasticsearch 支持 Grafana dashboards 中常用的 PromQL 查询模式。高级 group modifiers、set operators 和topk目前尚不支持。

我可以限制 Grafana queries 只访问特定的 Elasticsearch indices 吗?

可以。在/_prometheus/后添加 index pattern,例如/_prometheus/metrics-prod-*/api/v1/query_range。这会在 PromQL evaluation 之前预过滤 Elasticsearch indices,并可以减少大型 metrics 部署中的查询工作量。

Prometheus API 可用性

Prometheus 兼容 API 目前已经可以在 Elasticsearch Serverless 上使用,无需额外配置。

如果遇到问题或有反馈,请在 Elasticsearch repository 中提交 issue。

原文:Use Elasticsearch as a Drop-In Prometheus Backend for Grafana — Elastic Observability Labs