非入侵的全链路监控系统,代码实现案例分享

  发布时间:2025-12-07 19:55:29   作者:玩站小弟   我要评论
案例简述在我们的监控程序中,需要对各种模块进行监控;servlet、rpc、http、jdbc、redis、logic等,那么我们在设计监控程序时就需要对监控的程序进行模块化开发,可以在需要的时候进行 。

案例简述

在我们的非入监控程序中,需要对各种模块进行监控;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.
  • Tag:

相关文章

  • 网络安全框架:CSF五个功能

    ​概述本学习模块深入了解网络安全框架的五个功能:识别、保护、检测、响应和恢复。此处提供的信息建立在“框架组件”模块中介绍的材料之上。本模块探讨框架内功能的价值,以及每个功能中包含的内容。功能介绍框架核
    2025-12-07
  • 菜鸟重装系统教程(手把手教你如何重装系统,菜鸟也能搞定!)

    随着电脑使用时间的增加,我们可能会遇到各种各样的问题,比如系统崩溃、运行缓慢等。这时候重装系统就是解决问题的一种有效方法。然而,对于很多菜鸟来说,重装系统可能是一项困难的任务。本文将以菜鸟重装系统教程
    2025-12-07
  • 飞书收集表中导入Excel表格的方法

    很多小伙伴之所以喜欢使用飞书软件,就是因为这款软件中的功能十分的丰富,不仅能够帮助我们进行日常的考勤管理,还能够创建各种格式的在线文档以及收集表。有的小伙伴在使用飞书软件的过程中想要在收集表中导入ex
    2025-12-07
  • 如何准确区分泰迪的年龄?(探索泰迪幼犬与成年犬之间的细微差别)

    泰迪是一种受欢迎的犬种,但随着年龄的增长,它们的外貌和行为也会发生变化。了解如何准确地区分泰迪的年龄对于养护和照顾它们至关重要。本文将探讨泰迪幼犬与成年犬之间的细微差别,并提供一些方法来帮助您确定泰迪
    2025-12-07
  • 智能恒温器存在网络安全风险吗?

    智能恒温器是最受欢迎的智能家居设备之一,原因很容易理解。它们方便、环保、省钱,甚至可以改善空气质量。不过,与所有物联网(IoT)设备一样,它们也会带来一些网络安全问题。如果正在考虑购买或已经拥有智能恒
    2025-12-07
  • Android L与Android 4.4截图对比

    谷歌在Google I/O大会发布了全新安卓系统Android L,界面发生了非常大的变化,彻底的扁平化,并且增加了很多好用的功能。并且设置ART模式为首选模式,运行速度提高两倍,支持64位。而Mat
    2025-12-07

最新评论