我正在我的(异步)JVM应用程序中实现opencensus跟踪。
但是我不明白上下文是如何传递的。 有时,它似乎运行良好,有时,来自不同请求的跟踪无故被嵌套。
我也有此警告和堆栈跟踪出现在日志中:
SEVERE: Context was not attached when detaching
如何显式创建根跨度,以及如何显式将父级/上下文传递给子跨度?
答案 0 :(得分:1)
在OpenCensus中,我们有一个上下文概念,与“ Span”或“ Tags”无关。它表示随请求传播的Map(它是作为线程局部实现的,因此在同步调用中会自动传播)。对于仅用于传播的回调/异步调用(我们使用io.grpc.Context作为上下文的实现),请使用此处https://github.com/grpc/grpc-java/blob/master/context/src/main/java/io/grpc/Context.java#L589定义的包装函数。这将确保仅上下文传播,因此上下文映射中的条目将在不同线程之间传播。
如果要在一个线程中启动Span,在另一个线程中结束Span,请使用跟踪器https://www.javadoc.io/doc/io.opencensus/opencensus-api/0.17.0中的withSpan
方法:
class MyClass {
private static Tracer tracer = Tracing.getTracer();
void handleRequest(Executor executor) {
Span span = tracer.spanBuilder("MyRunnableSpan").startSpan();
// do some work before scheduling the async
executor.execute(Context.wrap(tracer.withSpan(span, new Runnable() {
@Override
public void run() {
try {
sendResult();
} finally {
span.end();
}
}
})));
}
}
此处https://github.com/census-instrumentation/opencensus-specs/blob/master/trace/Span.md#span-creation
对此有更多信息