java 开放遥测范围与spanBuilder.startSpan()和span.end()

wn9m85ua  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(136)

使用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()是否多余?

polkgigr

polkgigr1#

开始和结束一个span并不会让应用程序的其余部分知道当前的Context-即哪个span当前是“活动的”。
如果不打开Scope,那么//logic部分中的任何代码都无法知道Context,因此它也无法知道父span是什么,最终将得到一堆没有通过公共跟踪链接在一起的单独span。
当您打开Scope时,OpenTelemetry设置ThreadLocal,因此在该范围(try块)内启动的任何新范围都将能够知道其父范围是什么。
在某些情况下,您可能有一个Context,但没有完整的Span,因此出于这个原因(我假设还有其他一些原因),这些概念是分开的。

相关问题