在类加载时插入观测逻辑,是 APM 与各种监控 agent 的基本做法。这篇自己写一个 Java agent(premain + ClassFileTransformer + ASM),验证它能看到哪些类、怎么插桩、失败时是什么样(Attach 与运行中修改在后面的篇目)。
[app] work(1000000) = 2999997,hello = hello agent [app] Other.go() 运行 [agent] transformer 一共被调用 0 次;其中 demo 包的类:[]
[agent] premain 开始,此时已经加载的类数 = 809,支持 retransform = true,参数 = log [app] work(1000000) = 2999997,hello = hello agent [app] Other.go() 运行 [agent] transformer 一共被调用 6 次;其中 demo 包的类:[demo/Target, demo/Other]
[agent] premain 开始,此时已经加载的类数 = 809,支持 retransform = true,参数 = time [agent] 方法 work 耗时 1795 µs(由 agent 在字节码里插入的计时) [agent] 方法 hello 耗时 86 µs(由 agent 在字节码里插入的计时) [app] work(1000000) = 2999997,hello = hello agent [app] Other.go() 运行 [agent] transformer 一共被调用 6 次;其中 demo 包的类:[demo/Target, demo/Other]
[agent] premain 开始,此时已经加载的类数 = 809,支持 retransform = true,参数 = boom [app] work(1000000) = 2999997,hello = hello agent [app] Other.go() 运行 [agent] transformer 一共被调用 6 次;其中 demo 包的类:[demo/Target, demo/Other]