-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
支持运行时加载TTL Agent(aka. Agent Attach使用方式 ) #169
Comments
支持运行加载 是否实现这个Feature,需要一起讨论一下: 对比 『启动时加载 下面展开说明对比: 1. 两者都需要准备好
|
我的场景是这样的:想实现一个 比如我有一个Service: @Service
public class ServiceA {
@Autowired
DBOpertation serviceB;
@Autowired
RpcClinetA rpcClinetA;
public int doBusiness(int x) {
serviceB.dbOps();
//跟踪多线程调用需要 TTL 库的支持
List<Object> rpcResult = IntStream.range(1, x).parallel()
.mapToObj(i -> rpcClinetA.sendHttp())
.collect(Collectors.toList());
return x;
}
} 我的测试用例会这么写: @RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceATests {
@Autowired
private ServiceA serviceA;
@Rule
public final TestRule watchman = new ZUnitWatcher();
@Test
public void test1() {
assert serviceA.doBusiness(1)==1;
}
} 这个用例会调用数据库和远程服务,我不打算手写mock,我想通过 Rule去跟踪调用链,然后生成 public class ZUnitWatcher extends TestWatcher implements SpecWriter {
protected void succeeded(Description description) {
List<Invocation> invs=getInvocation();
// 使用捕获的调用链数据生成 Mock代码
buildUT(invs);
}
static {
if (!TtlAgent.isTtlAgentLoaded()) {
//加载 TtlAgent
ZUnit.loadTtlAgent();
//加载 调用链追踪 Agent
ZUnit.loadTraceAgent();
}
}
} 这种场景下,
|
可靠性和正确性的方面的考虑,是不是只要保证 这点一般都是能够做到的,如果做不到,那就从premain加载就好了。 如果去掉agentmain方法,有些场景易用性就差很多了。 |
@zscgrhg 关于使用 具体设置方式<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<argLine>-javaagent:${com.alibaba:transmittable-thread-local:jar}</argLine>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
</plugin> 可以运行工程的
|
我们是做压测产品,需要使用ttl对线程池中的数据进行传标。 我们想把我们的产品封装成一个jar包,可以像arthas-boot那样去动态 对ttl的处理方式是通过手动调用 所以对这一块的处理有什么好的建议吗? added by @oldratlee : 在Issue #364 (comment) 中已经回复。 |
当应用的字节码都加密过,agent 是否还是可用?,谢谢 |
这问题与具体某个 个人觉得,从类文件加载类的字节码 与 @kspine 你可以拿实际碰到的场景具体运行/测试验证一下; |
@oldratlee 请问如果要通过 runtime attach 方式启动,有什么方便的办法吗? 目前由于某些限制,不方便使用 -javaagent 方式启动。 Instrumentation instrumentation = ByteBuddyAgent.install();
if (!TtlAgent.isTtlAgentLoaded()) {
TtlAgent.premain(null, instrumentation);
}
boolean ttlAgentLoaded = TtlAgent.isTtlAgentLoaded();
boolean enableTimerTask = TtlAgent.isEnableTimerTask();
# 报错信息
Exception in thread "main" java.lang.NoClassDefFoundError: com/alibaba/ttl/TtlRunnable
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java) |
-javaagent:PremainAgent.jar
The text was updated successfully, but these errors were encountered: