如何解决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;
};
});
要使用所有这些,您需要向项目中添加一些软件包:
-
dotnet add package OpenTracing.Contrib.NetCore --version 0.6.2
-
dotnet add package Jaeger --version 0.4.1
所以这行得通,我在Jaeger Search UI(http:// localhost:16686 / search)中得到了跟踪,并显示了其跨度,但它仅显示了带有我的服务名称的跟踪(在这种情况下为“ MySuperCoolWebAPI”)然后是“ HTTP GET”:
在这里看到“ 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 C#Client设置主跨度的操作名称?
此外,如果相关,我将使用.NET Core 3.1。
解决方法
在OpenTracing C#.NET Core源代码(https://github.com/opentracing-contrib/csharp-netcore)中进行深入研究之后,我发现了如何覆盖顶级Span.OperationName。
我必须将对Startup.ConfigureServices()
的{{1}}调用更新为以下内容:
services.AddOpenTracing()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。