广告

SpringBoot整合Prometheus监控:从指标采集到告警落地的完整实操

1. 整体架构与目标

1.1 关键组件与关系

Spring Boot 应用提供可观测性数据的入口,借助 ActuatorMicrometer 将指标暴露到 Prometheus 的注册表。Prometheus 作为时序数据库,定期对 /actuator/prometheus 端点进行抓取,形成可查询的指标数据。Alertmanager 则负责告警路由、聚合与通知渠道的落地。整个架构的核心目标是实现“从指标采集到告警落地”的闭环监控。

在本实操中,Grafana可作为可视化看板,帮助你直观比对指标趋势与告警状态,但核心能力仍来自于 Prometheus 与 Alertmanager 的联动。通过这样的组合,你可以在生产环境中快速定位性能瓶颈、容量告警以及服务健康状况。

以下示例将涵盖从依赖引入到端点暴露、从 Prometheus 配置到告警落地的完整链路。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>monitoring-demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
  </dependencies>
</project>

要点:确保应用具备对 Prometheus 的暴露能力,并以 Micrometer 提供的 Prometheus 注册表为桥梁。

1.2 环境准备与落地策略

在正式环境前,先在开发/测试环境完成基线指标的收集与告警规则校验。目标是实现零侵入的指标暴露、简单明了的告警策略,以及可重复的部署流程。以下要点将帮助你平滑落地:

暴露端点:确保应用在 management.endpoints.web.exposure.include=prometheus,health 范围内暴露 Prometheus 端点,并开启 management.metrics.export.prometheus.enabled=true

management.endpoints.web.exposure.include=prometheus,health
management.endpoint.prometheus.enabled=true
management.metrics.export.prometheus.enabled=true

2. 指标暴露与Prometheus采集

2.1 暴露点与自定义指标

Prometheus 通过 /actuator/prometheus 获取系统与应用指标,内置指标覆盖系统、JVM、HTTP 请求等维度。若需要更精细的业务维度,可以结合 Micrometer 的自定义度量,如 @Timed、@Counted 等注解,将自定义指标注入注册表。

下面给出一个简单的自定义指标示例,展示如何通过注解对接口进行打点,并暴露到 Prometheus。

import io.micrometer.core.annotation.Timed;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {

  @Timed(value = "orders.processed", description = "Processed orders count")
  @GetMapping("/orders/process")
  public String process() {
    // 业务逻辑
    return "processed";
  }
}

要点:自定义指标可以帮助监控特定业务线的吞吐量、耗时等关键参数,结合默认指标实现全方位观测。

默认情况下,Prometheus 会抓取 /actuator/prometheus 的数据,包含常用度量如 JVM 内存、GC、HTTP 请求统计等。若需要对 API 层进行深度监控,可以通过 WebMvcMetricsFilter 与 Micrometer 注解进行扩展。

2.2 Prometheus抓取配置

Prometheus 需要知道需要抓取的目标以及端点位置。以下给出一个典型的 Prometheus scrape 配置,通过静态目标将 Spring Boot 应用加入抓取队列。

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'spring-boot'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8080']

要点:确保应用在对应端口对外暴露 Prometheus 端点,且 Prometheus 的抓取间隔符合你的监控需求与系统负载能力。

3. Prometheus与Alertmanager的告警落地

3.1 告警规则编写

告警规则用于从监控数据中筛选异常场景,并将告警事件送达 Alertmanager 进行路由。下面给出一个典型的 Prometheus 规则示例,用于监控高 CPU 使用率。

groups:
  - name: springboot.rules
    rules:
      - alert: HighCPUUtilization
        expr: avg(rate(process_cpu_seconds_total[5m])) > 0.85
        for: 10m
        labels:
          severity: critical
          service: springboot-app
        annotations:
          summary: "High CPU utilization on {{ $labels.instance }}"
          description: "CPU usage has been above 85% for 10 minutes on {{ $labels.instance }}."

