ByteBuddy,使用 javaagent bytebuddy 修改 Sleuth SpanCustomizer

时间:2021-06-16 02:37:34

标签: spring-boot metrics byte-buddy javaagents opentracing

有一个关于修改 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, context, span);
            span.tag("upstream_cluster", getUpstreamCluster(req));
            span.name(getOperationName(req));
        };
    }
    @Bean(name = { HttpClientResponseParser.NAME, HttpServerResponseParser.NAME })
    HttpResponseParser sleuthHttpServerResponseParser(){
        return (resp, context, span) -> {
            HttpResponseParser.DEFAULT.parse(resp, context, 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();
        } 
    }
}

}

0 个答案:

没有答案
相关问题