springboot用1.5的 因为是线上服务
<dependency> <groupId>io.opentracing.contrib</groupId> <artifactId>opentracing-spring-jaeger-web-starter</artifactId> <version>0.1.5</version> </dependency> <dependency> <groupId>io.opentracing.contrib</groupId> <artifactId>opentracing-jdbc</artifactId> <version>0.0.9</version> </dependency>
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface JaegerPoint { String value() default ""; }
@Aspect @Component @Order(-1) public class JaegerAspect { @Autowired private Tracer tracer; @Pointcut("@annotation(com.annotations.JaegerPoint)") public void annotationPointCut() { } @Around("annotationPointCut()") public Object arount(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{ Object object =null; Method method = getMethod(proceedingJoinPoint); String methodName = method.getName(); Span span = tracer.buildSpan(methodName).start(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); JaegerPoint annotation = method.getAnnotation(JaegerPoint.class); //创建scope try (Scope scope = tracer.scopeManager().activate(span,false)) { if(StringUtils.isNotBlank(annotation.value())){ tracer.activeSpan().setTag("type", annotation.value()); } tracer.activeSpan().setTag("methodName", methodName); String input = getInput(proceedingJoinPoint); tracer.activeSpan().log("------------->input is "+ input); object = proceedingJoinPoint.proceed(); tracer.activeSpan().log("------------->output is "+object.toString()); } catch (Throwable t) { Map<String, Object> exceptionLogs = new LinkedHashMap<>(10); exceptionLogs.put("event", Tags.ERROR.getKey()); exceptionLogs.put("error.object", t); span.log(exceptionLogs); Tags.ERROR.set(span, true); throw t; }finally { span.finish(); } return object; } private String getInput(ProceedingJoinPoint proceedingJoinPoint){ StringBuilder sbd = new StringBuilder(); Object[] objs = proceedingJoinPoint.getArgs(); if(objs!=null&&objs.length>0){ for(Object o : objs){ sbd.append(o); } } return sbd.toString(); } private Method getMethod(JoinPoint joinPoint) { MethodSignature sign = (MethodSignature) joinPoint.getSignature(); Method method = sign.getMethod(); //提取方法上的自定义注解对象, 可以获得注解的值 //ResourceAccess annotation = method.getAnnotation(ResourceAccess.class); return method; } @After("annotationPointCut()") public void after(JoinPoint joinPoint){ }
httpclient 埋点
//透传context到服务端 tracer.inject(tracer.activeSpan().context(), Format.Builtin.TEXT_MAP, new TextMap() { @Override public Iterator<Map.Entry<String, String>> iterator() { throw new UnsupportedOperationException("TextMapInjectAdapter should only be used with Tracer.inject()"); } @Override public void put(String key, String value) { httppost.setHeader(key, value); } });
效果