У меня есть два отдельных веб-приложения, работающие в одном процессе, но они прослушивают разные порты. Каждое приложение настраивает OTEL следующим образом (имя службы уникально для каждого приложения, например есть службы «ШЛЮЗ» и «ПОДПИСКИ»:
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 дублируются - например, если есть http-запрос к GATEWAY, а затем GATEWAY где-то делает http-запрос, то в Jeager я вижу входящий HTTP-запрос как к GATEWAY, так и к SUBSCRIPTIONS на одном и том же «уровне», а затем ниже GATEWAY. см. исходящий HTTP-запрос как от GATEWAY, так и от SUBSCRIPTIONS.
Также в Jaeger я вижу множество предупреждений «дубликаты идентификаторов диапазона; пропуск регулировки отклонения тактовой частоты».
Таким образом, когда интервал «записывается» службой A, он также записывается «всеми другими службами».
Как я могу разделить отслеживание OTEL для этих служб?
Проблема, с которой вы сталкиваетесь, заключается в том, что Activity является глобальным для процесса/AppDomain. Таким образом, каждый экземпляр TracerProvider, который вы создаете, прослушивает это действие и экспортирует его.
К сожалению, это ожидаемое поведение в .NET, а не только для OpenTelemetry.