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;
};
});
要使用所有这些,您需要向您的项目添加一些包:
dotnet add package OpenTracing.Contrib.NetCore --version 0.6.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();
});
我正在为 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;
};
});
要使用所有这些,您需要向您的项目添加一些包:
dotnet add package OpenTracing.Contrib.NetCore --version 0.6.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();
});