使用OTel Java API时,手动插入的代码通常如下所示:
@Inject
Tracer tracer;
public String instrumentedMethod() {
// ...
Span span = tracer.spanBuilder("interesting operation").startSpan();
span.setAttribute("custom.info", "some info");
try (Scope scope = span.makeCurrent()) {
// logic
}
finally {
span.end();
}
// ...
}
从我的Angular 来看,span
的寿命定义了两次:
tracer.spanBuilder("...").startSpan()
和span.end()
划分跨度的开始和结束,- 而且
span.makeCurrent()
和scope.end()
也以某种方式执行此操作
与span.makeCurrent()
/scope.end()
相比,startSpan()
/span.end()
的用途是什么?scope
可以省略吗?当使用scope
时,span.end()
是否多余?
1条答案
按热度按时间polkgigr1#
开始和结束一个span并不会让应用程序的其余部分知道当前的
Context
-即哪个span当前是“活动的”。如果不打开
Scope
,那么//logic
部分中的任何代码都无法知道Context
,因此它也无法知道父span是什么,最终将得到一堆没有通过公共跟踪链接在一起的单独span。当您打开
Scope
时,OpenTelemetry设置ThreadLocal
,因此在该范围(try
块)内启动的任何新范围都将能够知道其父范围是什么。在某些情况下,您可能有一个
Context
,但没有完整的Span
,因此出于这个原因(我假设还有其他一些原因),这些概念是分开的。