版本: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;
}
//省略无关代码
}
}
来源:oschina
链接:https://my.oschina.net/u/2344188/blog/4335247