非入侵的全链路监控系统 代码达成案例分享
在我们的监控程序中,需要对各种模块进行监控;servlet、rpc、http、jdbc、redis、logic等,那么我们在设计监控程序时就需要对监控的程序进行模块化开发,可以在需要的时候进行组装配置即可,以方便我们监控程序的扩展和可控制性。这一章节我们把监控模块剥离,采用工厂模式进行调用{目前是静态工厂在我们实际使用中可以把工厂做成动态配置化}。 环境准备 IntelliJ IDEA Community Edition jdk1.8.0_45 64位 配置信息(路径相关修改为自己的) 配置位置:Run/Debug Configurations -> VM options 配置内容:-javaagent:E:\itstack\GIT\itstack.org\itstack-demo-agent\itstack-demo-agent-06\target\itstack-demo-agent-06-1.0.0-SNAPSHOT.jar=testargs 代码示例 itstack-demo-agent-06 pom.xml src main java org.itstack.demo.agent plugin impl jvm JvmAdvice.java JvmPlugin.java JvmStack.java link LinkAdvice.java LinkPlugin.java InterceptPoint.java IPlugin.java PluginFactory.java track Span.java TrackContext.java TrackManager.java MyAgent.java resources META-INF MANIFEST.MF test java org.itstack.demo.test ApiTest.java JvmAdvice.java /** * 公众号:bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */ public class JvmAdvice { @Advice.OnMethodExit() public static void exit() { JvmStack.printMemoryInfo(); JvmStack.printGCInfo(); } } JvmPlugin.java /** * 公众号:bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */ public class JvmPlugin implements IPlugin { @Override public String name() { return "jvm"; } @Override public InterceptPoint[] buildInterceptPoint() { return new InterceptPoint[]{ new InterceptPoint() { @Override public ElementMatcher<TypeDescription> buildTypesMatcher() { return ElementMatchers.nameStartsWith("org.itstack.demo.test"); } @Override public ElementMatcher<MethodDescription> buildMethodsMatcher() { return ElementMatchers.isMethod() .and(ElementMatchers.any() .and(ElementMatchers.not(ElementMatchers.nameStartsWith("main"))); } } }; } @Override public Class adviceClass() { return JvmAdvice.class; } } LinkAdvice.java /** * 公众号:bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */ public class LinkAdvice { @Advice.OnMethodEnter() public static void enter(@Advice.Origin("#t") String className, @Advice.Origin("#m") String methodName) { Span currentSpan = TrackManager.getCurrentSpan(); if (null == currentSpan) { String linkId = UUID.randomUUID().toString(); TrackContext.setLinkId(linkId); } TrackManager.createEntrySpan(); } @Advice.OnMethodExit() public static void exit(@Advice.Origin("#t") String className, @Advice.Origin("#m") String methodName) { Span exitSpan = TrackManager.getExitSpan(); if (null == exitSpan) return; System.out.println("链路追踪(MQ):" + exitSpan.getLinkId() + " " + className + "." + methodName + " 耗时:" + (System.currentTimeMillis() - exitSpan.getEnterTime().getTime()) + "ms"); } } LinkPlugin.java /** * 公众号:bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */ public class LinkPlugin implements IPlugin { @Override public String name() { return "link"; } @Override public InterceptPoint[] buildInterceptPoint() { return new InterceptPoint[]{ new InterceptPoint() { @Override public ElementMatcher<TypeDescription> buildTypesMatcher() { return ElementMatchers.nameStartsWith("org.itstack.demo.test"); } @Override public ElementMatcher<MethodDescription> buildMethodsMatcher() { return ElementMatchers.isMethod() .and(ElementMatchers.any()) .and(ElementMatchers.not(ElementMatchers.nameStartsWith("main"))); } } }; } @Override public Class adviceClass() { return LinkAdvice.class; } } InterceptPoint.java /** * 拦截点 * 公众号:bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */ public interface InterceptPoint { //类匹配规则 ElementMatcher<TypeDescription> buildTypesMatcher(); //方法匹配规则 ElementMatcher<MethodDescription> buildMethodsMatcher(); } IPlugin.java /** * 监控组件 * 公众号:bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */ public interface IPlugin { //名称 String name(); //监控点 InterceptPoint[] buildInterceptPoint(); //拦截器类 Class adviceClass(); } (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |