全部产品
云市场

自定义埋点

更新时间:2020-06-03 11:25:34

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

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

手动埋点

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

示例代码如下:

  1. // 注入 tracer
  2. @Autowired
  3. Tracer tracer;
  4. private void testManual(){
  5. try {
  6. // beforeInvoke 开始
  7. SofaTracerSpan sofaTracerSpan = ((FlexibleTracer) tracer).beforeInvoke("testManual");
  8. sofaTracerSpan.setTag("manualKey","glmapper");
  9. // do your biz
  10. } catch (Throwable t){
  11. // 异常结束
  12. ((FlexibleTracer) tracer).afterInvoke(t.getMessage());
  13. } finally {
  14. // 正常结束
  15. ((FlexibleTracer) tracer).afterInvoke();
  16. }
  17. }

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

基于注解方式埋点

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

示例代码如下:

  1. // 在 hello 方法上使用 @Tracer 注解进行埋点
  2. @Tracer
  3. public String hello(String word){
  4. // 自定义 tag 数据
  5. SpanTags.putTags("author","glmapper");
  6. // 失效
  7. helloInner(word);
  8. return "glmapper : hello " + word;
  9. }
  10. // 在 hello 方法上使用 @Tracer 注解进行埋点
  11. @Tracer
  12. private String helloInner(String word){
  13. return "glmapper : hello " + word;
  14. }

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

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

日志格式

  • JSON 格式
    1. {"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 格式
    1. 2019-09-05 10:25:50.992,flexible-sample,0a0fe9291567650350953100130778,0.2,client,,http-nio-8080-exec-1,4ms,hello,param.types=java.lang.String&author=glmapper&,,