Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初到武汉,向你敬礼-salute|顺便解决个SkyWalking问题

初到武汉,向你敬礼-salute|顺便解决个SkyWalking问题

作者头像
狼王编程
发布于 2021-06-01 08:02:41
发布于 2021-06-01 08:02:41
1.1K0
举报
文章被收录于专栏:狼王编程之路狼王编程之路

「武汉,我向你敬礼-salute」

「前言」

上周六我正津津有味的看着「拆弹专家2」,刘德华扮演的“潘乘风”从片头的正义,凌然,到失去一条腿之后的厌世,愤恨,到后来的失忆,直到最后的自我救赎,真的很刺激啊,可是这个时候电话响了「出差武汉」,好吧,看完剩下的影片,吃个饭,回家开始订酒店,订机票,收拾行李,第二天出发武汉

解决问题

这次来「武汉」,工作就是进行架构对接,对各种组件的相关问题进行沟通和协商,然后对方就抛出了一个「问题」,这个「问题」呢主要来源于「SkyWalking」这个「分布式链路追踪」「SkyWalking」这个组件我也看到最近有好多文章都写了,后面我也会单独写一篇来介绍一下,这次主要来看看这个问题,它到底怎么解决

遇到的问题

1.使用「SkyWalking Agent」时,某些其他代理(例如「Arthas」)无法正常工作

2.Java代理重新转换类在「SkyWalking」代理上失败

原因

Java应用程序启动时,「SkyWalking」代理使用ByteBuddy转换类。ByteBuddy每次都会生成具有不同随机名称的辅助类。

当另一个Java代理重新转换相同的类时,它将触发「SkyWalking」代理再次增强该类。更改了由ByteBuddy重新生成的字节码,修改了字段和导入的类名,有关类字节码的JVM验证失败,导致重新转换失败。

解决方案

1.首先「SkyWalking」的版本需要升级到8.1版本之上

2.启用类缓存功能 添加JVM参数:-Dskywalking.agent.is_cache_enhanced_class=true -Dskywalking.agent.class_cache_mode=MEMORY

或取消注释选项agent.conf:

代码语言:javascript
AI代码解释
复制
# If true, SkyWalking agent will cache all instrumented classes files to memory or disk files (decided by class cache mode),
# allow other javaagent to enhance those classes that enhanced by SkyWalking agent.
agent.is_cache_enhanced_class = ${SW_AGENT_CACHE_CLASS:false}

# The instrumented classes cache mode: MEMORY or FILE
# MEMORY: cache class bytes to memory, if instrumented classes is too many or too large, it may take up more memory
# FILE: cache class bytes to user temp folder starts with 'class-cache', automatically clean up cached class files when the application exits
agent.class_cache_mode = ${SW_AGENT_CLASS_CACHE_MODE:MEMORY}

如果启用了类缓存功能,请将检测到的类字节码保存到内存或临时文件中。当其他Java代理重新转换同一类时,「SkyWalking」代理首先尝试从缓存加载。

如果找到了缓存的类,则将直接使用它,而无需重新生成新的随机名称辅助类,这不会影响后续java代理的处理。

3.Class缓存保存模式 建议将缓存类放入内存中,与此同时,如果它占用更多的内存资源。另一种选择是使用本地文件系统。通过以下选项设置类缓存模式

代码语言:javascript
AI代码解释
复制
-Dskywalking.agent.class_cache_mode=MEMORY:将缓存类保存到Java内存中。
-Dskywalking.agent.class_cache_mode=FILE:将缓存类保存到SkyWalking代理路径“ / class-cache”。

或修改以下选项agent.conf:

代码语言:javascript
AI代码解释
复制
agent.class_cache_mode = ${SW_AGENT_CLASS_CACHE_MODE:MEMORY}
agent.class_cache_mode = ${SW_AGENT_CLASS_CACHE_MODE:FILE}
测试验证

官方提供了一个测试demo: retransform-conflict-demo.jar

说明:该应用程序通过ByteBuddy动态附加Java代理,获取Instrumentation对象,然后调用instrumentation.retransformClasses()以获得目标类的字节码。

在不开启类缓存的情况下启动demo

代码语言:javascript
AI代码解释
复制
java -javaagent:/apache-skywalking-apm-bin/agent/skywalking-agent.jar -jar retransform-conflict-demo.jar
代码语言:javascript
AI代码解释
复制
before retransform:
com.example.demo.TestController$auxiliary$ckZJlKPI
com.example.demo.TestController
com.example.demo.TestController$auxiliary$DNtevU4I

