自定义埋点

SOFATracer 此前的埋点均是基于组件维度的埋点,用户很难在业务代码中进行埋点操作,或者增加自定义 tag 值来监控一些链路信息。基于此,SOFATracer 从 2.4.1/3.0.6 版本开始支持手动埋点和基于注解的埋点方式,帮助用户解决自定义埋点问题。

自定义埋点提供了两种方式,分别是手动埋点与基于注解方式埋点。

手动埋点

手动埋点的方式遵循 OpenTracing 规范,SOFATracer 中通过 beforeInvokeafterInvoke 两个函数封装了 span 的周期。

示例代码如下:

     // 注入 tracer
    @Autowired
    Tracer tracer;

    private void testManual() {
        try {
            // beforeInvoke 开始
            SofaTracerSpan sofaTracerSpan = ((FlexibleTracer) tracer).beforeInvoke("testManual");
            sofaTracerSpan.setTag("manualKey", "glmapper");
            // do your biz

        } catch (Throwable t) {
            // 异常结束
            ((FlexibleTracer) tracer).afterInvoke(t.getMessage());
        } finally {
            // 正常结束
            ((FlexibleTracer) tracer).afterInvoke();
        }
    }

这种方式在使用上没有直接使用注解方便,但是可以直观了解到 span 的生命周期。另外,手动埋点也是对基于注解方式埋点的一种补充。

基于注解方式埋点

SOFATracer 中提供了 @Tracer 注解,其作用域是 method 级别。

示例代码如下:

// 在 hello 方法上使用 @Tracer 注解进行埋点
    @Tracer
    public String hello(String word) {
        // 自定义 tag 数据
        SpanTags.putTags("author", "glmapper");

        // 失效
        helloInner(word);

        return "glmapper : hello " + word;
    }

    // 在 hello 方法上使用 @Tracer 注解进行埋点
    @Tracer
    private String helloInner(String word) {
        return "glmapper : hello " + word;
    }

@Tracer 是基于 Spring AOP 实现,因此一定程度上依赖 Spring 中的代理机制。如上述代码片段中所示,helloInner 方法由于执行过程中不会使用代理对象,而是 this,所以会导致 helloInner 的注解埋点失效。对于此种情况,即可使用上文 手动埋点 的方式来弥补。

SpanTags 是 SOFATracer 中提供的工具类,在使用注解或者手动埋点的情况下,可以通过此类提供的静态方法来设置 tag。

日志格式

  • JSON 格式

    {"time":"2019-09-05 10:23:53.549","local.app":"flexible-sample","traceId":"0a0fe9291567650233504100130712","spanId":"0.2","span.kind":"client","result.code":"","current.thread.name":"http-nio-8080-exec-1","time.cost.milliseconds":"4ms","method":"hello","param.types":"java.lang.String","author":"glmapper","sys.baggage":"","biz.baggage":""}
  • 非 JSON 格式

    2019-09-0510:25:50.992,flexible-sample,0a0fe9291567650350953100130778,0.2,client,,http-nio-8080-exec-1,4ms,hello,param.types=java.lang.String&author=glmapper&,,