Веб-API ASP.NET Core и Jaeger - Могу ли я изменить имя Span верхнего уровня?

Я делаю прототип Jaeger Tracing для веб-API ASP.NET Core и могу заставить его работать, используя Универсальный экземпляр Jaeger, описанный в документации по началу работы, и следующий код в моем Startup.ConfigureServices() методе:

services.AddOpenTracing();

services.AddSingleton<ITracer>(serviceProvider =>
{
    string serviceName = serviceProvider.GetRequiredService<IWebHostEnvironment>().ApplicationName;

    ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();

    // Using the UDP sender
    Jaeger.Senders.Thrift.UdpSender udpSender = new Jaeger.Senders.Thrift.UdpSender();

    var reporter = new RemoteReporter.Builder().WithLoggerFactory(loggerFactory).WithSender(udpSender).Build();
    var sampler = new ConstSampler(true); //new GuaranteedThroughputSampler(samplingRate, lowerBound);
    
    ITracer tracer = new Tracer.Builder(serviceName).WithLoggerFactory(loggerFactory).WithReporter(reporter).WithSampler(sampler).Build();

    // Allows code that can't use DI to also access the tracer.
    GlobalTracer.Register(tracer);

    return tracer;
});

services.Configure<HttpHandlerDiagnosticOptions>(options =>
{
    //options.IgnorePatterns.Add(x => false);
    options.IgnorePatterns.Add(x => x.RequestUri.IsLoopback);
    
    options.OnRequest = (span, request) => 
    {
        span.SetTag("MyCustomTag", request.RequestUri.AbsoluteUri);
    };

    options.OperationNameResolver = (request) => 
    {
        return "X-" + request.RequestUri.AbsoluteUri;
    };
});

Чтобы все это использовать, вам нужно добавить в свой проект несколько пакетов:

  1. dotnet add package OpenTracing.Contrib.NetCore --version 0.6.2
  2. dotnet add package Jaeger --version 0.4.1

Итак, это работает нормально, и я получаю следы с их промежутками, отображаемыми в моем пользовательском интерфейсе поиска Jaeger (http: // localhost: 16686 / search), но он просто показывает трассировку с именем моей службы (в данном случае MySuperCoolWebAPI), за которым следует HTTP GET:

скриншот jaeger ui

Не очень полезно видеть там HTTP GET. Вместо этого я хочу видеть имя действия веб-API или что-то еще, что позволяет мне узнать, что это за запрос на самом деле.

Как видно из приведенного выше примера кода, я попытался установить HttpHandlerDiagnosticOptions.OperationNameResolver, но это влияет только на HttpClient вызовы, которые я делаю из своей веб-службы. Похоже, это не влияет на то, как называется Trace / Span, связанная с полученным мной запросом.

Я также попытался установить Span OperationName в моем методе контроллера веб-API, используя GlobalTracer, как это, но это влияет на внутренний диапазон, а НЕ на основную Trace / Span, которая отображается на основной странице результатов поиска Jaeger UI:

OpenTracing.Util.GlobalTracer.Instance.ActiveSpan.SetOperationName("My Web API Action Name");

Здесь вы можете видеть, что имя первого дочернего Span присвоено так, как я его заставил, но основной уровень Span (родительский элемент, который я изменил) не изменяется:

снимок экрана jaeger ui с дочерним диапазоном

Есть ли способ установить имя операции основного диапазона с помощью клиента Jaeger C #?

Кроме того, я использую .NET Core 3.1, если это актуально.


person BearsEars    schedule 23.09.2020    source источник


Ответы (1)


Покопавшись в исходном коде OpenTracing C # .NET Core (https://github.com/opentracing-contrib/csharp-netcore) Я понял, как переопределить Span.OperationName верхнего уровня.

Мне пришлось обновить мой Startup.ConfigureServices() вызов на services.AddOpenTracing() следующим образом:

services.AddOpenTracingCoreServices(otBuilder =>
{
    otBuilder.AddAspNetCore()
        .ConfigureAspNetCore(options =>
        {
            options.Hosting.OperationNameResolver = (httpContext) =>
            {
                return $"MySuperCoolOperationName ({httpContext.Request.Path.Value})";
            };
        })
        .AddCoreFx()
        .AddEntityFrameworkCore()
        .AddLoggerProvider();
});
person BearsEars    schedule 24.09.2020