Трассировка MediatR с использованием Application Insights в ASP.NET Core - PullRequest
0 голосов
/ 02 июня 2019

Каков в настоящее время рекомендуемый способ отслеживания MediatR с использованием Application Insights в базовом приложении ASP.NET?

Наша цель - развернуть отдельные конвейеры в приложении из запроса, посредника, вызова в ответ.

Способ 1 : Wrap Mediator в действии

    [HttpGet]
    [Route("", Name = MachinesRoutes.Names.GetMachines)]
    public async Task<IActionResult> GetMachines()
    {
        MachinesProjection p;
        using (IOperationHolder<RequestTelemetry> operation = _telemetryClient.StartOperation<RequestTelemetry>(nameof(GetMachinesCommand)))
        {
             p = await _mediator.Send(new GetMachinesCommand());
        }

        // ....
    }

Путь 2: собственный диспетчер

public class MediatorDispatcher : IEventDispatcher
{
    private readonly IMediator _mediator;
    private readonly TelemetryClient _telemetryClient;

    public MediatorDispatcher(IMediator mediator, TelemetryClient telemetryClient )
    {
        _mediator = mediator;
        _telemetryClient = telemetryClient;
    }

    public async Task<TResponse> Send<TResponse>(IRequest<TResponse> command, CancellationToken cancellationToken = default)
    {
        using IOperationHolder<RequestTelemetry> operation = _telemetryClient.StartOperation<RequestTelemetry>(command.GetType().FullName);
        return await _mediator.Send(command, cancellationToken).ConfigureAwait(false);
    }

Путь 3 ...?

В конце мы хотим иметь способ распознавать запросы, которые занимают необычно много времени.

Должна также быть возможность распознать причину длительности запроса, то есть развернуть операцию.

Спасибо.

1 Ответ

0 голосов
/ 04 июня 2019

Я согласен с @Peter Bons. Поведение будет самым оптимальным способом в вашем сценарии. поведения, которые позволяют вам создавать свой собственный конвейер непосредственно внутри MediatR, не решая использовать декораторы вокруг ваших обработчиков. Это более естественный способ улучшить ваши обработчики поведением и лучше поддерживать в контейнерах.

Поведение конвейера является реализацией IPipelineBehavior. Он представляет собой шаблон, подобный фильтрам в ASP.NET MVC / Web API или поведениям конвейера в NServiceBus. Ваше поведение конвейера должно реализовывать один метод:

Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next);

Существует два встроенных поведения:

  • RequestPreProcessorBehavior выполнит реализации IRequestPreProcessor до вызова любых обработчиков
  • RequestPostProcessorBehavior выполнит реализации IRequestPostProcessor после вызова всех обработчиков

Вы можете найти их в пространстве имен MediatR.Pipeline, и их необходимо будет явно зарегистрировать в вашем контейнере в качестве открытых обобщенных элементов.

Кроме того, любые IRequestPreProcessor и IRequestPostProcessor должны быть зарегистрированы в контейнере.

Пример конвейера можно найти здесь .

Надеюсь, это поможет.

...