李鼎
李鼎
Support for `Android` was not considered before, mainly because - Implementation mechanism for `Android` - Application scenarios I don't know much. @qianxinyi can you explain that? Or Do the (similar)...
`JDK`的库的代码(逻辑)在`Android`中是不是系统接管的? 换句话说,编译期修改不了,而是要运行期加载时修改。 @qianxinyi 如果是运行期加载时修改,要了解`Android`的运行加载过程。 这个你来研究完成一下,运行时系统类的修改 在`Android`上应该已经有现成的解决方案了。 \# `JDK`的库的代码(逻辑)修改的量不多,在相关的方法插入了一行代码。 方案和实现你整理好了,我可以整合进来,author是你 😄
内容移到了独立的Issue中 - #123
考虑`TTL agent`的使用方式, - `jar`要独立自包含,即一个`jar`文件;期望将字节码库`shade`进来并`repackage`(防止类冲突/不兼容) - 期望`jar`文件比较小 使用byte-buddy 需要看看这些 > 支持重新增强已经加载过的类 这个是大家提到多次的需求 👍 @zfyq124
确实有其它的同学也反映过这样的问题。 👍 @liauraljl ----------------- 你方便给一下极简的Demo @liauraljl 🙏 ♥️ : - 在Github建一个Demo Repo - 包含上`SkywalkingAgent`、`Promethues`等的Agent 共用 以运行复现问题,方便我跟进排查,谢谢 😄 ------------ 目前我觉得,可能是`TTL Java Agent`的设置问题,需要与不同`Agent`共用&生效: https://github.com/alibaba/transmittable-thread-local/blob/b1aa750163c91a18607ed623848a546af1628a07/pom.xml#L268-L272 @liauraljl 欢迎一起排查解决 😄 ♥️ PS: [`Java Agent`的资料](https://github.com/alibaba/transmittable-thread-local/blob/master/docs/developer-guide.md#java-agent)
按 @liauraljl 提供的 『demo:https://github.com/liauraljl/ttl-agent-demo 』 走了一遍,确实如你的说的:👍 把`TTL agent`放在最前位置(如位于`Skywalking Agent`之前),`TTL Agent`的生效的。 否则`Skywalking Agent`在`TTL agent`之前,线程池未被增强,导致`TTL Agent`没有生效。 感谢 @liauraljl 的完整Demo、复现问题与排查~~ ♥️ ----------- 原因 如 上面 @TuitaKing 的说明,很完整 👍 : 因为`Skywalking Agent`的入口逻辑(`premain`)包含 线程池 的启动,导致...
> Quote from @liauraljl > > 不过还是希望有更好的解决方案, > 毕竟人为控制 **_`Agent`加载顺序_** 的话后续长期迭代难免会出错。 我试着解决 **_`Agent`加载顺序_** 的影响: - 实验的修改:在[分支`expt/fix-agent-order-problem`](https://github.com/alibaba/transmittable-thread-local/tree/expt/fix-agent-order-problem) - 修改逻辑是:加载`TtlAgent`时,`retransform`已加载的类:https://github.com/alibaba/transmittable-thread-local/commit/4886b7e9fb1a97f6711718f85ce16d5951ccc15e#diff-7baf52d90b056f08a33f25f27d6df84ecd50797196db42bc39b984f57ccceb2eR147-R156 使用这个`TTL`分支的`TTL Jar`,运行 @liauraljl 的 `ttl-agent-demo`: - 会出`java.lang.UnsupportedOperationException: class redefinition failed: attempted to...
@liauraljl @TuitaKing README文档中 增加一个FAQ: > #### 1. `TTL Agent`与其它`Agent`(如`Skywalking`、`Promethues`)配合使用时不生效? > https://github.com/alibaba/transmittable-thread-local#-faq
> 这个错(`class redefinition failed: attempted to change superclass or interfaces`) > 是因为[`RetransformClasses`](https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#RetransformClasses)方法的限制:不能增加、删除、和修改方法签名,或者修饰符,还有继承关系。 > > 具体原因应该是`TtlAgent`中让每个被包装的线程池都实现了`TtlAgentEnhanced`。 > 我去掉这个实现该接口的逻辑,发现是可以做到的。 COOL! 👍 ♥️ @TuitaKing > 这个是用来避免父类再被包装? 用来标识,对于`ThreadPoolExecutor`,目前并不是一定需要。 但对于`ForkJoinPool` 会有加类字段 操作。 修改类在[`ForkJoinTtlTransformlet`](https://github.com/alibaba/transmittable-thread-local/blob/master/src/main/java/com/alibaba/ttl/threadpool/agent/transformlet/internal/ForkJoinTtlTransformlet.java#L24)
@TuitaKing 可以看到你非常了解`Java Agent` 与 TTL的整个过程与实现。 👍 🚀 你有没有兴趣 方便来实验 与 实现一下:TTL在类加载后的增强功能? @TuitaKing 😁 ❤️ (`ForkJoinPool` 的实现方案可能有些复杂需要挖) PS:最近也在加 TTL的扩展点功能(`Extension Transformlet`),刚发了[`v2.13.0-Beta1`](https://github.com/alibaba/transmittable-thread-local/releases/tag/v2.13.0-Beta1); 最新的代码还没有完全稳定,也带来了一些实现过程的额外麻烦。🙏