要点:合理设定阈值和持续时间,避免因短暂波动触发误报,同时在 annotations 中提供清晰的描述以便通知渠道理解。

3.2 告警路由与通知渠道

Alertmanager 负责将 Prometheus 中的告警分发到运维人员或团队成员。以下是一个简单的告警路由示例,用于将告警发送到 Slack,并可拓展至邮箱、PagerDuty 等渠道。

route:
  receiver: 'slack-notifications'
  group_by: ['alertname', 'service']

receivers:
  - name: 'slack-notifications'
    slack_configs:
      - channel: '#alerts'
        username: 'prometheus-bot'
        icon_emoji: ':rotating_light:'

要点:为不同的服务、不同严重级别设定单独的路由,确保通知渠道与团队职责一致,避免告警漂移。

4. 从指标采集到告警落地的完整实操流程

4.1 实操步骤一:本地环境搭建

在本地环境快速复现监控链路时,先启动 Spring Boot 应用并确保 /actuator/prometheus 能正确暴露。随后启动 Prometheus 与 Alertmanager,完成初步告警链路的连接。

要点包括准备容器化环境、网络端口开放和卷挂载配置,以便持久化 Alertmanager 的配置。

本地启动命令示例:通过 Docker 启动 Prometheus 与 Alertmanager,并挂载配置文件。

# 启动 Prometheus
docker run -d -p 9090:9090 \
  -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

# 启动 Alertmanager
docker run -d -p 9093:9093 \
  -v /path/to/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  prom/alertmanager

要点:Prometheus 配置中应包含 alerting 节点,指向 Alertmanager。

# prometheus.yml 片段
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['localhost:9093']

验证方式:通过 curl 或浏览器访问 http://localhost:9090 的 UI,查看目标是否就绪、告警规则是否被解析。

4.2 实操步骤二:部署到集群

将应用以容器化形式部署到集群后,要确保 Prometheus 与 Alertmanager 的抓取与告警链路在集群内可达。你可以使用 Kubernetes DaemonSet/Deployment 组合来持续对应用进行监控,并通过 Prometheus Operator/ Helm 进行集中化配置。

要点:在集群中统一管理告警规则、路由策略和接收端,避免环境间配置差异导致告警错配。

# Prometheus 通过 PrometheusRule 进行告警规则注入(示例):
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: springboot-rules
spec:
  groups:
  - name: springboot.rules
    rules:
    - alert: HighCPUUtilization
      expr: avg(rate(container_cpu_usage_seconds_total{container_name="springboot"}[5m])) > 0.8
      for: 10m
      labels:
        severity: critical
        service: springboot-app
      annotations:
        summary: "High CPU utilization detected"
        description: "Container {{ $labels.instance }} CPU usage above 80% for 10m."

要点:在集群环境中使用统一的监控 Operator/Helm 图谱,确保版本一致性与快速回滚能力。

4.3 实操步骤三:验证告警

触发告警的核心是让指标达到告警规则中的阈值,并让 Alertmanager 将告警路由落地到配置的接收渠道(Slack、邮箱、PagerDuty 等)。在验证阶段,可以通过人为制造临时压力来触发告警,或使用逐步增量的负载测试工具。

验证思路:先在 Prometheus UI 中确认告警规则已被评估为 firing,再在 Alertmanager UI 查看路由是否正确命中目标接收渠道。

示例查询用于快速确认当前告警状态:

# PromQL 示例:查看当前 HighCPUUtilization 告警状态
ALERTS{alertname="HighCPUUtilization"}

要点:确保告警清晰可追溯,附带实例、服务名、描述等信息,便于运维快速响应。

在整合完成后,你将获得一个从应用指标暴露到 Prometheus 抓取、再到 Alertmanager 告警落地的完整闭环。通过 Grafana 的仪表板和 Prometheus 的查询能力,你可以持续监控服务健康、性能与容量趋势,并对异常情况实现及时告警。

广告

后端开发标签