SkyWalking 将方法加入追踪链路(@Trace)

ぐ巨炮叔叔 提交于 2020-08-08 14:35:12

版本:7.0.0

描述

可能存在这样的场景,当前应用中某些方法没有被追踪。但是我们又想看这一部分方法的调用情况。这个时候就可以使用指定方法的追踪来实现。不过这种方式的缺点是对代码有侵入。

Maven 依赖

   <dependency>
      <groupId>org.apache.skywalking</groupId>
      <artifactId>apm-toolkit-trace</artifactId>
      <version>${skywalking.version}</version>
   </dependency>

使用方式

在项目中加入Maven依赖之后,就可以使用@Trace来追踪相关方法了。

    @Trace
    private List<User> trace(){
        return userManager.getUsers();
    }

验证

场景1:不加入@Trace

    @Override
    public List<User> getUsers() {
        List<User> users = this.trace();
        return users;
    }

    private List<User> trace(){
        return userManager.getUsers();
    }

追踪情况:

场景2:加入@Trace

    @Override
    public List<User> getUsers() {
        List<User> users = this.trace();
        return users;
    }

    @Trace
    private List<User> trace(){
        return userManager.getUsers();
    }

追踪情况:
可以看到,我们加@Trace注解的方法被追踪了。

场景3:加入@Tags或者@Tag

我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。实现方式:在方法上增加@Tag或者@Tags
提示:目前返回类型List支持不了,返回为空。

    @Trace
    @Tags({@Tag(key = "param", value = "arg[1]"),
            @Tag(key = "name", value = "returnedObj.name")})
    private User trace1(String p1, String p2){
        return userManager.getUsers().get(0);
    }

运行结果:

在使用@Tag时,加@Tag注解的方法可能有时候存在不追踪的调用链中,那么会不会影响性能呢?
答案是不会有影响的。@Tag只在活动的跨度中(可理解为当前调用被追踪)会进行处理,否则直接返回。
源码如下:

public class TagAnnotationMethodInterceptor implements InstanceMethodsAroundInterceptor {
    @Override
    public void beforeMethod(final EnhancedInstance objInst, final Method method, final Object[] allArguments,
        final Class<?>[] argumentsTypes, final MethodInterceptResult result) {

        if (!ContextManager.isActive()) {
            return;
        }
		//省略无关代码
    }

    @Override
    public Object afterMethod(
        final EnhancedInstance objInst,
        final Method method,
        final Object[] allArguments,
        final Class<?>[] argumentsTypes,
        final Object ret) {
        if (ret == null || !ContextManager.isActive()) {
            return ret;
        }
		//省略无关代码
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!