微服務全鏈路跟蹤:jaeger增加tag參數

微服務全鏈路跟蹤: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&&tracer.activeSpan()!=null&&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來查詢全鏈路結果,如下圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章