ASP.NET Core Web API 和 Jaeger - 我可以更改顶级 Span 名称吗?

ASP.NET Core Web API and Jaeger - Can I change the top level Span name?

我正在为 ASP.NET Core Web API 做一些 Jaeger Tracing 的原型设计,我能够使用 All in One instance of Jaeger described in the Getting Started documentation 和我的 [=] 中的以下代码让它工作14=]方法:

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 搜索 UI (http://localhost:16686/search) 中得到了 Traces 和他们的 Spans,但它只显示了带有我的服务名称的 Trace(在这种情况下“MySuperCoolWebAPI”)后跟“HTTP GET”:

在此处查看“HTTP GET”并不是很有用。相反,我想查看 Web API 操作名称或其他让我知道这到底是哪种请求的名称。

正如您从我上面的示例代码中看到的那样,我已经尝试设置 HttpHandlerDiagnosticOptions.OperationNameResolver 但这只会影响我从网络服务中进行的 HttpClient 调用。它似乎不会影响与我收到的请求关联的 Trace/Span 的命名方式。

我也试过在我的 Web API 控制器方法中设置 Span OperationName 像这样使用 GlobalTracer 但这会影响内部跨度而不是显示在主要 Jaeger [上的主要 Trace/Span =56=] 搜索结果页面:

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

在这里你可以看到第一个子 Span 的名称设置为我强制设置的名称,但主级 Span(我更改的父级 Span)不受影响:

有没有一种方法可以使用 Jaeger C# Client 设置主 Span 的操作名称?

此外,我正在使用 .NET Core 3.1 以防相关。

在深入了解 OpenTracing C# .NET Core 源代码 (https://github.com/opentracing-contrib/csharp-netcore) 后,我想出了如何覆盖顶层 Span.OperationName。

我不得不将我对 services.AddOpenTracing()Startup.ConfigureServices() 调用更新为以下内容:

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