当前位置: 首页 > news >正文

使用 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

http://www.jsqmd.com/news/1148716/

相关文章:

  • GHelper终极指南:5分钟快速掌控华硕笔记本性能的免费神器
  • Node.js Worker Threads 实战:CPU 密集型任务的线程池设计与性能对比
  • EM3080-W与PIC18F65K40的嵌入式条形码识别系统设计
  • 5分钟轻松实现:基于ASP.NET的手机号码定位系统开发指南
  • 墨迹天气 API 常见错误与排错指南
  • caret 6.0.94 RFE 实战:3种模型(线性回归/随机森林/SVM)特征选择性能对比
  • yolo settings命令使用示例:自定义训练权重保存路径runs_dir
  • 深度解析:基于Java的GB28181视频监控平台架构设计与高并发实现
  • Telegram AI Bot自动化实战:5步用Make搭建业务工作台
  • 如何3秒定位手机号码位置:免费开源工具实战秘籍
  • 5分钟快速上手:用XUnity.AutoTranslator为Unity游戏添加中文翻译
  • 小红书下载神器:XHS-Downloader 终极使用指南,轻松保存心仪内容
  • 苹果18 AI图像生成工具:本地部署、API集成与性能优化实战
  • 深度解析百度网盘链接解析工具的技术架构设计与性能优化实践
  • 为什么原函数的垂直渐近线,会导致导函数在相同位置也是垂直渐近线?(且符号可能相反)
  • 终极指南:3分钟解锁索尼相机隐藏功能,享受完全自定义体验
  • HsMod:55项功能重塑你的炉石传说游戏体验
  • 微信双设备登录终极指南:3步解锁平板模式,工作生活完美分离
  • 014-教授效应的认知科学依据
  • 3D打印枪支泛滥引担忧,多地立法管控能否奏效?
  • 红杉医联智能晨会系统,破解放射科多院区晨间诊疗协同难题
  • REPENTOGON终极使用指南:从零开始掌握《以撒的结合》脚本扩展器
  • 从 GIM 到自动计算书:架线施工方案全流程实战
  • OpenCV 4.8 特征匹配实战:ORB+SIFT 单应性矩阵求解与 RANSAC 参数调优
  • MAT 1.14.0 实战:3步定位 Spring Boot 应用 OOM 元凶(附 2GB 堆转储分析)
  • 告别龟速下载:3分钟掌握百度网盘直链解析技巧
  • 从 curl 到工程封装:一言经典语录 API 接入实战
  • HJB正则化与Eikonal约束在机器人接触操纵中的工程落地
  • XUnity.AutoTranslator完整指南:如何在5分钟内为Unity游戏实现完美翻译
  • GHelper:华硕笔记本用户的终极性能控制解决方案