Spring Boot Actuator 提供生产级监控能力。但默认的健康检查和指标并不总是足够!
主要内容:
✔ Spring Boot Actuator 概览
✔ 创建自定义健康指标
✔ 暴露自定义指标(CPU、数据库查询、API响应时间等)
✔ 使用Prometheus和Grafana可视化指标
✔ 在Kubernetes中部署Actuator
“隐藏服务器问题” 挑战
设想一个高流量电商网站🛒的场景:
问题表现: 系统看似正常,但用户突然反馈:
- 结账流程缓慢
- 随机500错误
- 数据库性能下降
根本原因:标准Actuator健康检查仅报告:
✔ JVM运行中
✔ 数据库已连接
但无法检测性能瓶颈,如:
- 慢查询
- 内存泄漏
- CPU峰值
解决方案: 通过自定义健康指标和监控指标实现真实系统状态追踪!
启用Spring Boot Actuator
添加依赖 (pom.xml
)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置端点 (application.yml
)
management:
endpoints:
web:
exposure:
include: "health,metrics,info"
endpoint:
health:
show-details: always
✔ 访问默认健康检查端点:
curl http://localhost:8080/actuator/health
✔ 响应示例:
{
"status": "UP",
"components": {
"db": { "status": "UP" },
"diskSpace": { "status": "UP" }
}
}
创建自定义健康指标
自定义数据库查询健康检查
@Component
public class DatabaseQueryHealthIndicator extends AbstractHealthIndicator {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
long startTime = System.currentTimeMillis();
jdbcTemplate.queryForObject("SELECT 1", Integer.class);
long elapsedTime = System.currentTimeMillis() - startTime;
if (elapsedTime < 100) {
builder.up().withDetail("queryTime", elapsedTime + "ms");
} else {
builder.down().withDetail("queryTime", elapsedTime + "ms");
}
}
}
✔ 增强后的/health
端点响应:
{
"status": "UP",
"components": {
"dbQuery": {
"status": "UP",
"queryTime": "12ms"
}
}
}
暴露自定义指标
添加Micrometer依赖 (pom.xml
)
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
监控API响应时间
@RestController
@RequestMapping("/api")
public class OrderController {
@Autowired
private MeterRegistry meterRegistry;
@GetMapping("/orders")
public List<String> getOrders() {
Timer timer = Timer.builder("order_api_timer")
.description("追踪/orders接口响应时间")
.register(meterRegistry);
return timer.record(() -> {
simulateProcessingDelay();
return List.of("Order1", "Order2");
});
}
private void simulateProcessingDelay() {
try {
Thread.sleep(new Random().nextInt(200)); // 模拟随机延迟
} catch (InterruptedException ignored) {}
}
}
✔ 查询指标:
curl http://localhost:8080/actuator/metrics/order_api_timer
✔ 响应示例:
{
"name": "order_api_timer",
"measurements": [
{ "statistic": "COUNT", "value": 150 },
{ "statistic": "TOTAL_TIME", "value": 30.3 }
]
}
使用Prometheus & Grafana可视化
配置Prometheus (prometheus.yml
)
scrape_configs:
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']
Docker启动Prometheus:
docker run -d --name=prometheus -p 9090:9090 -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
访问Prometheus UI: http://localhost:9090
指标查询示例: {order_api_timer}
配置Grafana看板
Docker安装Grafana:
docker run -d -p 3000:3000 grafana/grafana
配置步骤:
- 添加Prometheus作为数据源
- 创建新看板
- 添加
order_api_timer
指标面板
实时监控API性能! 📊
在Kubernetes中部署Actuator
配置Kubernetes健康探针
management:
endpoint:
health:
probes:
enabled: true
health:
livenessState:
enabled: true
readinessState:
enabled: true
实现效果:当/actuator/health
返回DOWN状态时,Kubernetes将自动重启Pod
为什么Actuator是生产环境必备
- 实时系统健康监控
- 数据库性能追踪
- API性能指标暴露
- 云原生集成(Prometheus/K8s)
没有回复内容