opencensus - явное управление контекстом - PullRequest
0 голосов
/ 10 ноября 2018

Я реализую отслеживание opencensus в моем (асинхронном) приложении JVM.

Однако я не понимаю, как передается контекст. Иногда кажется, что все работает нормально, иногда следы от разных запросов появляются вложенными без причины.

У меня также есть это предупреждение в журналах вместе с трассировкой стека: SEVERE: Context was not attached when detaching

Как я могу явно создать корневой диапазон и как я могу явно передать родительский / контекст дочерним диапазонам?

1 Ответ

0 голосов
/ 20 ноября 2018

В OpenCensus у нас есть понятие контекста, независимого от «Span» или «Tags». Он представляет карту, которая распространяется с запросом (она реализована в виде локального потока, поэтому в вызовах синхронизации автоматически распространяется). Для обратных вызовов / асинхронных вызовов только для распространения (мы используем 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

...