当前位置: 首页 > article >正文

PDF书籍《手写调用链监控APM系统-Java版》第10章 插件与链路的结合:SpringBoot环境插件获取应用名

本人阅读了 Skywalking 的大部分核心代码,也了解了相关的文献,对此深有感悟,特此借助巨人的思想自己手动用JAVA语言实现了一个 “调用链监控APM” 系统。本书采用边讲解实现原理边编写代码的方式,看本书时一定要跟着敲代码。

作者已经将过程写成一部书籍,奈何没有钱发表,如果您知道渠道可以联系本人。一定重谢。

本书涉及到的核心技术与思想

JavaAgent , ByteBuddy,SPI服务,类加载器的命名空间,增强JDK类,kafka,插件思想,切面,链路栈等等。实际上远不止这么多,差不多贯通了整个java体系。

适用人群

自己公司要实现自己的调用链的;写架构的;深入java编程的;阅读Skywalking源码的;

版权

本书是作者呕心沥血亲自编写的代码,不经同意切勿拿出去商用,否则会追究其责任。

原版PDF+源码请见:

本章涉及到的工具类也在这里面:

PDF书籍《手写调用链监控APM系统-Java版》第1章 开篇介绍-CSDN博客

第10章 插件与链路的结合:SpringBoot环境插件获取应用名

由于我们上报给kafka的数据中serviceName为空,所以制作了springboot的环境插件,用来填充serviceName。

要想获取到springboot的环境配置,需要拦截的信息如下:

类名:org.springframework.boot.SpringApplication

方法:prepareEnvironment

非JDK类库

下面来开发这个插件,要记住前面说的插件开发四部曲。在插件模块下新增app-enviroment-plugin项目,hadluo-apm-plugin.def内容如下:

app-names=com.hadluo.apm.enviroment.AppNamesInstrumentation

AppNamesInstrumentation代码如下:

public class AppNamesInstrumentation extends AbstractClassEnhancePluginDefine {
    @Override
    public String enhanceClass() {
        return "org.springframework.boot.SpringApplication";
    }
    @Override
    public MethodsInterceptPoint[] configMethodsInterceptPoint() {
        return new MethodsInterceptPoint[]{
                new MethodsInterceptPoint() {
                    @Override
                    public ElementMatcher<MethodDescription> getMethodsMatcher() {
                        // 拦截 prepareEnvironment 方法
                        return ElementMatchers.named("prepareEnvironment");
                    }
                    @Override
                    public String getMethodsInterceptor() {
                        // 拦截逻辑执行的拦截器
                        return "com.hadluo.apm.enviroment.AppNamesInterceptor";
                    }
                    @Override
                    public boolean isOverrideArgs() {
                        return false;
                    }
                }
        };
    }
}

AppNamesInterceptor 代码如下:

public class AppNamesInterceptor implements InstanceMethodsAroundInterceptor {

    @Override
    public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable {
        ConfigurableEnvironment environment = (ConfigurableEnvironment) ret;
        Config.Agent.serviceName = environment.getProperty("spring.application.name");
        return ret;
    }
}

SpringApplication#prepareEnvironment这个方法结束后,就已经完成了配置文件等的解析存储,信息都是存储到返回值ConfigurableEnvironment 对象上面。我们直接获取就可以了,然后设置到我们的配置Config.Agent.serviceName里面 。

修改controller接口为一个空接口,主要是看serverName有没有获取到,打包测试:


http://www.kler.cn/a/454294.html

相关文章:

  • Flink CDC MySQL 同步数据到 Kafka实践中可能遇到的问题
  • 【Linux系统编程】:信号(4)——信号的处理
  • 学习 Python 编程的规则与风格指南
  • js版本之ES6特性简述【Proxy、Reflect、Iterator、Generator】(五)
  • Speckly:基于Speckle文档的RAG智能问答机器人
  • LabVIEW生物医学信号虚拟实验平台
  • Uniapp 微信小程序检测新版本并更新
  • 数据分析的常见问题及解决方案
  • 安全合规遇 AI 强援:深度驱动行业发展新引擎 | 倍孜网络CEO聂子尧出席ICT深度观察报告会!
  • C++-----------映射
  • Java Spring Boot 项目中嵌入前端静态资源:完整教程与实战案例
  • 模板方法、观察者模式、策略模式
  • Security知识点分享之高级安全安装虚拟机
  • 电商数据的安全与隐私保护:API接口的角色
  • 开源代码寻找平台总结
  • 【数据结构】【线性表】栈在算术表达式中的应用
  • McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构
  • 分布式 IO 模块助力冲压机械臂产线实现智能控制
  • 基于python+django的旅游信息网站-旅游景点门票管理系统
  • 树莓集团:数字化产业园建设运营推动数字经济
  • 极狐GitLab 17.7正式发布,可从 GitLab 丝滑迁移至极狐GitLab【二】
  • “鼎和财险一体化数据安全管控实践”入选信通院金融领域优秀案例
  • QT样式学习-侧边栏隐藏和滑出
  • c# RSA加解密工具,.netRSA加解密工具
  • 【唐叔学算法】第20天:归并之道-二路归并与多路归并排序的Java实现及性能解析
  • 结合大语言模型的异常检测方法研究