微服务全链路跟踪:jaeger增加tag参数

我们两清 提交于 2020-05-05 21:16:19

微服务全链路跟踪:grpc集成zipkin

微服务全链路跟踪:grpc集成jaeger

微服务全链路跟踪:springcloud集成jaeger

微服务全链路跟踪:jaeger集成istio,并兼容uber-trace-id与b3

微服务全链路跟踪:jaeger集成hystrix

微服务全链路跟踪:jaeger增加tag参数

前言

> 微服务全链路跟踪:grpc集成jaeger中介绍了springboot集成jaeger,在现实使用时很多情况下需要根据业务id来搜索全链路,这里就需要注入tab来方便搜索,

方案

1、直接手动注入

@Controller
@RequestMapping("/demo")
@Api(tags = "demo")
@Slf4j
public class DemoController extends BaseController {
    @Autowired
    private Tracer tracer;
/**
     * 
     */
    @GetMapping("/getTaskByid")
    public ApiResponse getByid(@RequestParam("id") Long id)
    {
    if (tracer!=null&&tracer.activeSpan()!=null) {
                    tracer.activeSpan().setTag(“id”, id);
                }
        return ApiResponse.success(service.selectById(id));
    }

}

2、通过注解或者aop自动注入 下面主要介绍注解的方式

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface JaegerLog {

    String tagName() default "id";
    /**
     * 操作对象ID
     * @return
     */
    String objectIdKey() default "";
}


@Slf4j
@Aspect
@Order()
public class JaegerLogAspect {
    @Autowired
    private Tracer tracer;

    @Around("@annotation(jaegerLog)")
    @SneakyThrows
    public Object around(ProceedingJoinPoint point, JaegerLog jaegerLog) {
        Object object = null;
        Map<string, object> paramsMap = Maps.newHashMap();
        try {
            paramsMap .put("args", point.getArgs());
            object = point.proceed();
            paramsMap .put("response", object);
        } catch (BusinessException e) {
            throw new Exception(e);
        }catch (Exception e) {
            throw new Exception(e);
        }finally {
            try{
                if (tracer!=null&amp;&amp;tracer.activeSpan()!=null&amp;&amp;StringUtils.isNotBlank(jaegerLog.objectIdKey())) {
                    String keyValue = getKeyValue(jaegerLog.objectIdKey(), params);
                    tracer.activeSpan().setTag(jaegerLog.tagName(), keyValue);
                }
            }catch (Exception e){
                log.error(e.getMessage());
            }


        }
        return object ;
    }

    private String getKeyValue(String key, Map<string, object> params) {
        try {
            Object value= JSONPath.eval(params, key);
            if (mm != null) {
                return value.toString();
            }
        } catch (Exception e) {
            log.error("JSONPath.eval:", e);
        }
        return null;
    }


}

@Controller
@RequestMapping("/demo")
@Api(tags = "demo")
@Slf4j
public class DemoController extends BaseController {

/**
     * 
     */
    @GetMapping("/getByid")
     @JaegerLog(objectIdKey = "args[0]")
    public ApiResponse getByid(@RequestParam("id") Long id)
    {
        return ApiResponse.success(service.selectById(id));
    }
/**
     * 
     */
    @PostMapping("/add")
     @JaegerLog(objectIdKey = "args[0].id")
    public ApiResponse add(@RequestBody Map<string,string> parms)
    {
        return ApiResponse.success(service.add(parms));
    }

}

这样就可以自定义参数id来进行jaeger tag注入。 后面就可以根据注入的id来查询全链路结果,如下图: 在这里插入图片描述 </string,string></string,></string,>

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!