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 (将#修改为@)