7. 电流跨度

Brave 支持表示正在进行的操作的 “” 概念。 你可以使用 将自定义标签添加到 span 中,并创建任何正在进行的子项。current spanTracer.currentSpan()Tracer.nextSpan()spring-doc.cn

在 Sleuth 中,你可以自动装配 bean 以通过 method 检索当前 span。要检索当前上下文,只需调用 .以 String 形式获取当前跟踪 ID 您可以使用如下方法: .Tracertracer.currentSpan()tracer.currentSpan().context()traceIdString()tracer.currentSpan().context().traceIdString()

7.1. 在范围内手动设置 span

编写新插桩时,请务必将您在 scope 中创建的 span 作为当前 span。 这样做不仅允许用户使用 访问它,还允许自定义(如 SLF4J MDC)查看当前跟踪 ID。Tracer.currentSpan()spring-doc.cn

Tracer.withSpanInScope(Span)有助于实现这一点,并且使用 try-with-resources 惯用语是最方便的。 每当可能调用外部代码(例如继续侦听器或其他方式)时,请将 span 置于范围内,如以下示例所示:spring-doc.cn

@Autowired Tracer tracer;

try (SpanInScope ws = tracer.withSpanInScope(span)) {
  return inboundRequest.invoke();
} finally { // note the scope is independent of the span
  span.finish();
}

在极端情况下,您可能需要暂时清除当前范围(例如,启动不应与当前请求关联的任务)。要执行 tso,请将 null 传递给 ,如以下示例所示:withSpanInScopespring-doc.cn

@Autowired Tracer tracer;

try (SpanInScope cleared = tracer.withSpanInScope(null)) {
  startBackgroundThread();
}