打开跟踪,不显示跨度之间的关系



我正在尝试使用开放跟踪来显示两个跨度之间的跟踪和关系。

从下面的实现中,我期望跟踪的结构如下。

spanOne (parent)
spanTwo (child)

相反,我最终发现2之间没有关系,每个都有自己的块。

spanOne
spanTwo

实施

只是一个接口

@FunctionalInterface
public interface AddData {
Single<Response> add(Request request);
}

实现上述接口的一类

import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.Tracer;
import rx.Single;
public class AddDataClassOne implements AddData {
private final String name;
private final Tracer tracer;
public AddDataClassOne(String name, Tracer tracer) {
this.name = name;
this.tracer = tracer;
}
@Override
public Single<Response> add(Request request) {
final Span span = this.tracer.buildSpan(this.name).start();
try(Scope ignored = this.tracer.scopeManager().activate(span)) {
// some other logic
return Single.just(new Response());
} finally {
span.finish();
}
}
}

实现上述接口的第二类(与第1类相同,删除了其他逻辑以保持简单(

import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.Tracer;
import rx.Single;
public class AddDataClassTwo implements AddData {
private final String name;
private final Tracer tracer;
public AddDataClassTwo(String name, Tracer tracer) {
this.name = name;
this.tracer = tracer;
}
@Override
public Single<Response> add(Request request) {
final Span span = this.tracer.buildSpan(this.name).start();
try(Scope ignored = this.tracer.scopeManager().activate(span)) {
// some other logic
return Single.just(new Response());
} finally {
span.finish();
}
}
}

Main类中,我将父类包装在子类上并调用add方法。

import io.jaegertracing.internal.JaegerTracer;
import io.jaegertracing.internal.samplers.ConstSampler;
import io.opentracing.Tracer;
import java.util.function.UnaryOperator;
public class MainClass {
private static final Tracer tracer = new JaegerTracer.Builder("sample-test")
.withSampler(new ConstSampler(true))
.build();
public static void main(String[] args) {
UnaryOperator<AddData> operator = addData -> new AddDataClassOne("spanOne", tracer);
AddDataClassTwo addDataClassTwo = new AddDataClassTwo("spanTwo", tracer);
AddData apply = operator.apply(addDataClassTwo);
apply.add(new Request()).subscribe();
}
}

来自文档:

如果已经有一个活动跨度,它将充当buildSpan((创建的跨度的父跨度。

根据给出的例子,每个逻辑都有自己的跨度名称,该名称在一个try块中捕获,与在这里做。

参考本页:下的最后一部分:在此页面上传播进程内上下文https://github.com/yurishkuro/opentracing-tutorial/tree/master/java/src/main/java/lesson02

我能得到一些关于缺少什么的建议吗?谢谢

据我所知,原因是在执行AddDataClassOne.add()span之后,它已经完成了,所以它不能有任何子span。

因此,当在AddDataClassTwo.add中调用start()时,它找不到活动跨度,也不能成为它的子级。

为了实现所需的结构,必须先调用AddDataClassTwo.add,然后再调用span.finish()

注意:嵌套最深的span应始终先关闭,然后再关闭最初打开的span-父级。

最新更新