加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 服务器 > 安全 > 正文

非入侵的全链路监控系统 代码达成案例分享

发布时间:2023-08-25 11:10:49 所属栏目:安全 来源:
导读:在我们的监控程序中,需要对各种模块进行监控;servlet、rpc、http、jdbc、redis、logic等,那么我们在设计监控程序时就需要对监控的程序进行模块化开发,可以在需要的时候进行组装配置即可,以方便我们监控程序的扩

在我们的监控程序中,需要对各种模块进行监控;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();

}

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章