当前位置: 首页 > 工具软件 > Kamon > 使用案例 >

kamon文档翻译(四)--trace订阅协议

阴雪风
2023-12-01

trace订阅协议

当你给你的应用程序配置使用“Simple Tracing”级别时,每当一个trace被选择和报告时,你能够订阅tracing模块,并接收TraceInfo 信息。订阅使用Kamon.tracer.subscribe(...) 方法,如下所示:

Scala:
Kamon.tracer.subscribe(subscriber)
Java:
Kamon.tracer().subscribe(subscriber);

简单如上所示。一旦你这么做,每次一个trace被采样,你的订阅器就会收到TraceInfo 的信息。
注意:simple trace 订阅很可能会在将来的kamon版本中改变。因为我们计划增强他的性能,并允许跟踪更多信息。

创建一个简单的订阅器

TraceInfo 的信息都有一个简单的数据结构,它有你所期待的TraceContext 包含的基本属性:name,token,timestamp, elapsed time 和一个SegmentInfo 对象集合,SegmentInfo对象集合有他自己的属性:name, category, timestamp 和elapsed time。下面创建一个带有多个segment的trace,并通过一个简单的报告器在控制台上输出这些信息。

Scala:
Tracer.withNewContext("example-trace", autoFinish = true) {
  Tracer.currentContext.withNewSegment("quick-segment", "code", "kamon") {
    Thread.sleep(100)
  }

  Tracer.currentContext.withNewSegment("slow-segment", "code", "kamon") {
    Thread.sleep(3000)
  }
}
Java:
Tracer.withNewContext("trace-with-segments", true, () -> {
  Tracer.currentContext().withNewSegment("quick-segment", "code", "kamon", () -> {
    try{ Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); }
    return 0;
  });

  Tracer.currentContext().withNewSegment("slow-segment", "code", "kamon", () -> {
    try{ Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); }
    return 0;
  });

  return "done";
});

上面的代码用于创建一个trace和两个有不同生存时间的segment。第一个segment叫“quick-segment”,有大约100毫秒的生存时间。第二个叫“slow-segment”,生存时间大约3秒。
下面的代码是订阅者,他会等待TraceInfo 信息,然后在控制台上打印出来。

Scala:
class TracePrinter extends Actor {
  def receive = {
    case traceInfo: TraceInfo =>

    println("#################################################");
    println("Trace Name: " + traceInfo.name)
    println("Timestamp: " + traceInfo.timestamp)
    println("Elapsed Time: " + traceInfo.elapsedTime)
    println("Segments: ");

    traceInfo.segments.foreach { segmentInfo =>
      println("    ------------------------------------------");
      println("    Name: " + segmentInfo.name)
      println("    Category: " + segmentInfo.category)
      println("    Library: " + segmentInfo.library)
      println("    Timestamp: " + segmentInfo.timestamp)
      println("    Elapsed Time: " + segmentInfo.elapsedTime)
    }
  }
}
Java:
public static class TracePrinter extends UntypedActor {

  @Override
  public void onReceive(Object message) throws Exception {
    if(message instanceof TraceInfo) {
      final TraceInfo traceInfo = (TraceInfo) message;
      final List<SegmentInfo> segments = seqAsJavaList(traceInfo.segments());

      System.out.println("#################################################");
      System.out.println("Trace Name: " + traceInfo.name());
      System.out.println("Timestamp: " + traceInfo.timestamp());
      System.out.println("Elapsed Time: " + traceInfo.elapsedTime());
      System.out.println("Segments: ");

      segments.forEach(segmentInfo -> {
        System.out.println("    ------------------------------------------");
        System.out.println("    Name: " + segmentInfo.name());
        System.out.println("    Category: " + segmentInfo.category());
        System.out.println("    Library: " + segmentInfo.library());
        System.out.println("    Timestamp: " + segmentInfo.timestamp());
        System.out.println("    Elapsed Time: " + segmentInfo.elapsedTime());
      });

    } else unhandled(message);
  }
}

//输出内容暂时不翻译

 类似资料: