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();
}