56. 当前 Span
Brave 者支持代表飞行运行的“电流 Span”概念。您可以使用Tracer.currentSpan()
将自定义标签添加到 Span,并可以使用Tracer.nextSpan()
创建正在运行的子项。
Tip
在 Sleuth 中,您可以通过tracer.currentSpan()
方法自动连接Tracer
bean 以检索当前范围。要检索当前上下文,只需调用tracer.currentSpan().context()
。要以 String 的形式获取当前跟踪 ID,可以使用traceIdString()
这样的方法:tracer.currentSpan().context().traceIdString()
。
56.1 手动设置范围
在编写新的检测时,将您创建的 Span 作为当前 Span 放置在示波器中很重要。这样做不仅使用户可以使用Tracer.currentSpan()
进行访问,而且还允许诸如 SLF4J MDC 之类的自定义项查看当前的跟踪 ID。
Tracer.withSpanInScope(Span)
促进了这一点,并且通过使用 try-with-resources 惯用法最方便地使用。每当可能调用外部代码(例如进行拦截器或其他操作)时,请将范围放在范围内,如以下示例所示:
@Autowired Tracer tracer;
try (SpanInScope ws = tracer.withSpanInScope(span)) {
return inboundRequest.invoke();
} finally { // note the scope is independent of the span
span.finish();
}
在极端情况下,您可能需要临时清除当前 Span(例如,启动不应与当前请求关联的任务)。为此,请将 null 传递给withSpanInScope
,如以下示例所示:
@Autowired Tracer tracer;
try (SpanInScope cleared = tracer.withSpanInScope(null)) {
startBackgroundThread();
}