多个追踪器的用例是什么?

won*_*857 8 trace go open-telemetry

我正在使用 Golang 中的 otel 官方 sdk 跟踪包来实现跟踪功能。其存储库的链接位于此处

虽然拥有, , ...TracerProvider等所有配置,但我们仍然可以从相同的配置中选择不同的配置:ExporterSpanProcessorSamplerTracerTracerProvider

tracerA := otel.GetTracerProvider().Tracer("TracerA")
tracerB := otel.GetTracerProvider().Tracer("TracerB")
Run Code Online (Sandbox Code Playgroud)

由于它们来自同一个 TracerProvider,因此 TracerA 和 TracerB 的行为相同。没有其他设置可以产生影响。下面的示例将生成一条迹线,而不是分开的迹线。

ctx, span := tracerA.Start(context.Background(), "First Span")
ctx, span = tracerB.start(ctx, "Second Span")

// above becomes
|----------------------| // First Span
    |-------------|      // Second Span
Run Code Online (Sandbox Code Playgroud)

我想知道为什么otel提供这些不同的Tracer实例。无论Tracer使用哪个,结果都是一样的。它有一个用例吗?

MrA*_*ias 7

Tracers 用于区分范围。跟踪确实可以跨越范围的边界,但为了显示系统内的信息流,保留跨度的范围起源非常重要。

例如,如果您有一个包调用另一个包,并且两个包都被用来记录跟踪遥测,那么如果您想追踪错误或性能问题,那么了解跨度来自哪个包就至关重要。因此,Tracer需要唯一标识检测代码。对于 OpenTelemetry Go,建议名称Tracer...

是提供检测的库的 Go 包名称(注意:不是正在检测的代码)。

Tracer应该只在该检测包中使用,并且作为应用程序一部分的任何其他包都应该有自己的Tracer.

事实上,所有这些Tracer都源自相同的TracerProvider,并且 是TracerProvider具有所有导出和处理配置的对象,这意味着这些Tracer将为应用程序生成的所有遥测数据都是相同的处理和导出。