在同一进程中运行多个 Web 应用程序时,重复开放遥测跨度 ID

问题描述 投票:0回答:1

我有两个独立的 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 追踪分开?

asp.net-core open-telemetry
1个回答
0
投票

您遇到的问题是因为 Activity 对于进程/AppDomain 来说是全局的。因此,您实例化的每个 TracerProvider 都会监听该活动并将其导出。

不幸的是,这是 .NET 中的预期行为,而不是特定于 OpenTelemetry。

© www.soinside.com 2019 - 2024. All rights reserved.