SpringBootActuator暴露指标

wen java案例 1

Spring Boot Actuator 暴露指标详解

基础配置

Maven依赖:

SpringBootActuator暴露指标

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Gradle依赖:

implementation 'org.springframework.boot:spring-boot-starter-actuator'

配置暴露端点

application.yml配置:

management:
  endpoints:
    web:
      exposure:
        # 暴露所有端点
        include: "*"
        # 排除特定端点
        exclude: "env,beans"
    # 启用端点(默认除了shutdown都启用)
    enabled-by-default: true
  # 端点配置
  endpoint:
    health:
      show-details: always  # 显示健康详情
    info:
      enabled: true
    metrics:
      enabled: true
  # 自定义服务信息
  info:
    app:
      name: @project.name@
      version: @project.version@
      java:
        version: ${java.version}

常用端点列表

端点ID 描述 默认是否Web暴露
health 应用健康信息
info 应用信息
metrics 应用指标
env 环境属性
beans Spring Bean列表
mappings URL映射
threaddump 线程转储
heapdump 堆转储
loggers 日志级别
shutdown 关闭应用
scheduledtasks 定时任务
caches 缓存信息

安全配置

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authz -> authz
                .requestMatchers("/actuator/health", "/actuator/info").permitAll()
                .requestMatchers("/actuator/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .httpBasic();
        return http.build();
    }
}

application.yml增加认证配置:

spring:
  security:
    user:
      name: admin
      password: ${ACTUATOR_PASSWORD:default}
      roles: ADMIN
management:
  endpoints:
    web:
      base-path: /actuator  # 自定义基础路径

自定义指标

@Component
public class CustomMetrics {
    private final Counter requestCount;
    private final Gauge activeUsers;
    private final DistributionSummary requestSize;
    public CustomMetrics(MeterRegistry registry) {
        this.requestCount = Counter.builder("api.requests.total")
            .description("Total API requests")
            .tag("service", "my-service")
            .register(registry);
        this.activeUsers = Gauge.builder("app.users.active", this, 
            CustomMetrics::getActiveUserCount)
            .description("Active users")
            .register(registry);
        this.requestSize = DistributionSummary.builder("api.request.size")
            .baseUnit("bytes")
            .publishPercentiles(0.5, 0.95, 0.99)
            .register(registry);
    }
    public void incrementRequestCount() {
        requestCount.increment();
    }
    private int getActiveUserCount() {
        // 返回当前活跃用户数
        return 150;
    }
}

端点访问路径

默认基础路径为 /actuator

  • 健康检查:GET /actuator/health
  • 应用信息:GET /actuator/info
  • 所有端点列表:GET /actuator
  • 指标数据:GET /actuator/metrics
  • 特定指标:GET /actuator/metrics/jvm.memory.used

自定义健康指标

@Component
public class DatabaseHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        boolean databaseUp = checkDatabaseConnection();
        if (databaseUp) {
            return Health.up()
                .withDetail("database", "Oracle")
                .withDetail("status", "connected")
                .build();
        } else {
            return Health.down()
                .withDetail("database", "Oracle")
                .withDetail("error", "Connection failed")
                .build();
        }
    }
    private boolean checkDatabaseConnection() {
        // 实际的数据库连接检查逻辑
        return true;
    }
}

禁用特定端点

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics
  endpoint:
    # 完全禁用端点
    beans:
      enabled: false
    env:
      enabled: false
    # 或通过web暴露控制
    shutdown:
      enabled: false  # 默认已禁用

审计日志

management:
  audit:
    events:
      enabled: true
  endpoint:
    auditevents:
      enabled: true
      cache:
        time-to-live: 10s

测试端点

使用curl测试:

# 健康检查
curl http://localhost:8080/actuator/health
# 获取指标
curl http://localhost:8080/actuator/metrics
# 带认证
curl -u admin:password http://localhost:8080/actuator/env

最佳实践建议

  1. 生产环境只暴露必要的端点(health, info, metrics)
  2. 始终添加安全认证,特别是生产环境
  3. 使用环境变量管理敏感配置(如密码)
  4. 考虑使用Spring Cloud Config集中管理
  5. 监控端点访问日志,防止滥用
  6. 定期检查不必要的端点是否关闭

Actuator提供强大的监控能力,合理配置既能保障安全,又能获取有效的运维数据。

抱歉,评论功能暂时关闭!