非入侵的全链路监控系统,代码实现案例分享
案例简述
在我们的非入监控程序中,需要对各种模块进行监控;servlet、侵的源码库全链rpc 、监例分http 、控系jdbc 、香港云服务器统代redis 、码实logic等 ,现案享那么我们在设计监控程序时就需要对监控的免费模板非入程序进行模块化开发 ,可以在需要的侵的高防服务器全链时候进行组装配置即可 ,以方便我们监控程序的监例分扩展和可控制性。源码下载这一章节我们把监控模块剥离 ,控系采用工厂模式进行调用{目前是统代静态工厂在我们实际使用中可以把工厂做成动态配置化} 。亿华云
环境准备
IntelliJ IDEA Community Editionjdk1.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.java1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.JvmAdvice.java
复制/** * 公众号 :bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */public class JvmAdvice { @Advice.OnMethodExit() public static void exit() { JvmStack.printMemoryInfo(); JvmStack.printGCInfo(); }}1.2.3.4.5.6.7.8.9.10.11.12.13.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; }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.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");
}
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.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; }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.InterceptPoint.java
复制/** * 拦截点 * 公众号 :bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */public interface InterceptPoint { //类匹配规则
ElementMatcher<TypeDescription> buildTypesMatcher(); //方法匹配规则
ElementMatcher<MethodDescription> buildMethodsMatcher();}1.2.3.4.5.6.7.8.9.10.11.12.13.14.IPlugin.java
复制/** * 监控组件 * 公众号 :bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */public interface IPlugin { //名称
String name(); //监控点
InterceptPoint[] buildInterceptPoint(); //拦截器类
Class adviceClass();}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.PluginFactory.java
复制/** * 公众号 :bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */public class PluginFactory { public static List<IPlugin> pluginGroup = new ArrayList<>(); static { //链路监控
pluginGroup.add(new LinkPlugin()); //Jvm监控
pluginGroup.add(new JvmPlugin()); }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.TrackManager.java
复制/** * 追踪管控 * 公众号:bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */public class TrackManager { private static final ThreadLocal<Stack<Span>> track = new ThreadLocal<>(); private static Span createSpan() { Stack<Span> stack = track.get(); if (stack == null) { stack = new Stack<>(); track.set(stack); } String linkId; if (stack.isEmpty()) { linkId = TrackContext.getLinkId(); if (linkId == null) { linkId = "nvl"; TrackContext.setLinkId(linkId); } } else { Span span = stack.peek(); linkId = span.getLinkId(); TrackContext.setLinkId(linkId); } return new Span(linkId); } public static Span createEntrySpan() { Span span = createSpan(); Stack<Span> stack = track.get(); stack.push(span); return span; } public static Span getExitSpan() { Stack<Span> stack = track.get(); if (stack == null || stack.isEmpty()) { TrackContext.clear(); return null; } return stack.pop(); } public static Span getCurrentSpan() { Stack<Span> stack = track.get(); if (stack == null || stack.isEmpty()) { return null; } return stack.peek(); }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.MyAgent.java
复制/** * 公众号 :bugstack虫洞栈 {获取学习源码} * create by fuzhengwei on 2019 */public class MyAgent { //JVM 首先尝试在代理类上调用以下方法
public static void premain(String agentArgs, Instrumentation inst) { System.out.println("基于javaagent链路追踪{源码微信公众号:bugstack虫洞栈}"); System.out.println("==========================================================\r\n"); AgentBuilder agentBuilder = new AgentBuilder.Default(); List<IPlugin> pluginGroup = PluginFactory.pluginGroup; for (IPlugin plugin : pluginGroup) { InterceptPoint[] interceptPoints = plugin.buildInterceptPoint(); for (InterceptPoint point : interceptPoints) { AgentBuilder.Transformer transformer = (builder, typeDescription, classLoader, javaModule) -> { builder = builder.visit(Advice.to(plugin.adviceClass()).on(point.buildMethodsMatcher())); return builder; }; agentBuilder = agentBuilder.type(point.buildTypesMatcher()).transform(transformer).asDecorator(); } } //监听
AgentBuilder.Listener listener = new AgentBuilder.Listener() {@Override
public void onDiscovery(String s, ClassLoader classLoader, JavaModule javaModule, boolean b) { }@Override
public void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule, boolean b, DynamicType dynamicType) { System.out.println("onTransformation :" + typeDescription); }@Override
public void onIgnored(TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule, boolean b) { }@Override
public void onError(String s, ClassLoader classLoader, JavaModule javaModule, boolean b, Throwable throwable) { }@Override
public void onComplete(String s, ClassLoader classLoader, JavaModule javaModule, boolean b) { } }; agentBuilder.with(listener).installOn(inst); }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.MANIFEST.MF
复制Manifest-Version: 1.0
Premain-Class: org.itstack.demo.agent.MyAgent
Can-Redefine-Classes: true1.2.3.ApiTest.java
复制** *链路追踪
*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
* *按需打开需要测试的模块
*链路监控
* pluginGroup.add(new LinkPlugin()); *Jvm监控
* pluginGroup.add(new JvmPlugin()); * * 博客:http://itstack.org * 论坛 :http://bugstack.cn *公众号:bugstack虫洞栈 {获取学习源码}
* create by fuzhengwei on 2019 * */public class ApiTest { public static void main(String[] args) { //线程一
new Thread(() -> new ApiTest().http_lt1("哪咤")).start(); //线程二
new Thread(() -> { new ApiTest().http_lt2("悟空"); }).start(); } public void http_lt1(String name) { try { Thread.sleep((long) (Math.random() * 500)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("测试结果 :hi1 " + name); http_lt2(name); } public void http_lt2(String name) { try { Thread.sleep((long) (Math.random() * 500)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("测试结果:hi2 " + name); http_lt3(name); } public void http_lt3(String name) { try { Thread.sleep((long) (Math.random() * 500)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("测试结果:hi3 " + name); }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.测试结果
复制基于javaagent链路追踪{源码微信公众号:bugstack虫洞栈}
==========================================================onTransformation :class org.itstack.demo.test.ApiTest测试结果 :hi2 悟空
测试结果:hi1 哪咤
测试结果 :hi3 悟空
链路追踪(MQ) :608a1cbf-ef1f-4195-bdc7-c3729a114f8d org.itstack.demo.test.ApiTest.http_lt3耗时:111ms
测试结果 :hi2 哪咤
init: 192MB max: 2708MB used: 43MB committed: 184MB use rate: 23%init: 2MB max: 0MB used: 13MB committed: 14MB use rate: 95%name: PS Scavenge count:0 took:0 pool name:[PS Eden Space, PS Survivor Space]name: PS MarkSweep count:0 took:0 pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]-------------------------------------------------------------------------------------------------链路追踪(MQ):608a1cbf-ef1f-4195-bdc7-c3729a114f8d org.itstack.demo.test.ApiTest.http_lt2耗时:338ms
init: 192MB max: 2708MB used: 43MB committed: 184MB use rate: 23%init: 2MB max: 0MB used: 13MB committed: 14MB use rate: 95%name: PS Scavenge count:0 took:0 pool name:[PS Eden Space, PS Survivor Space]name: PS MarkSweep count:0 took:0 pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]-------------------------------------------------------------------------------------------------测试结果:hi3 哪咤
链路追踪(MQ):2f28ed75-650a-4f0f-bd69-fe0709a8985e org.itstack.demo.test.ApiTest.http_lt3耗时:221ms
init: 192MB max: 2708MB used: 43MB committed: 184MB use rate: 23%init: 2MB max: 0MB used: 13MB committed: 14MB use rate: 95%name: PS Scavenge count:0 took:0 pool name:[PS Eden Space, PS Survivor Space]name: PS MarkSweep count:0 took:0 pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]-------------------------------------------------------------------------------------------------链路追踪(MQ):2f28ed75-650a-4f0f-bd69-fe0709a8985e org.itstack.demo.test.ApiTest.http_lt2耗时:316ms
init: 192MB max: 2708MB used: 43MB committed: 184MB use rate: 23%init: 2MB max: 0MB used: 13MB committed: 14MB use rate: 95%name: PS Scavenge count:0 took:0 pool name:[PS Eden Space, PS Survivor Space]name: PS MarkSweep count:0 took:0 pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]-------------------------------------------------------------------------------------------------链路追踪(MQ):2f28ed75-650a-4f0f-bd69-fe0709a8985e org.itstack.demo.test.ApiTest.http_lt1耗时 :547ms
init: 192MB max: 2708MB used: 43MB committed: 184MB use rate: 23%init: 2MB max: 0MB used: 13MB committed: 14MB use rate: 95%name: PS Scavenge count:0 took:0 pool name:[PS Eden Space, PS Survivor Space]name: PS MarkSweep count:0 took:0 pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]-------------------------------------------------------------------------------------------------Process finished with exit code 01.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.相关文章
Dota 2的玩家注意了,你使用的游戏模式很可能被黑客盯上了。2月13日消息,未知的威胁行为者为 Dota 2 游戏创建了恶意游戏模式,这些模式可能已经被利用来建立对玩家系统的后门访问。威胁行为者利用2025-12-07
新勒索软件RedAlert来袭!已有Windows、Linux等服务器中招
根据BleepingComputer消息,一种名为RedAlert的新勒索软件对企业网络进行攻击,目前已经有Windows和Linux VMWare ESXi系统中招。MalwareHunterTea2025-12-07
“快去看看你的 QQ 号,你号被盗了!”一觉醒来,发现自己的 QQ 给爸妈、同学甚至是暗恋对象发了一堆黄图,以至于被举报、被封,被人挂上 QQ 空间,这样的社死现场,可能就是很多人昨天早上正在经历的绝2025-12-07
6月27日,“QQ回应大批账号被盗”事件登上某平台热搜。6月26日晚,许多网友反映自己或朋友的QQ被盗了,并且发布或接收到多条色情图片、黄色网站链接。对此,腾讯QQ在6月27日午间回应称,主要原因系用2025-12-07
在大流行后的复苏世界中,互联性和数字化继续以前所未有的速度加速。随着先进技术的渗透和工业设备的互联,组织越来越依赖运营技术(OT)来保持业务运营和竞争力。此外,在许多情况下,这些进步已经成为推动新收入2025-12-07
勒索软件攻击持续占据头条新闻,“Lapsus$”和“Conti”等组织频繁出现在一系列令人震惊的事件中。勒索软件攻击总是有新的发展趋势,让网络安全专业人员不得不保持警惕。勒索软件攻击已成为网络攻击者使2025-12-07

最新评论