1. 整体架构与目标
1.1 关键组件与关系
Spring Boot 应用提供可观测性数据的入口,借助 Actuator 与 Micrometer 将指标暴露到 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 的查询能力,你可以持续监控服务健康、性能与容量趋势,并对异常情况实现及时告警。


