两个依赖和一个配置块:通过 Prometheus 远程写入将 Spring Boot 指标发送到 Elasticsearch

作者:来自 Elastic Christoph Heger

Prometheus 远程写入会将 Micrometer 的 Actuator 指标转发到 Elasticsearch 时序数据流中。JVM 堆、请求延迟、GC 暂停时间和 HikariCP 活动都可以通过 ES|QL 进行查询,而且无需在其旁边运行任何新的组件。

使用时标题一序数据流高效存储高基数指标,同时保留你的 Prometheus 和 PromQL 工作流程。

深入了解基础设施和指标监控。现在开始免费云试用,或者在你的本地计算机上试用 Elastic。


Prometheus 远程写入为 Spring Boot 提供了直接连接 Elastic Serverless 的路径:不需要专用的长期指标存储,也不需要额外运维基础设施。在 pom.xml 中添加两个依赖,在 prometheus.yml 中添加一个指向 Elastic 的 remote_write 配置块,JVM、HTTP 请求和数据库指标就会流入一个可查询的时序数据流。AI Agent 随后可以检查这些字段,并根据对话提示生成完整的指标仪表板(堆使用量、延迟百分位数、HikariCP 连接池活动)。

Curly-Engine 实现了 PetClinic API,并与 Prometheus 一起运行 Spring Boot,因此 Prometheus 可以抓取 /actuator/prometheus,并将样本转发到 Elastic。

前提条件

  • 一个 Elastic Observability Serverless 项目。

  • 一个能够写入 metrics-* 的 API 密钥。

  • Java 17 或更高版本、Docker 和 Docker Compose,用于运行示例。

  • Serverless 项目设置中的 Prometheus 端点。

使用 Micrometer Prometheus 注册表公开 Spring Boot Actuator 指标

Curly-Engine 使用Spring Boot Actuator 和 Micrometer 的 Prometheus 注册表。在应用程序的 pom.xml 中添加以下依赖:

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

在 application.properties 中公开 /actuator/prometheus 端点:

复制代码
management.endpoints.web.exposure.include=health,prometheus
management.endpoint.prometheus.enabled=true

配置 Prometheus 指标:

复制代码
management.metrics.tags.application=${spring.application.name}
management.metrics.distribution.percentiles-histogram.http.server.requests=true

启动应用程序并检查端点:

复制代码
curl http://localhost:8080/actuator/prometheus

除了 JVM 和进程指标之外,Micrometer 还会生成带有 bucket、count 和 sum 序列的 HTTP 请求直方图:

复制代码
http_server_requests_seconds_bucket{method="GET",status="200",uri="/owners",le="0.01"} 0.0
http_server_requests_seconds_count{method="GET",status="200",uri="/owners"} 42.0
http_server_requests_seconds_sum{method="GET",status="200",uri="/owners"} 3.827

bucket 序列包含延迟分布,你可以在数据摄取后对其进行探索。

配置 Prometheus 远程写入

Spring Boot 没有内置的远程写入发送器,因此需要在应用程序旁边运行 Prometheus,以抓取 Actuator 端点并将样本推送到 Elastic。

将以下配置添加到 prometheus.yml,并将占位符替换为你的 Prometheus 端点和 API 密钥:

复制代码
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'petclinic-api'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['petclinic-api:8080']

remote_write:
  - url: "https://YOUR_PROMETHEUS_ENDPOINT/api/v1/write"
    authorization:
      type: ApiKey
      credentials: YOUR_API_KEY

15 秒的 scrape_interval 是一个合理的默认值;只有当你需要亚分钟级的告警窗口,并且了解高基数带来的成本时,才应将其调低。

默认的 Remote Write URL 会将指标路由到 metrics-generic.prometheus-default。如果需要使用单独的数据集或命名空间,请参阅使用 Remote Write 将 Prometheus 指标发送到 Elasticsearch。

不要将 API 密钥放入已提交到版本控制的配置中;对于本地开发,可以通过环境变量或密钥管理器传递密钥。

启动 PetClinic 示例和 Prometheus:

复制代码
docker-compose up --build
  1. 打开 http://localhost:9090/targets

  2. 确认 petclinic-api 目标的状态为 UP

  3. 先向 API 发送一些请求,以便请求和数据库指标有数据可以显示

验证 Prometheus Remote Write 是否正在将数据发送到 Elasticsearch

在 Kibana Discover 中,切换到 ES|QL,然后运行:

复制代码
TS metrics-generic.prometheus-default
| WHERE @timestamp > NOW() - 15 minutes
| LIMIT 500

