Solon

opentracing-solon-cloud-plugin

v2.7.5 </> markdown
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>opentracing-solon-cloud-plugin</artifactId>
</dependency>

1、描述

分布式扩展插件。基于 opentracing 适配的 solon cloud 插件。可与支持 opentracing 规范的服务,一同提供链路跟踪支持。

2、配置示例

solon.app:
  name: "demoapp"
  group: "demo"

solon.cloud.opentracing:
  server: "udp://localhost:6831"
  trace:
    enable: true                     #是否启用(默认:true)
    exclude: "/healthz,/_run/check/" #排除路径,多个以,号隔开

3、附带技能

支持 slf4j 日志框架的 MDC 变量(可以通过格式符获取,例:"%X{X-TraceId}"):

  • X-TraceId
  • X-SpanId

4、代码应用

  • 启用和配置跟踪器实现
public class App {
    public static void main(String[] args) {
        Solon.start(App.class, args);
    }
}

@Configuration
public class Config {
    //构建跟踪服务。添加依赖:io.jaegertracing:jaeger-client:1.7.0
    @Bean
    public Tracer tracer() throws TTransportException {
        CloudProps cloudProps = OpentracingProps.instance;
        
        //为了可自由配置,这行代码重要
        if(cloudProps.getTraceEnable() == false 
            || Utils.isEmpty(cloudProps.getServer())){
            return null;
        }

        URI serverUri = URI.create(cloudProps.getServer());
        Sender sender = new UdpSender(serverUri.getHost(), serverUri.getPort(), 0);

        final CompositeReporter compositeReporter = new CompositeReporter(
                new RemoteReporter.Builder().withSender(sender).build(),
                new LoggingReporter()
        );

        final Metrics metrics = new Metrics(new NoopMetricsFactory());

        return new JaegerTracer.Builder(Solon.cfg().appName())
                .withReporter(compositeReporter)
                .withMetrics(metrics)
                .withExpandExceptionLogs()
                .withSampler(new ConstSampler(true)).build();
    }
}
  • 应用代码
// --  可以当它不存在得用
@Controller
public class TestController {
    @NamiClient
    UserService userService;
    
    @Inject
    OrderService orderService;

    @Mapping("/")
    public String hello(String name) {
        name = userService.getUser(name);

        return orderService.orderCreate(name, "1");
    }
}

//-- 通过注解增加业务链节点 ( @Tracing )
@ProxyComponent
public class OrderService {
    @Tracing(name = "创建订单", tags = "订单=${orderId}")
    public String orderCreate(String userName, String orderId) {
        //手动添加 tag
        Spans.active().setTag("用户", userName));
        
        return orderId;
    }
}

5、@Tracking 注意事项

  • 控制器或最终转为 Handler 的类可以不加(已由 Filter 全局处理了),加了会产生新的 Span

  • 修改当前 Span 的操作名

@Controller
public class TestController {

    @Mapping("/")
    public String hello(String name) {
        Spans.active().setOperationName("Hello");  //修改当前操作名
    
        return "Hello " + name;
    }
}
  • 添加在空接口上,一般会无效(比如:Mapper)。除非其底层有适配
  • 需加在代理的类上,不然拦截器不会生效。如:@ProxyComponent 注解的类

6、演示项目

demo9071-opentracing_jeager