我正在尝试使用开放跟踪来显示两个跨度之间的跟踪和关系。
从下面的实现中,我期望跟踪的结构如下。
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-父级。