作者:来自 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。
前提条件
-
一个能够写入
metrics-*的 API 密钥。 -
Java 17 或更高版本、Docker 和 Docker Compose,用于运行示例。
-
Serverless 项目设置中的 Prometheus 端点。
使用 Micrometer Prometheus 注册表公开 Spring Boot Actuator 指标
Curly-Engine 使用 Spring Boot Actuator 和 Micrometer 的 Prometheus 注册表。在应用程序的 pom.xml 中添加以下依赖:
xml
`
1. <dependency>
2. <groupId>org.springframework.boot</groupId>
3. <artifactId>spring-boot-starter-actuator</artifactId>
4. </dependency>
5. <dependency>
6. <groupId>io.micrometer</groupId>
7. <artifactId>micrometer-registry-prometheus</artifactId>
8. </dependency>
`AI写代码
在 application.properties 中公开 /actuator/prometheus 端点:
ini
`
1. management.endpoints.web.exposure.include=health,prometheus
2. management.endpoint.prometheus.enabled=true
`AI写代码
配置 Prometheus 指标:
ini
`
1. management.metrics.tags.application=${spring.application.name}
2. management.metrics.distribution.percentiles-histogram.http.server.requests=true
`AI写代码
启动应用程序并检查端点:
bash
`curl http://localhost:8080/actuator/prometheus`AI写代码
除了 JVM 和进程指标之外,Micrometer 还会生成带有 bucket、count 和 sum 序列的 HTTP 请求直方图:
ini
`
1. http_server_requests_seconds_bucket{method="GET",status="200",uri="/owners",le="0.01"} 0.0
2. http_server_requests_seconds_count{method="GET",status="200",uri="/owners"} 42.0
3. http_server_requests_seconds_sum{method="GET",status="200",uri="/owners"} 3.827
`AI写代码
bucket 序列包含延迟分布,你可以在数据摄取后对其进行探索。
配置 Prometheus 远程写入
Spring Boot 没有内置的远程写入发送器,因此需要在应用程序旁边运行 Prometheus,以抓取 Actuator 端点并将样本推送到 Elastic。
将以下配置添加到 prometheus.yml,并将占位符替换为你的 Prometheus 端点和 API 密钥 :
yaml
`
1. global:
2. scrape_interval: 15s
3. evaluation_interval: 15s
5. scrape_configs:
6. - job_name: 'petclinic-api'
7. metrics_path: '/actuator/prometheus'
8. static_configs:
9. - targets: ['petclinic-api:8080']
11. remote_write:
12. - url: "https://YOUR_PROMETHEUS_ENDPOINT/api/v1/write"
13. authorization:
14. type: ApiKey
15. credentials: YOUR_API_KEY
`AI写代码
15 秒的 scrape_interval 是一个合理的默认值;只有当你需要亚分钟级的告警窗口,并且了解高基数带来的成本时,才应将其调低。
默认的 Remote Write URL 会将指标路由到 metrics-generic.prometheus-default。如果需要使用单独的数据集或命名空间,请参阅使用 Remote Write 将 Prometheus 指标发送到 Elasticsearch。
不要将 API 密钥放入已提交到版本控制的配置中;对于本地开发,可以通过环境变量或密钥管理器传递密钥。
启动 PetClinic 示例和 Prometheus:
css
`docker-compose up --build`AI写代码
-
打开
http://localhost:9090/targets -
确认
petclinic-api目标的状态为UP -
先向 API 发送一些请求,以便请求和数据库指标有数据可以显示
验证 Prometheus Remote Write 是否正在将数据发送到 Elasticsearch
在 Kibana Discover 中,切换到 ES|QL,然后运行:
markdown
`
1. TS metrics-generic.prometheus-default
2. | WHERE @timestamp > NOW() - 15 minutes
3. | LIMIT 500
`AI写代码
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