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.hezhangjian.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() { |