java指标统计方案及代码
java 根据线程统计CPU#
设计思路#
java的ThreadMXBean可以获取每个线程CPU执行的nanoTime,那么可以以这个为基础,除以中间系统经过的纳秒数,就获得了该线程的CPU
占比
编码#
首先,我们定义一个结构体,用来存放一个线程上次统计时的纳秒数和当时的系统纳秒数
1 | import lombok.Data; |
然后我们在SpringBoot中定义一个定时任务,它将定时地统计计算每个线程的CPU信息,并输出到MeterRegistry
,当你调用SpringActuator
的接口时,你将能获取到这个指标。
1 | import com.google.common.util.concurrent.AtomicDouble; |
其他配置#
依赖配置#
pom
文件中
1 | <dependency> |
Prometheus接口配置#
application.yaml
中
1 | management: |
效果#
通过curl
命令调用curl localhost:20001/actuator/prometheus|grep cpu
1 | jvm_threads_cpu{threadName="RMI Scheduler(0)",} 0.0 |
Java计算磁盘使用率#
https://support.huaweicloud.com/bestpractice-bms/bms_bp_2009.html
华为云文档上的材料值得学习。
翻阅资料
1 | https://www.kernel.org/doc/Documentation/ABI/testing/procfs-diskstats |
这就意味着如果我想统计一个磁盘在一定周期内的利用率,只需要对这两个数字做差,除以统计的间隔,即就是这段时间内磁盘的利用率
1 | cat /proc/diskstats |
样例代码
1 | package com.github.shoothzj.demo.metrics; |
打印CPU使用#
1 | private static void printCpuUsage() { |
打印线程堆栈#
1 | private static void printThreadDump() { |
打印内存统计信息#
引入依赖
1 | <dependency> |
1 | private static void printClassHisto() { |
打印死锁#
javadoc中指出,这是一个开销较大的操作
1 | private static void printDeadLock() { |