Я делаю прототип 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;
};
});
Чтобы все это использовать, вам нужно добавить в свой проект несколько пакетов:
dotnet add package OpenTracing.Contrib.NetCore --version 0.6.2
dotnet add package Jaeger --version 0.4.1
Итак, это работает нормально, и я получаю следы с их промежутками, отображаемыми в моем пользовательском интерфейсе поиска Jaeger (http: // localhost: 16686 / search), но он просто показывает трассировку с именем моей службы (в данном случае MySuperCoolWebAPI), за которым следует HTTP GET:
Не очень полезно видеть там 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 C #?
Кроме того, я использую .NET Core 3.1, если это актуально.