1. 简介
在日常开发中一些关键的业务服务,期望在高并发状态下可以正常工作,或在异常情况时可以记录当时的性能信息,所以就需要进行监控。常见的监控例如:Prometheus可以实现这个需求,如果需要更加简单方便的自主监控能力,可以引入本博客中的方案。
2. 相关博客
Promtail+Loki+Grafana搭建轻量级日志管理平台SpringBoot 2.x + Prometheus + Grafana 实现应用监控
3. 示例代码
创建项目 修改pom.xml
4.0.0
com.c3stones
spring-boot-monitor-demo
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.7.8
cn.hutool
hutool-core
5.8.12
com.alibaba.fastjson2
fastjson2
2.0.24
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-maven-plugin
配置定时巡检预警阈值 在resources下新建配置文件application.yml。
# 预警配置
monitor:
warn:
enabled: true
cpu:
stage1: 85
stage2: 95
memory:
stage1: 85
stage2: 95
disk:
stage1: 85
stage2: 95
创建预警配置
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 预警配置
*
* @author CL
*/
@Getter
@Component
public class WarnConfig {
/**
* 预警开关
*/
@Value("${monitor.warn.enabled:true}")
private Boolean enabled;
/**
* CPU - 阶段1
*/
@Value("${monitor.warn.cpu.stage1:85}")
private Double cpuStage1;
/**
* CPU - 阶段2
*/
@Value("${monitor.warn.cpu.stage2:95}")
private Double cpuStage2;
/**
* 内存 - 阶段1
*/
@Value("${monitor.warn.memory.stage1:85}")
private Double memoryStage1;
/**
* 内存 - 阶段2
*/
@Value("${monitor.warn.memory.stage2:95}")
private Double memoryStage2;
/**
* 磁盘 - 阶段1
*/
@Value("${monitor.warn.disk.stage1:85}")
private Double diskStage1;
/**
* 磁盘 - 阶段2
*/
@Value("${monitor.warn.disk.stage2:95}")
private Double diskStage2;
}
创建预警状态枚举
import cn.hutool.core.util.NumberUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
/**
* 预警状态枚举类
*
* @author CL
*/
@Getter
@AllArgsConstructor
public enum WarnSateEnum {
/**
* 正常
*/
GREEN(1),
/**
* 警告
*/
YELLOW(2),
/**
* 紧急
*/
RED(3),
;
private final int value;
/**
* 根据值获取枚举
*
* @param value 值
* @return {@link WarnSateEnum}
*/
public static WarnSateEnum findByValue(Integer value) {
if (Objects.nonNull(value)) {
for (WarnSateEnum warnState : values()) {
if (NumberUtil.equals(warnState.getValue(), value)) {
return warnState;
}
}
}
return GREEN;
}
/**
* 获取高优先级
*
* @param warnSateEnum 预警状态
* @return
*/
public WarnSateEnum max(WarnSateEnum warnSateEnum) {
if (Objects.nonNull(warnSateEnum)) {
return findByValue(Math.max(this.value, warnSateEnum.value));
}
return this;
}
}
创建字节转文本工具类
/**
* 字节转换工具类
*
* @author CL
*/
public class ByteUtil {
private static final int UNIT = 1024;
/**
* 格式化字节大小
*
* @param byteSize 字节大小
* @return {@link String}
*/
public static String formatByteSize(long byteSize) {
if (byteSize |