当你给你的应用程序配置使用“Simple Tracing”级别时,每当一个trace被选择和报告时,你能够订阅tracing模块,并接收TraceInfo
信息。订阅使用Kamon.tracer.subscribe(...)
方法,如下所示:
Kamon.tracer.subscribe(subscriber)
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,并通过一个简单的报告器在控制台上输出这些信息。
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)
}
}
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
信息,然后在控制台上打印出来。
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)
}
}
}
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);
}
}
//输出内容暂时不翻译