retransform:
java.lang.ClassFormatError
        at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
        at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:167)
        at com.example.demo.DemoApplication.reTransform(DemoApplication.java:69)
        at com.example.demo.DemoApplication.main(DemoApplication.java:30)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:109)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)

after retransform:
com.example.demo.TestController$auxiliary$twNcBbRq
com.example.demo.TestController$auxiliary$ckZJlKPI
com.example.demo.TestController
com.example.demo.TestController$auxiliary$DNtevU4I

check retransform classes:
retransform classes not equal.

开启类缓存的情况下启动demo

代码语言:javascript
AI代码解释
复制
java -Dskywalking.agent.is_cache_enhanced_class=true -javaagent:/apache-skywalking-apm-bin/agent/skywalking-agent.jar -jar retransform-conflict-demo.jar
代码语言:javascript
AI代码解释
复制
before retransform:
com.example.demo.TestController$auxiliary$lNjbfE8J
com.example.demo.TestController
com.example.demo.TestController$auxiliary$vmhaXoD8

retransform:

after retransform:
com.example.demo.TestController$auxiliary$lNjbfE8J
com.example.demo.TestController
com.example.demo.TestController$auxiliary$vmhaXoD8

check retransform classes:
retransform classes successful.
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 狼王编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
低版本skywalking与LinkAgent不兼容怎么办?记一次详细的解决过程
用户原先应用已经接入skywalking,需要再接入数列的LinkAgent时启动会抛java.lang.UnsupportedOperationException,导致应用启动失败。
数列科技
2022/03/18
1.5K0
JVMTM Tool Interface:JVM源码分析之javaagent原理完全解读
本文重点讲述javaagent的具体实现,因为它面向的是我们Java程序员,而且agent都是用Java编写的,不需要太多的C/C++编程基础,不过这篇文章里也会讲到JVMTIAgent(C实现的),因为javaagent的运行还是依赖于一个特殊的JVMTIAgent。
一个会写诗的程序员
2020/05/18
1.8K0
JVMTM Tool Interface:JVM源码分析之javaagent原理完全解读
深入理解Instrument(一)
很早之前就了解到目前主流的APM开源框架如Pinpoint、SkyWalking等等都是通过java.lang.instrument包提供的字节码增强功能来实现的。趁着对这块的热情还没消退,抽时间分析一下java.lang.instrument包的使用方式,记录下来写成一个系列的文章。本系列博文针对的是JDK11,其他版本的JDK可能不适合。
Throwable
2020/06/23
3.2K0
深入理解Instrument(一)
快速学习-Skywalking原理
上文中我们知道,要使用Skywalking去监控服务,需要在其 VM 参数中添加 “- javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar"。这里就 使用到了java agent技术。
cwl_java
2020/08/10
3K0
快速学习-Skywalking原理
javaAgent入门
在Java编程语言中,Java Agent是一种特殊的Java程序,它可以在Java应用程序运行时修改或监视字节码。Java Agent通常通过Java虚拟机 (JVM) 的Instrumentation API来实现这一点。
杨不易呀
2023/11/18
1.6K0
javaAgent入门
054. SkyWalking
1. APM系统 ---- 1.1. APM系统概述 APM (Application Performance Management) 即应用性能管理系统,是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。应用性能管理,主要指对企业的关键业务应用进行监测、优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低 IT 总拥有成本。 APM系统是可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。 1.2. 分布式链路追踪 随着分布式系统和微
山海散人
2021/03/03
2K0
054. SkyWalking
Java Agent入门实战(一)-Instrumentation介绍与使用
动态 Instrumentation 是 Java SE 5 的新特性,它在 java.lang.instrument 包中,它把 Java 的 instrument 功能从本地代码中释放出来,使其可以用 Java 代码的方式解决问题。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至可以替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的虚拟机监控和 Java的 类操作了,这样的特性实际上提供了一种虚拟机级别支持的 AOP方式,使得开发者无需对原有应用做任何修改,就可以实现类的动态修改和增强
蒋老湿
2020/02/10
4.9K1
Java 动态字节码技术
初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处使用它的 Evaluate 功能直接执行某些命令,进行一些计算或改变当前变量。
枕边书
2019/01/03
2.2K0
agentmain | JVM运行时的代码增强
在前文中,介绍了Instrumentation中的premain功能, 这次再一起看下它的agentmain功能.
一个架构师
2022/06/27
9600
agentmain | JVM运行时的代码增强
Skywalking 链路追踪
APM(Application Performance Monitoring)即应用性能管理系统,是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。应用性能管理,主要指对企业的关键业务应用进行检测、优化、提高企业应用的可靠性和质量,保证用户得到良好的服务,降低 IT拥有的成本。APM系统是可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题**。**
Java架构师必看
2021/04/25
2.6K0
Skywalking 链路追踪
Java Agent(一)、初步认识Instrumentation
Instrumentation 是 Java SE 5 引入的一套 API,它允许开发者在运行时修改类的字节码。Java Instrumentation 可以实现在方法插入额外的字节码从而达到收集使用中的数据到指定工具的目的。Java.lang.instrument包的最大功能就是可以在已有的类上附加(修改)字节码来实现增强的逻辑,它最常见的用途包括:
有一只柴犬
2024/12/10
6270
Java Agent(一)、初步认识Instrumentation
skywalking源码分析之javaAgent工具ByteBuddy的应用
关于skywalking请看我上一篇博文,其使用javaAgent技术,使得应用接入监控0耦合。今天在分析skywaking过程中,对javaAgent技术有了更深入的了解。skywalking使用的javaAgent工具ByteBuddy是一个比ASM更上层的针对java字节码操作的封装,基于ByteBuddy,我们可以快速方便的对java字节码进行增强处理,更高效的开发javaAgent应用。
kl博主
2018/04/13
3.4K0
skywalking源码分析之javaAgent工具ByteBuddy的应用
简单聊下 Java Agent
摘要:在 SkyWalking 课程中有一小节讲到了 Java Agent,零代码侵入就能实现 JVM 层面的 AOP 增强的好技术。
FoamValue
2020/08/31
1.1K0
字节码调试的入口 —— JVM 的寄生插件 javaagent 那些事
Java Instrumentation 这个技术看起来非常神秘,很少有书会详细介绍。但是有很多工具是基于 Instrumentation 来实现的:
架构狂人
2023/08/16
1.1K0
字节码调试的入口 —— JVM 的寄生插件 javaagent 那些事
java agent和byte-buddy组合的简单使用
java agent开了一扇门,bytebuddy在开的这扇门中打开了一片新的天地。比较典型的就是skywalking、sermant、arthas、mockito、fastjson等。是不是很好奇skywalking、sermant、arthas、mockito、fastjson的原理。下面我们来了解一下。
路行的亚洲
2024/02/17
1.2K0
java agent和byte-buddy组合的简单使用
动态追踪之java agent
上篇文章我们说到阿里的诊断工具Arthas对方法和类的监控使用的是动态追踪技术,本文我们将介绍动态追踪技术Java Agent。
索码理
2022/12/28
1K0
动态追踪之java agent
Skywalking系列博客4-Java Agent配置
agent配置有多种姿势,上面修改 agent.config 文件中的值,只是其中一种。下面专门探讨agent支持的配置方式。
用户1516716
2020/07/07
2.2K1
Java高级用法,写个代理侵入你 ?
大家好,我是小菜。一个希望能够成为 吹着牛X谈架构 的男人!如果你也想成为我想成为的人,不然点个关注做个伴,让小菜不再孤单!
蔡不菜丶
2022/09/21
5600
Java高级用法,写个代理侵入你 ?
认识 JavaAgent --获取目标进程已加载的所有类
之前在一个应用中搜索到一个类,但是在反序列化测试时出错,错误不是class notfound,是其他0xxx这样的错误,通过搜索,这个错误大概是类没有被加载。最近刚好看到了JavaAgent,初步学习了下,能进行拦截,主要通过Instrument Agent来进行字节码增强,可以进行字节码插桩,bTrace,Arthas 等操作,结合ASM,javassist,cglib框架能实现更强大的功能。Java RASP也是基于JavaAgent实现的。趁热记录下JavaAgent基础概念,以及简单使用JavaAgent实现一个获取目标进程已加载的类的测试。
Seebug漏洞平台
2019/12/16
2.5K0
认识 JavaAgent --获取目标进程已加载的所有类
java运行时创建或修改类-JavaAgent
在运维监控系统开发过程中我们往往需要在特定的方法出入口进行记录日志、采集参数,甚至在特定场景下需要对方法的出入参数或者整个方法逻辑进行重写。目前市面上开源的APM系统主要有CAT、Zipkin、Pinpoint、SkyWalking,大都是参考Google的Dapper实现的。个人在项目中主要使用skywallking,在java、golang等多语言中有过实践,所以这里主要记录自己在java项目中使用skywallking的一些心得和笔记。
QuietJiang
2023/09/21
9420
相关推荐
低版本skywalking与LinkAgent不兼容怎么办?记一次详细的解决过程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档