我有两个独立的 Web 应用程序在同一进程中运行,但它们正在侦听不同的端口。每个应用程序都这样配置OTEL(每个应用程序的服务名称都是唯一的,例如有“GATEWAY”和“SUBSCRIPTIONS”服务:
builder.Services.AddOpenTelemetry()
.WithTracing(tracerProviderBuilder =>
tracerProviderBuilder
.ConfigureResource(cfg =>
{
cfg.AddService(serviceName);
})
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddGrpcClientInstrumentation()
.AddSource("GraphQL")
.AddSource(GraphQLTelemetryProvider.SourceName)
.AddSource(DiagnosticHeaders.DefaultListenerName)
.AddSentry()
.AddOtlpExporter(options =>
{
options.Endpoint = new Uri("http://localhost:4317");
})
);
问题是 Jaeger 中的所有跟踪都是重复的 - 例如,如果有到 GATEWAY 的 http 请求,然后 GATEWAY 在某处发出 http 请求,那么在 Jeager 中,我会看到传入的 HTTP 请求到同一“级别”上的 GATEWAY 和 SUBSCRIPTIONS,然后低于 GATEWAY我看到来自网关和订阅的传出 http 请求。
还在 Jaeger 中,我看到很多“重复的跨度 ID;跳过时钟偏差调整”警告。
总之,当服务 A “记录”span 时,所有其他服务也会“记录”它。
如何将这些服务的 OTEL 追踪分开?
您遇到的问题是因为 Activity 对于进程/AppDomain 来说是全局的。因此,您实例化的每个 TracerProvider 都会监听该活动并将其导出。
不幸的是,这是 .NET 中的预期行为,而不是特定于 OpenTelemetry。