问题描述
有一个关于修改 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 (将#修改为@)