如何解决ByteBuddy,使用 javaagent bytebuddy 修改 Sleuth SpanCustomizer
有一个关于修改 Sleuth SpanCustomizer 的问题,我想自定义 span 名称并添加额外的 span 标签。
我的最终目标是想实现一个类似下面代码的类来实现对span标签/名称的修改,我应该使用bytebuddy将这块类应用到代理中还是检测并拦截SpanCustomizer类来进行修改?
任何建议都会有所帮助,谢谢!
-------------------- 最终目标实现这个类-------------------->
@Configuration
public class TracingConfig{
@Bean(name = { HttpClientRequestParser.NAME,HttpServerRequestParser.NAME })
HttpRequestParser sleuthHttpServerRequestParser() {
return (req,context,span) -> {
HttpRequestParser.DEFAULT.parse(req,span);
span.tag("upstream_cluster",getUpstreamCluster(req));
span.name(getOperationName(req));
};
}
@Bean(name = { HttpClientResponseParser.NAME,HttpServerResponseParser.NAME })
HttpResponseParser sleuthHttpServerResponseParser(){
return (resp,span) -> {
HttpResponseParser.DEFAULT.parse(resp,span);
span.tag("http.status_code",Integer.toString(resp.statusCode()));
span.name(getOperationName(resp.request()));
};
}
}
我目前的实现如下:
-------------------- 预维护 --------------------
public static void premain(String agentArgs,Instrumentation inst) throws Exception {
AgentBuilder.Transformer transformerHttp = new AgentBuilder.Transformer() {
@Override
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder,TypeDescription typeDescription,ClassLoader classLoader,JavaModule module) {
return builder
.method(ElementMatchers.<MethodDescription>any())
.intercept(MethodDelegation.to(MyHttpAdvice.class));
}
};
AgentBuilder agentBuilder = new AgentBuilder.Default();
agentBuilder = agentBuilder.type(ElementMatchers.hasSuperType(ElementMatchers.named("javax.servlet.http.HttpServletRequest"))
.or(ElementMatchers.named("org.springframework.http.client.ClientHttpResponse"))
.or(ElementMatchers.named("org.springframework.web.reactive.function.client.ClientRequest"))
.or(ElementMatchers.named("org.springframework.web.reactive.function.client.ClientResponse"))
.or(ElementMatchers.named("org.springframework.web.reactive.function.client.WebClient"))
.or(ElementMatchers.named("javax.servlet.http.HttpServletRequest")))
.transform(transformerHttp);
agentBuilder.installOn(inst);
}
-------------------- 我的 Http 建议 --------------------
public class MyHttpAdvice {
@RuntimeType
public static Object intercept(@Origin Method method,@AllArguments Object[] allArguments,@SuperCall Callable<?> callable) throws Exception {
long start = System.currentTimeMillis();
for (Object allArgument : allArguments) {
if (allArgument instanceof SpanCustomizer) {
SpanCustomizer req = (SpanCustomizer) allArgument;
req.tag("test1","test2");
req.name("test3");
System.out.println("intercept http request span customizer ------- " + req.toString());
}
return callable.call();
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。