当前位置:首页 >> 绿色生活

极简!一个注解就能创立Jaeger的Span

时间:2023-06-14 12:15:26   来源:绿色生活

cation.run(AnnonationDemoApplication.class, args); }}第一个APIBiz:package com.bolingcavalry.annonation.service;public interface ChildBiz { void mockChild();}它的做到:package com.bolingcavalry.annonation.service.impl;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;@Component@Slf4jpublic class ChildBizImpl implements ChildBiz { @Override public void mockChild() { log.info("mockChild"); }}第二个API:package com.bolingcavalry.annonation.service;public interface Biz { void mock();}它的做到,可见其mock新方法中所可能会调用childBiz的mockChild新方法:package com.bolingcavalry.annonation.service.impl;import com.bolingcavalry.annonation.service.Biz;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;@Component@Slf4jpublic class BizImpl implements Biz { final ChildBiz childBiz; public BizImpl(ChildBiz childBiz) { this.childBiz = childBiz; } @Override public void mock() { log.info("mock"); childBiz.mockChild(); }}如今一个简单的web公共服务技术开发收尾,有web层也有service层,够咱们来实验了界定记事界定两个记事,一个用做建立span,另一个用做建立弟span:记事MySpan用做想全新建立一个span的场面:package com.bolingcavalry.annonation.aop;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Documentedpublic @interface MySpan { String spanName() default "";}第二个是MyChildSpan,用做想在当前span下建立一个弟span的场面:package com.bolingcavalry.annonation.aop;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Documentedpublic @interface MyChildSpan { String spanName() default "";}界定好了记事,可以技术开发AOP来解决问题记事的逻辑学了AOP和记事技术开发接下来是今天的核心:解决问题记事的AOP类,中所文注释仍未寄给得很详述,就不必赘述太多了,唯一要忽略的是记事@Around("@annotation(mySpan)"),它自行决定了该新方法可能会解决问题所有被mySpan修饰的新方法:package com.bolingcavalry.annonation.aop;import io.opentracing.Span;import io.opentracing.Tracer;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.Signature;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;@Aspect@Component@Slf4jpublic class SpanAspect { private Tracer tracer; public SpanAspect(Tracer tracer) { this.tracer = tracer; } /** * 取得真实新方法的具体反馈 * @param proceedingJoinPoint * @return */ private static String getOperationDesc(ProceedingJoinPoint proceedingJoinPoint) { Signature signature = proceedingJoinPoint.getSignature(); // 提取类名 return StringUtils.substringAfterLast(signature.getDeclaringTypeName(), ".") + ":" + signature.getName(); } @Around("@annotation(mySpan)") public Object traceSpan(ProceedingJoinPoint proceedingJoinPoint, MySpan mySpan) throws Throwable { // 类名:新方法名 String operationDesc = getOperationDesc(proceedingJoinPoint); // 看新方法的记事除此以外不可能会分设name String name = mySpan.spanName(); // 如果不可能会分设name,就给span一个选项name if (StringUtils.isEmpty(name)) { name = "span-aspect-" + operationDesc; } // 建立一个span,在建立的时候就移除一个tag Span span = tracer.buildSpan(name).start(); // span存档 span.log("span log of " + operationDesc); // 增高一个tag span.setTag("operation-desc", operationDesc); // span落幕 span.finish(); return proceedingJoinPoint.proceed(); } @Around("@annotation(myChildSpan)") public Object traceChildSpan(ProceedingJoinPoint proceedingJoinPoint, MyChildSpan myChildSpan) throws Throwable { // 类名:新方法名 String operationDesc = getOperationDesc(proceedingJoinPoint); // 看新方法的记事除此以外不可能会分设name String name = myChildSpan.spanName(); // 如果不可能会分设name,就给span一个选项name if (StringUtils.isEmpty(name)) { name = "child-span-aspect-" + operationDesc; } // 从上下文中所取得已存在的span Span parentSpan = tracer.activeSpan(); if (null==parentSpan) { log.error("can not get span from context"); } else { Span span = tracer.buildSpan(name).asChildOf(parentSpan).start(); // span存档 span.log("child span log of " + operationDesc); // 增高一个tag span.setTag("child-operation-desc", operationDesc); // span落幕 span.finish(); } return proceedingJoinPoint.proceed(); }}记事和AOP都寄给好了,咱们把记事用上,想想效用如何采用记事把MySpan用来修饰BizImpl.mock新方法,忽略分设其spanName属性,作为span的name: 把MyChildSpan用来修饰新方法ChildBizImpl.mockChild新方法,用做建立一个弟span,忽略记事不分设任何属性,AOP类中所可能会给这个span分设选项的名称: 以上就是全部文档了,咱们运行好像试试吧;验证用docker关机Jaeger后台公共服务:docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14269:14269 -p 9411:9411 jaegertracing/all-in-one:1.26关机广泛应用jaeger-annonation-demo浏览器可能会面,触发webAPI类和service类的执行打开jaeger的web页面,IP是,如下左图,可见trace仍未呈报了: 点开上左图红框中所的记录,可以看到这个trace的详情,如下左图可见,数据都符合预期: 至此,基于记事的Jaeger呈报就收尾了,本篇只是缺少一个思路和参考资料文档,在实际广泛应用中所,聪明的您完全可以创作造出极为强大的记事双管呈报,例如增高更充沛的记事属性、基于类的记事、基于参数的记事等,甚至弃用记事,从外部用纯粹的AOP针对特定package、新方法等进行Jaeger呈报;青睐关注美联社号:程序员欣宸学习路上,你不孤单,欣宸原创一路伴...。

天津妇科医院哪家正规
乐珠滴眼液的功效
艾得辛可以治疗什么
贵阳妇科医院哪个专业
广州白癜风治疗方法有什么