1. 项目概述
在微服务架构盛行的当下,监控体系的建设已成为保障系统稳定性的关键环节。这套基于Spring Boot Actuator+Prometheus+Grafana的监控方案,是我在多个生产环境中验证过的成熟实践。它不仅能够实时捕捉JVM性能指标,还能对微服务间的调用链路、资源消耗等关键维度进行可视化监控。
特别提示:生产级监控需要同时关注指标采集的实时性和存储的经济性,Prometheus的时序数据库设计恰好平衡了这两点需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心组件解析
2.1 Spring Boot Actuator的监控能力
作为Spring Boot的监控模块,Actuator通过/actuator端点暴露了丰富的监控指标。在application.properties中启用所有端点:
properties复制management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
关键指标包括:
- JVM内存使用(jvm.memory.used)
- 线程状态(jvm.threads.live)
- HTTP请求统计(http.server.requests)
2.2 Prometheus的数据抓取机制
Prometheus通过pull模式采集指标,需要在spring boot应用中添加依赖:
xml复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
配置prometheus.yml抓取目标:
yaml复制scrape_configs:
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080']
2.3 Grafana的可视化方案
推荐使用Docker快速部署Grafana:
bash复制docker run -d -p 3000:3000 --name=grafana grafana/grafana-enterprise
典型监控看板应包含:
- JVM内存趋势图
- 线程池活跃度监控
- 接口响应时间P99
- 数据库连接池状态
3. 生产级部署实践
3.1 高可用架构设计
mermaid复制graph TD
A[Spring Boot] -->|暴露指标| B(Prometheus)
B -->|存储数据| C[(TSDB)]
C -->|查询数据| D[Grafana]
D -->|告警通知| E[Alert Manager]
3.2 关键配置参数
在prometheus.yml中优化采集频率:
yaml复制global:
scrape_interval: 15s
evaluation_interval: 15s
对于重要业务指标,建议设置单独的抓取任务:
yaml复制- job_name: 'order-service'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['order-service:8080']
4. 告警规则配置
4.1 Prometheus告警规则
在rules.yml中定义关键告警:
yaml复制groups:
- name: spring-boot-alerts
rules:
- alert: HighHeapUsage
expr: jvm_memory_used_bytes{area="heap"} > 0.8 * jvm_memory_max_bytes{area="heap"}
for: 5m
labels:
severity: warning
4.2 Grafana告警通道
配置邮件通知的步骤:
- 进入Alerting → Notification channels
- 选择Email类型
- 设置SMTP服务器参数
- 测试并保存配置
5. 性能优化技巧
5.1 指标采样优化
对于高频指标,建议使用Micrometer的采样配置:
java复制MeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
registry.config().meterFilter(
new MeterFilter() {
@Override
public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
return DistributionStatisticConfig.builder()
.percentiles(0.5, 0.95, 0.99)
.build()
.merge(config);
}
}
);
5.2 存储优化策略
调整Prometheus的存储参数:
yaml复制storage:
tsdb:
retention: 15d
chunk_encoding: XOR
6. 常见问题排查
6.1 指标缺失问题
检查步骤:
- 确认/actuator/prometheus端点可访问
- 检查Micrometer依赖版本
- 验证Prometheus的抓取日志
6.2 数据不一致处理
典型场景:
- Prometheus显示"stale"状态
- Grafana面板显示"No data"
解决方案:
bash复制# 重启Prometheus容器
docker restart prometheus
# 检查时间同步
ntpdate -u pool.ntp.org
7. 进阶监控方案
7.1 自定义业务指标
示例:统计订单创建耗时
java复制@RestController
public class OrderController {
private final Timer orderTimer;
public OrderController(MeterRegistry registry) {
this.orderTimer = registry.timer("order.create.time");
}
@PostMapping("/orders")
public void createOrder(@RequestBody Order order) {
orderTimer.record(() -> {
// 业务逻辑处理
});
}
}
7.2 分布式追踪集成
结合Sleuth和Zipkin:
xml复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
配置application.properties:
properties复制spring.zipkin.base-url=http://zipkin-server:9411
spring.sleuth.sampler.probability=1.0
8. 容器化部署方案
8.1 Docker Compose编排
完整部署示例:
yaml复制version: '3'
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3000:3000"
depends_on:
- prometheus
8.2 Kubernetes部署
创建ConfigMap存储配置:
bash复制kubectl create configmap prometheus-config \
--from-file=prometheus.yml=./prometheus.yml
Deployment示例:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
spec:
replicas: 2
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: prom/prometheus
ports:
- containerPort: 9090
volumeMounts:
- name: config-volume
mountPath: /etc/prometheus
volumes:
- name: config-volume
configMap:
name: prometheus-config
9. 安全防护措施
9.1 访问控制配置
Grafana的auth.ini配置示例:
ini复制[auth.anonymous]
enabled = false
[auth.basic]
enabled = true
9.2 HTTPS加密传输
使用Nginx反向代理配置SSL:
nginx复制server {
listen 443 ssl;
server_name grafana.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://grafana:3000;
}
}
10. 监控体系扩展
10.1 业务指标监控
自定义指标示例:
java复制@Bean
MeterBinder orderMetrics(OrderRepository repository) {
return registry -> Gauge.builder("orders.count", repository::count)
.description("当前订单数量")
.register(registry);
}
10.2 日志监控集成
通过Loki收集日志:
yaml复制promtail-config.yaml:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: spring-boot
static_configs:
- targets:
- localhost
labels:
job: spring-boot
__path__: /var/log/spring/*.log
在Grafana中添加Loki数据源后,即可实现日志与指标的关联查询。
