扩展JavaMelod支持自定义监控点

简介: 扩展JavaMelod支持自定义监控点

背景

一直在使用一款轻量级的APM监控工具:Javamelody。使用简单,监控数据还是挺多维度的,定期拉出来分析还是一件很有价值的事情。

但是Javamelody本身只对Http与Spring托管对象监控,还有很多我们自己的工具类或基础库没法监控起来。在阅读其部分源码后,写了一个扩展类,实现了监控项目的自定义操作。


话不多说,直接上代码:

代码

packagenet.bull.javamelody;//因MonitoringProxy类定义为了Package。此处的Package名称需要与net.bull.javamelody保持一置importlombok.extern.slf4j.Slf4j;
importnet.bull.javamelody.internal.model.Counter;
/**javamelody监控代理。在javamelody的基础上扩展部分监控项,用于一些自定义场景[或方法]的监控点。* @author heshengchao*/@Slf4jpublicclassBusMonitorProxy {
/**默认Counter 都放到Spring下面* @return*/publicstaticCountergetCounter() {
returnMonitoringProxy.getSpringCounter();
     }
/** 自定义监控点* @param monitorName 业务监控点名称* @param call 回调函数* @throws Exception */publicstaticvoidmonitor(StringmonitorName,Functioncall) {
booleansystemError=false;//主要用于标记方法执行期间是否产生的异常。try {
getCounter().bindContextIncludingCpu(monitorName);
call.call();
        }catch (Throwablee) {
systemError=true;
thrownewRuntimeException(e);
        } finally {
getCounter().addRequestForCurrentContext(systemError);
        }
    }
/** 自定义监控点【执行完成后,需要将返回值】* @param <T>* @param monitorName 业务监控点名称* @param call 回调函数* @throws Exception */publicstatic<T>TmonitorAndReturn(StringmonitorName,Callback<T>call) {
booleansystemError=false;
try {
getCounter().bindContextIncludingCpu(monitorName);
returncall.call();
        }catch (Throwablee) {
systemError=true;
thrownewRuntimeException(e);
        } finally {
getCounter().addRequestForCurrentContext(systemError);
        }
    }
/**不需要返回值的回调接口定义* @author heshengchao* @param <T>*/@FunctionalInterfacepublicstaticinterfaceFunction {
voidcall();
    }
/**需要返回值的回调接口定义* @author heshengchao* @param <T>*/@FunctionalInterfacepublicstaticinterfaceCallback<T> {
Tcall() ;
    }
}

使用示例说明

importnet.bull.javamelody.BusMonitorProxy;
publicclassBusMonitorProxyTest {
Stringurl="";
/** 验证直接监控方法 */@TestpublicvoidtestMonitor() {
BusMonitorProxy.monitor("post.url("+url+")", () -> {
// do something.        });
    }
/** 验证需要得到响应的监控 */@TestpublicvoidtestMonitorAndReturn() {
booleanresult=BusMonitorProxy.monitorAndReturn("post.url("+url+")", () -> {
// do something.returntrue;
        });
    }
}

最后效果

image.png

目录
相关文章
|
7月前
|
安全 编译器 程序员
C++对C的扩展(下)
C++对C的扩展
59 0
|
3月前
|
JavaScript
扩展|2-10
扩展|2-10
|
7月前
|
安全 程序员 编译器
C++对C的扩展(上)
C++对C的扩展
63 0
|
7月前
ES6对象新增了哪些扩展?
ES6对象新增了哪些扩展?
67 0
|
7月前
|
网络架构
ES6函数新增了哪些扩展?
ES6函数新增了哪些扩展?
62 0
ES6中对象新增了哪些扩展?
ES6中,当对象键名与对应值名相等的时候,可以进行简写
|
C语言 C++ 容器
|
存储 C#
扩展按钮图标
扩展按钮图标
440 1
扩展按钮图标
EMQ
|
SQL JSON 监控
连接格式优化,支持自定义
12月eKuiper团队继续专注于1.8.0版本新功能的开发,重构了外部连接(source/sink)的格式机制,更加清晰地分离了连接、格式和Schema,同时支持了格式的自定义。
EMQ
141 0
连接格式优化,支持自定义
EMQ
|
消息中间件 自然语言处理 Java
JMeter 扩展插件实现对自定义协议的支持
本文作为JMeter拓展开发的第四期内容,将以扩展一个简单的Apache Kafaka Producer Sampler为例,介绍如何使用JMeter扩展插件实现更完善的新协议插件。
EMQ
284 0
JMeter 扩展插件实现对自定义协议的支持