【监控】Spring Boot 应用监控

这段配置是 Spring Boot 应用中对 Actuator 和 Micrometer 监控系统的配置,用于将应用的指标暴露给 Prometheus 进行收集。下面我将详细介绍这种配置方式及其提供的指标。

配置说明

这个配置主要涉及 Spring Boot Actuator 和 Micrometer 两个核心组件:

  1. Actuator 配置
yaml 复制代码
management:
  endpoint:
    env:
      enabled: false  # 禁用 env 端点,防止暴露敏感环境变量
  security:
    enabled: false  # 禁用端点安全验证(生产环境建议启用)
  endpoints:
    web:
      exposure:
        include:
          - prometheus  # 只暴露 prometheus 端点

这部分配置了 Actuator 端点的访问权限和暴露范围,特别启用了 Prometheus 指标端点。

  1. Micrometer 配置
yaml 复制代码
management:
  metrics:
    tags:
      application: XXXX  # 为所有指标添加 application=XXXX 标签
    enable:
      all: true  # 启用所有默认指标收集
    distribution:
      percentiles:
        http.server.requests: 0.25,0.5,0.75,0.9,0.95  # 为 HTTP 请求指标计算指定百分位数

这部分配置了 Micrometer 的指标收集策略,包括标签、启用的指标类型和分布统计参数。

  1. 依赖配置
xml 复制代码
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

这两个依赖分别引入了 Actuator 和 Prometheus 指标收集器。

提供的核心指标

Spring Boot Actuator 与 Micrometer 结合 Prometheus 会提供以下几类核心指标:

1. JVM 相关指标
plain 复制代码
jvm_memory_used_bytes                # JVM 各区域(堆、非堆)已使用内存
jvm_memory_max_bytes                 # JVM 各区域最大可用内存
jvm_memory_committed_bytes           # JVM 各区域已提交的内存
jvm_gc_pause_seconds_total           # GC 暂停总时间
jvm_threads_live_threads             # 当前活跃线程数
jvm_classes_loaded_classes           # 已加载的类数量
2. HTTP 请求指标
plain 复制代码
http_server_requests_seconds_count   # HTTP 请求总数
http_server_requests_seconds_sum     # HTTP 请求总耗时
http_server_requests_seconds_max     # HTTP 请求最大耗时
http_server_requests_seconds         # HTTP 请求耗时分布(通过 percentiles 配置)

可通过 methoduristatus 等标签过滤不同请求路径和状态码的性能。

3. 系统资源指标
plain 复制代码
system_cpu_usage                     # 系统 CPU 使用率
process_cpu_usage                    # 进程 CPU 使用率
system_load_average_1m               # 系统 1 分钟负载平均值
process_start_time_seconds           # 进程启动时间
4. 数据库连接池指标(如 HikariCP)
plain 复制代码
hikaricp_connections_active          # 活跃连接数
hikaricp_connections_idle            # 空闲连接数
hikaricp_connections_pending         # 等待获取连接的线程数
hikaricp_connections_creation_seconds # 连接创建耗时
5. 缓存指标(如 Caffeine、Redis)
plain 复制代码
cache_gets_total                     # 缓存获取次数
cache_hits_total                     # 缓存命中次数
cache_misses_total                   # 缓存未命中次数
cache_puts_total                     # 缓存放入次数
6. 自定义业务指标

通过 MeterRegistry 接口可以在代码中添加自定义指标,例如:

java 复制代码
@Autowired
private MeterRegistry meterRegistry;

// 计数器
Counter requestCounter = meterRegistry.counter("http_requests", "endpoint", "/api/users");
requestCounter.increment();

// 计时器
Timer apiTimer = meterRegistry.timer("api_response_time", "service", "user-service");
apiTimer.record(() -> {
    // 执行耗时操作
});

如何使用这些指标

  1. 访问指标端点
    应用启动后,可以通过 http://<host>:<port>/actuator/prometheus 查看 Prometheus 格式的指标数据。
  2. Prometheus 配置
    在 Prometheus 的配置文件中添加抓取任务:
yaml 复制代码
scrape_configs:
  - job_name: 'spring-boot-app'
    static_configs:
      - targets: ['localhost:8080']
    metrics_path: '/actuator/prometheus'
  1. Grafana 可视化
    导入 Spring Boot 官方提供的 Grafana 仪表盘模板(如 ID 12968),快速展示应用性能图表。

性能优化建议

  1. 调整百分位计算
    配置中的 percentiles 会增加计算开销,生产环境建议只保留关键百分位(如 0.95、0.99)。
  2. 禁用不必要的指标
    如果某些指标对监控无帮助,可以通过 management.metrics.enable.<metric-name>=false 禁用。
  3. 添加自定义标签
    为指标添加有业务意义的标签(如 serviceoperation),便于聚合和分析。
  4. 监控告警
    基于关键指标设置告警规则,例如:
    • HTTP 请求 95% 响应时间超过 1 秒
    • JVM 堆内存使用率超过 80%
    • 数据库连接池等待线程数持续大于 5

这种配置方式使 Spring Boot 应用能够无缝集成 Prometheus 监控系统,提供全面的应用性能指标,帮助开发者及时发现和解决问题。

相关推荐
毕设源码-钟学长1 分钟前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
CodeSheep程序羊16 分钟前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
程序员良许30 分钟前
三极管推挽输出电路分析
后端·嵌入式
Java水解36 分钟前
【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析
后端·spring
我是咸鱼不闲呀36 分钟前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
Java水解40 分钟前
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端
spring boot·后端
宫水三叶的刷题日记43 分钟前
工商银行今年的年终奖。。
后端
大黄评测1 小时前
双库协同,各取所长:.NET Core 中 PostgreSQL 与 SQLite 的优雅融合实战
后端
神云瑟瑟1 小时前
spring boot拦截器获取requestBody的最佳实践
spring boot·拦截器·requestbody
Java编程爱好者1 小时前
Java 后端定时任务怎么选:@Scheduled、Quartz 还是 XXL-Job?
后端