SpringBoot服务监控机制,总算整明白了!
码农突围
共 6025字,需浏览 13分钟
·
2022-03-10 21:01
这里是码农充电第一站,回复“666”,获取一份专属大礼包 真爱,请设置“星标”或点个“在看”
文章来源:http://u6.gg/kqmhz
SpringBoot 监控
| HTTP Endpoints 监控
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
dependencies>
内置端点
management:
endpoints:
web:
exposure:
include: [health,info,mappings] //或者直接配置 "*"
management.endpoint.<id>.enabled=true
health 端点
management:
endpoint:
health:
show-details: always
loggers 端点
metrics 端点
自定义监控端点
@Endpoint:定义一个监控端点,同时支持 HTTP 和 JMX 两种方式。
@WebEndpoint:定义一个监控端点,只支持 HTTP 方式。
@JmxEndpoint:定义一个监控端点,只支持 JMX 方式。
@ReadOperation:作用在方法上,可用来返回端点展示的信息(通过 Get 方法请求)。
@WriteOperation:作用在方法上,可用来修改端点展示的信息(通过 Post 方法请求)。
@DeleteOperation:作用在方法上,可用来删除对应端点信息(通过 Delete 方法请求)。
@Selector:作用在参数上,用来定位一个端点的具体指标路由。
来,一起写一个自己的监控端点,定义一个类,并使用 @Endpoint 注解标注标识,同时定义几个方法用 @ReadOperation 和 @WriteOperation 注解来标注:
@Endpoint(id="myEndpoint")
@Component
public class MyEndpoint {
private String STATUS = "up";
private String DETAIL = "一切正常";
// @ReadOperation
// public String test1(){
// return "wolf";
// }
// @ReadOperation
// public Maptest2(){
// Mapmap = new HashMap();
// map.put("status","up");
// return map;
// }
@ReadOperation
public JSONObject test3(){
JSONObject jsonObject= new JSONObject();
jsonObject.put("status",STATUS);
jsonObject.put("detail",DETAIL);
return jsonObject;
}
@ReadOperation
public JSONObject test3_1(@Selector String name){
JSONObject jsonObject= new JSONObject();
if ("status".equals(name)){
jsonObject.put("status",STATUS);
}else if ("detail".equals(name)){
jsonObject.put("detail",DETAIL);
}
return jsonObject;
}
@WriteOperation//动态修改指标
public void test4(@Selector String name,@Nullable String value){
if (!StringUtils.isEmpty(value)){
if ("status".equals(name)){
STATUS = value;
}else if ("detail".equals(name)){
DETAIL = value;
}
}
}
}
| JMX 监控
如何手动注册一个 JMX MBean?
定义一个接口 SystemInfoMBean(注意名字必须要用 MBean 结尾):
public interface SystemInfoMBean {
int getCpuCore();
long getTotalMemory();
void shutdown();
}
再定义一个类实现 SystemInfoMBean 接口,实现类的明明方式为接口名去掉 MBean:
public class SystemInfo implements SystemInfoMBean {
@Override
public int getCpuCore() {
return Runtime.getRuntime().availableProcessors();
}
@Override
public long getTotalMemory() {
return Runtime.getRuntime().totalMemory();
}
@Override
public void shutdown() {
System.exit(0);
}
}
最后就是需要将该实现类进行注册:
public class JmxRegisterMain {
public static void main(String[] args) throws NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, MalformedObjectNameException, IOException {
MBeanServer mBeanServer= ManagementFactory.getPlatformMBeanServer();
ObjectName objectName=new ObjectName("com.lonely.wolf.note.springboot.actuator.jmx:type=SystemInfo");
SystemInfo SystemInfo =new SystemInfo();
mBeanServer.registerMBean(SystemInfo,objectName);//注册
System.in.read();//防止程序结束
}
}
<dependency>
<groupId>io.micrometergroupId>
<artifactId>micrometer-registry-prometheusartifactId>
dependency>
总结
码农突围资料链接
1、卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
2、计算机基础知识总结与操作系统 PDF 下载
3、艾玛,终于来了!《LeetCode Java版题解》.PDF
4、Github 10K+,《LeetCode刷题C/C++版答案》出炉.PDF欢迎添加鱼哥个人微信:smartfish2020,进粉丝群或围观朋友圈
评论