Spring Boot 版本需要2.0.0或更高版本。
添加Micrometer Prometheus registry依赖:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
在application.properties中开启prometheus端点:
management.endpoints.web.exposure.include=health,prometheus,metrics
做完上述配置后,Actuator就可以通过Micrometer获取到JVM的GC指标,其中包括:
- jvm.gc.live.data.size (Full GC前老年代大小)
- jvm.gc.memory.promoted (GC期间晋升大小)
- jvm.gc.max.data.size (Full GC后老年代大小)
原始指标 jvm_gc_live_data_size_bytes
表示 JVM 堆内存中存活的数据大小(GC 前老年代的内存使用大小)。
groups:
- name: jvm.rules
rules:
- alert: JVMFullGcCountTooMuchIn1d
expr: sum(changes(jvm_gc_live_data_size_bytes[5m])<0.9)by (namespace,application,env)>1
for: 0m
labels:
severity: warning
team: application
annotations:
summary: "full GC次数>1次"
description: "(env: {{ $labels.env }})应用{{ $labels.application }}full GC次数为{{ $value }}次 \n"
这个 PromQL 表达式的作用是计算最近5分钟内,jvm_gc_live_data_size_bytes 指标变化小于0.9的次数。
具体解释:
- changes(jvm_gc_live_data_size_bytes[5m]) 计算最近5分钟的存活数据大小的变化比例。
- changes(jvm_gc_live_data_size_bytes[5m]) < 0.9 表示变化比例小于0.9,即减少超过10%。
- sum(…) 对上一步的比较结果求和,即统计变化比例小于0.9的次数。
- sum(…) > 1 表示最近5分钟内,变化幅度超过10%的次数大于1。
通常老年代内存数据大小的明显下降,意味着发生了 Full GC。
所以这个表达式的作用就是检测最近5分钟内是否发生过多次 Full GC。
通过设置不同的时间范围和变化比例阈值,可以根据需要检测 Full GC 情况。
这个表达式利用了 Prometheus 的聚合查询功能,可以实现对 GC 行为的监控检测。