7. 当前 Span
Brave 支持一个 "0" 概念,它代表正在进行中的操作。
你可以使用 1" 为 span 添加自定义标签,并使用 2" 创建对当前正在进行中的内容的子节点。
在 Sleuth 中,你可以通过自动装配 Tracer bean 来通过 tracer.currentSpan() 方法获取当前的 span。要获取当前上下文,只需调用 tracer.currentSpan().context()。要将当前 trace id 作为字符串获取,可以像这样使用 traceIdString() 方法:tracer.currentSpan().context().traceIdString()。 |
7.1. 手动设置范围内的跨度
当编写新的仪器时,将您创建的跨度放在作用域中作为当前跨度非常重要。 不仅这样做可以让用户使用 0 访问它,还可以让像 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();
}
在边缘情况下,您可能需要临时清除当前跨度(例如,启动一个不应与当前请求关联的任务)。为此,将null传递给withSpanInScope,如以下示例所示:
@Autowired Tracer tracer;
try (SpanInScope cleared = tracer.withSpanInScope(null)) {
startBackgroundThread();
}