调用链快速入门

最近更新时间: 2024-10-17 17:10:00

为了节约用户的开发成本和提升使用效率,TSF 提供了 Spring Cloud 全链路跟踪的组件。用户只需要在代码中配置组件依赖,即可直接使用 TSF 的全链路跟踪功能,无需关心日志采集、分析、存储等过程。 用户仅需要安装了对应的依赖包及添加依赖项即可,无须其他配置。

准备工作

开始实践调用链功能前,请确保已完成 【SDK 下载】 。

依赖项

向工程中添加 spring-cloud-tsf-starter 依赖并开启 @EnableTsf 注解 。

注意:

如果您使用的是 1.15.0-Edgware-RELEASE/1.15.0-Finchley-RELEASE 及之前的版本,使用方法参考 【Spring Cloud SDK 历史版本使用方法】 。

微服务对下游组件访问的链路支持

微服务对 Redis、MySQL、MongoDB、消息队列 CMQ 的访问操作会产生跟踪日志, TSF 会对该日志进行采集、分析、统计,这些组件的调用会展现在 TSF 平台的链路追踪中。具体使用说明如下:

  • Redis 链路使用说明

  • MySQL 链路使用说明

  • MongoDB 链路使用说明

  • 消息队列 CMQ 链路使用说明

  • Kafka 链路追踪使用说明

  • RocketMQ 链路追踪使用说明

注意:

非微服务组件的链路支持功能依赖于1.14.0版本及以上版本的 SDK,详情请参考 【SDK 更新日志】 。

标签与自定义元数据

调用链支持用户在代码中设置标签(Tag) 和自定义元数据(CustomMetada),分别用于调用链的筛选和附带业务信息。

接口定义:

public class TsfContext {
    /**
     * 设置多个 Tag。如果有某个 Tag 之前已经被设置过,那么它的值会被覆盖。
     */
    public static void putTags(Map<String, String> tagMap, TagControlFlag... flags) {}

    /**
     * 设置 Tag。如果该 key 之前已经被设置过,那么它的值会被覆盖。
     */
    public static void putTag(String key, String value, TagControlFlag... flags) {}

    /**
     * 设置 CustomMetadata。
     */
    public static void putCustomMetadata(Object customMetadata)
}

注入和获取 trace 信息

TSF SDK1.23 及之后版本,支持注入和获取 traceId、spanId、tag 信息。

注意:

  • traceId、spanId 格式不建议自定义,可能有未知错误。
  • TSF 不保证注入后调用链的正确性。

E 版本 SDK 使用方式

 private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); 
 @Autowired
 private Tracer tracer;

 public void addSpan() throw Exception{
     //获取 traceId、spanId、tag
        Span oldSpan = tracer.getCurrentSpan();
        String traceId = oldSpan.getTraceId();
        String spanId = oldSpan.getSpanId();
        Map<String, String> tags = oldSpan.tags();
        LOG.info("traceId: {}, spanId: {}", traceId, spanId);
        for (String key : tags.keySet()) {
            LOG.info("key: {}, value: {}", key, tags.get(key));
        }

        //设置 tag
        tracer.addTag("http.method","get");
        Map<String, String> tags1 = tracer.getCurrentSpan().tags();
        for (String key : tags1.keySet()) {
            LOG.info("key: {}, value: {}", key, tags1.get(key));
        }

        //设置 traceId、spanId(必须先新建 span)
        Span.SpanBuilder spanBuilder = Span.builder();
        Span span = spanBuilder.name("mockName").traceId(UUID.randomUUID().toString()).spanId(UUID.randomUUID().toString()).tag("key", "value").build();

        tracer.continueSpan(span);

        Span newSpan = tracer.getCurrentSpan();
        String newTraceId = newSpan.getTraceId();
        String newSpanId = newSpan.getSpanId();

        LOG.info("traceId: {}, spanId: {}", newTraceId, newSpanId);
 }

F、G 版本 SDK 使用方式

    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
    @Autowired
    private Tracing tracing; 

   public void addSpan() throw Exception{
      TraceContext traceContext = tracing.tracer().currentSpan().context();

        TraceContext context = traceContext.toBuilder().traceId(2035873338086630653L).spanId(-2035873338086630653L).build();

        CurrentTraceContext currentTraceContext = tracing.currentTraceContext();
        currentTraceContext.newScope(context);

        Span spanCur = tracing.tracer().currentSpan();


        long traceId1 = spanCur.context().traceId();
        long spanId1 = spanCur.context().spanId();
        LOG.info("traceId1:{},spanId1:{}",traceId1, spanId1);


        //添加tag
        spanCur.tag("qx-test1","value");
        spanCur.tag("qx-test2","value");
        spanCur.tag("qx-test1","value");

        //获取tag
        Field state1 = spanCur.getClass().getDeclaredField("state");
        state1.setAccessible(true);
        MutableSpan mutableSpan1 = (MutableSpan)state1.get(spanCur);
        Field tags1 = mutableSpan1.getClass().getDeclaredField("tags");
        tags1.setAccessible(true);
        ArrayList<String> list1 = (ArrayList<String>) tags1.get(mutableSpan1);
        String key1 =null, value1 =null;
        for (int i = 0, length = list1.size(); i < length; i += 2) {
            key1 =  list1.get(i);
            value1 = list1.get(i + 1);

            LOG.info("tags key1: {}, value1: {}", key1, value1);
        }

        //获取 traceid、spanid
        TraceContext traceContext1 = spanCur.context();
        long traceId2 = traceContext1.traceId();
        long spanId2 = traceContext1.spanId();
        LOG.info("traceId1:{},spanId1:{}",traceId2, spanId2);
    }