Discover 会返回每个可用指标,并显示一个小型时序可视化。如果查询返回数据,说明 Prometheus 正在抓取应用程序,而 Elastic 正在接受 Remote Write 请求。

Remote Write 会将样本存储在 Elastic 指标数据流中。指标值位于 metrics.* 下,Prometheus 标签则作为维度,用于过滤和分组。

使用 Elastic AI Agent 创建指标仪表板

从顶部导航栏中的 AI Agent 图标打开 Elastic AI Agent,并要求它检查数据流:

我在 metrics-generic.prometheus-default 数据流中有 Spring Boot Prometheus 指标。创建一个仪表板来可视化这些指标。

AI Agent 会检查它找到的字段,并创建可编辑的 Kibana 可视化。对于此示例,有用的面板包括:

  • JVM 堆内存。

  • CPU 使用率。

  • 按端点划分的请求速率。

  • HikariCP 连接活动。

  • JVM 垃圾回收暂停时间。

在 AI Agent 响应中点击 Preview,打开新建的 Dashboard,然后点击 Save 保存。生成的面板都是标准的 Kibana 可视化;打开其中任意一个面板并点击 Edit,即可检查或调整 ES|QL 查询、时间分桶、聚合或细分方式。

仪表板的质量取决于 AI Agent 对数据流进行采样时找到的数据。如果指标数据稀疏,可以生成一些流量,然后使用更大的时间范围重新发起请求。

将 HTTP 延迟百分位数添加到仪表板

速率指标显示需求量;延迟百分位数则显示端点在这种需求量下的表现。继续输入:

将 HTTP 请求延迟百分位数添加到仪表板,包括按端点 URI 划分的 p50、p90 和 p99。

AI Agent 会根据 Micrometer 的 HTTP 请求直方图桶指标构建面板。在依赖它之前,请检查生成的结果,重点关注所选字段、聚合、时间范围和 URI 细分方式。这是你最有可能需要调整的查询。

改为导入预构建的仪表板

Curly-Engine 仓库还包含一个可导入的 dashboard.ndjson。要使用它,请在 Kibana 中打开 Stack Management > Saved Objects ,并在 metrics-generic.prometheus-default 中开始接收指标后导入该文件。

将 Prometheus Remote Write 用于生产环境

Prometheus Remote Write 为 Spring Boot 应用提供了一条从 Actuator 指标直接进入 Elastic Serverless 的路径,无需单独的长期指标存储。

这种方式是否适合,取决于你对存储的需求:

将 Prometheus Remote Write 写入 Elasticsearch 专用长期存储(Thanos、Mimir、Cortex)
需要运行的组件 你已经运行的 Prometheus 实例,加上 Elastic 项目 Sidecar 或 distributor、store gateway、querier、compactor,以及对象存储桶
查询语言 ES|QL 和 PromQL PromQL
降采样 由 Elasticsearch 时序数据流降采样处理 内置,通常采用固定分辨率
跨多个 Prometheus 实例的全局视图 每个实例都写入同一个集群,因此一个查询即可跨越所有实例 核心设计目标之一,可对重叠实例进行去重
使用 AI Agent 开始仪表板对话,然后针对与你的服务相关的指标和标签验证并优化生成的面板。

在将其应用于高基数生产工作负载之前,请检查抓取任务,并添加 metric_relabel_configs,以丢弃你不需要的指标。

原文:Prometheus remote write: Spring Boot to Elasticsearch | Elastic Observability Labs

相关推荐
JosieBook1 小时前
【数据库】MySQL 实战精通系列 · 第2篇:数据建模与建表实战
android·数据库·mysql
夜雪一千1 小时前
MySQL自定义函数应该如何设计
数据库·mysql
一条小小yu1 小时前
mysql的锁
数据库·mysql·oracle
Roadinforest1 小时前
Spring Boot 4 六步入门实录:从 Hello World 到一个能交付的 Todo API
java·开发语言·spring boot·spring
nvd111 小时前
Flink 极简入门与零常驻批处理架构实战:从双模式辨析到 GitOps 通用模具治理
大数据·架构·flink
fb_123451 小时前
MySQL基础核心|数据库原理+MySQL详解
数据库·mysql
大大大大晴天️1 小时前
每天认识一个组件:向量化计算加速Apache Auron
大数据
‎ദ്ദിᵔ.˛.ᵔ₎1 小时前
Mysql 基本查询
数据库·mysql
牧瀬クリスだ2 小时前
Mybatis-Plus:让CRUD快如闪电
java·spring boot·spring·tomcat·mybatis·yml