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

问题描述

我正在为ASP.NET Core Web API进行Jaeger跟踪的原型制作,并且能够使用Startup.ConfigureServices()方法中的All in One instance of Jaeger described in the Getting Started documentation和以下代码来使其工作:

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 Search UI(http:// localhost:16686 / search)中得到了跟踪,并显示了其跨度,但它仅显示了带有我的服务名称的跟踪(在这种情况下为“ MySuperCoolWebAPI”)然后是“ HTTP GET”:

jaeger ui screenshot

在这里看到“ HTTP GET”不是很有用。相反,我想查看Web API操作名称或其他可以让我知道这实际上是什么样的请求的名称

从上面的示例代码中可以看到,我尝试设置HttpHandlerDiagnosticoptions.OperationNameResolver,但这仅影响我在Web服务中进行的HttpClient调用。似乎并不影响与我收到的请求关联的跟踪/跨度的命名方式。

我还尝试使用这样的GlobalTracer在Web API Controller方法中设置Span OperationName,但这会影响内部跨度,而不影响在Jaeger UI主搜索结果页面显示的主Trace / Span:

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

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

jaeger ui screenshot with child span

是否可以通过Jaeger C#Client设置主跨度的操作名称

此外,如果相关,我将使用.NET Core 3.1。

解决方法

在OpenTracing C#.NET Core源代码(https://github.com/opentracing-contrib/csharp-netcore)中进行深入研究之后,我发现了如何覆盖顶级Span.OperationName。

我必须将对Startup.ConfigureServices()的{​​{1}}调用更新为以下内容:

services.AddOpenTracing()