1

我正在我的(异步)JVM 应用程序中实现开放人口普查跟踪。

但是我不明白上下文是如何传递的。有时它似乎工作正常,有时来自不同请求的跟踪无缘无故地出现嵌套。

我在日志中也出现了这个警告以及堆栈跟踪: SEVERE: Context was not attached when detaching

如何显式创建根跨度,以及如何将父/上下文显式传递给子跨度?

4

1 回答 1

3

在 OpenCensus 中,我们有一个独立于“跨度”或“标签”的上下文概念。它表示随请求传播的 Map(它被实现为线程本地,因此同步调用会自动传播)。对于仅用于传播的回调/异步调用(我们使用 io.grpc.Context 作为上下文的实现)使用此处定义的包装函数https://github.com/grpc/grpc-java/blob/master/context/ src/main/java/io/grpc/Context.java#L589。这将确保仅上下文传播,因此上下文映射中的条目将在不同线程之间传播。

如果您想在一个线程中启动 Span 并在另一个线程中结束它,请使用withSpan跟踪器https://www.javadoc.io/doc/io.opencensus/opencensus-api/0.17.0中的方法:

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

于 2018-11-20T19:37:28.123 回答