服务端增加代码:
2019-10-22更新:
不过这么貌似是获取的服务端自身的信息,这就很尴尬了……
@Component
public class CpuMetricsEvent {
@Autowired
private MeterRegistry meterRegistry;
private String metricsType = "";
public void setMetricsType(String metricsType) {
this.metricsType = metricsType;
}
/**
* 获取actuator端点信息
*
* @return
*/
@PostConstruct
public double init() {
double value;
Gauge gauge = Gauge.builder(metricsType, this, CpuMetricsEvent::getProcessCpuLoad)
.baseUnit("%")
.description("CPU Load")
.register(meterRegistry);
value = gauge.value();
return value;
}
/**
* 1,当Gauge.builder的name参数为""时执行(不是null)
* 2,当name的类型是process_cpu_load
* 默认获取cpu的加载率
*
* @return
*/
public Double getProcessCpuLoad() {
try {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = ObjectName.getInstance("java.lang:type=OperatingSystem");
AttributeList list = mbs.getAttributes(name, new String[]{"ProcessCpuLoad"});
return Optional.ofNullable(list)
.map(l -> l.isEmpty() ? null : l)
.map(List::iterator)
.map(Iterator::next)
.map(Attribute.class::cast)
.map(Attribute::getValue)
.map(Double.class::cast)
.orElse(null);
} catch (Exception ex) {
return null;
}
}
}
此代码会在admin项目启动时执行一次,需要启动定时任务进行多次执行
/**
* 定时监控CPU和内存使用率(异常则发送邮件)
*/
@Scheduled(cron = "0/10 * * * * ?")
public void monitorCPU() {
System.out.println("定时监控CPU和内存使用率任务开启");
cpuMetricsEvent.setMetricsType(MetricsConstant.PROCESS_CPU_LOAD);
double cpuUsage = cpuMetricsEvent.init();
logger.info("cpuUsage:" + cpuUsage);
if (cpuUsage > 85) {
NotifyUtils.dingTalkNotify("", "");
}
// long memoryUsage = cpuMetricsEvent.init();
// System.out.println("memoryUsage:" + memoryUsage);
// if ((memoryUsage / 1024) < 100) {
// NotifyUtils.dingTalkNotify("", "");
// }
}
参考资料:https://xbuba.com/questions/37985719