使用 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 中的 PromQLRemote 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-urlencoded body 中发送参数,与 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-default data 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,创建一个新的 Observability serverless 项目。项目创建完成后,你会直接进入 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-dashboard service 会从 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-urlencoded body 的 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 的 /_prometheus endpoint 即可。

为什么使用 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

相关推荐
南讯股份Nascent1 小时前
颖通电商全渠道项目启动会成功举办
大数据·人工智能·物联网
猴子15516811 小时前
问卷逻辑跳转功能谁更强?2026年四款工具条件设置实测
大数据
XTIOT6661 小时前
CRPT 诚实标识采集落地技术实践:分工况硬件选型与合规数据标准化解决方案
大数据·运维·人工智能·嵌入式硬件·物联网
杨婷1231 小时前
2026 企业微信会话存档服务商选型指南:一维助手方案深度解析
大数据·数据库·企业微信
2301_780356702 小时前
全视通智慧医院解决方案:构建数智化医疗新生态
大数据·网络·人工智能
AC赳赳老秦2 小时前
采购专员自动化:OpenClaw 自动比价、生成询价单、跟踪供应商报价进度实战指南
开发语言·数据库·人工智能·python·自动化·github·openclaw
蚁库2 小时前
Oracle 11g RAC 多路径配置总搞不定?iSCSI + Multipath + ASM 磁盘组,14节视频带你完整通关
数据库·oracle
C++ 老炮儿的技术栈2 小时前
MFC 自定义纯色居中文字进度条控件
c语言·数据库·c++·windows·算法·c·visual studio
灯澜忆梦2 小时前
【MySQL1】| DDL 数据定义语言
数据库·sql·mysql