Pular para conteúdo

Performance

A performance da aplicação é medida pelo APM, ferramenta integrante da solução Elastic Stack. Temos duas formas de monitoramento de performance de acordo com o contexto da aplicação, API ou Workers

Performance da API

Na API automaticamente todo request recebido gera uma transação no APM feito pela biblioteca Elastic.Apm.AspNetCore, devido o registro do serviço na configuração da aplicação feita no Startup

Startup da API
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseElasticApm(Configuration,
        new SqlClientDiagnosticSubscriber(),
        new HttpDiagnosticsSubscriber());
}

Para isso devemos incluir as configurações descritas na seção Configuração do APM da seção Integrações dessa documentação.

O detalhamento dessa transação gerada automaticamente, pode ser feita utilizando o IServicoTelemetria (que pode ser injetado na construção da classe).

Como exemplo disso temos o tempo de execução das queries, que como utilizamos o Dapper e ele não gera transação automaticamente no APM, fazemos o registro das transações por meio de interceptors definidos na classe "DapperExtensionMethods" demonstrado a seguir:

Exemplo de registro de ação dentro de uma transação já iniciada
public static async Task<IEnumerable<T>> QueryAsync<T>(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null, string queryName = "")
{
    var result = await servicoTelemetria.RegistrarComRetornoAsync<T>(async () => await SqlMapper.QueryAsync<T>(cnn, sql, param, transaction, commandTimeout, commandType), "Postgres", $"Query {queryName}", sql, param?.ToString());

    return result;
}
Esse comando gera um span dentro da transação atual do tipo "Postgres" com o nome "Query {queryName}".

Monitorar Performance da API

No menu Observability > APM > Services do Kibana encontraremos todas as aplicações que registram telemetria no APM.

O nome do serviço é definido na configuração "ServiceName" da seção "ElasticApm". Acessando o serviço "SME_SGP_API" e aba transações teremos o detalhamento de todas as requisições HTTP registradas na API:

Acessando a transação temos informações de média de latencia, Throughput e Falhas no período.

Mais abaixo em "Transaction Sample" podemos ver o detalhamento da transação com os span registrados em cada etapa da execução dessa transação:

Performance dos Workers

Como os Workers não trabalham com requisição HTTP (que a biblioteca Elastic gera automaticamente), e sim processamento de uma mensagem recebida na fila RabbitMQ, o WorkerRabbitSGP faz o registro da transação manualmente a cada mensagem obtida pelo método TratarMensagem.

Exemplo de criação de transação ao processar uma mensagem
public async Task TratarMensagem(BasicDeliverEventArgs ea)
{
    var mensagem = Encoding.UTF8.GetString(ea.Body.Span);
    var rota = ea.RoutingKey;

    var mensagemRabbit = JsonConvert.DeserializeObject<MensagemRabbit>(mensagem);
    var comandoRabbit = Comandos[rota];

    var transacao = telemetriaOptions.Apm ? Agent.Tracer.StartTransaction(rota, apmTransactionType) : null;
    try
    {
        using var scope = serviceScopeFactory.CreateScope();
        AtribuirContextoAplicacao(mensagemRabbit, scope);

        IRabbitUseCase casoDeUso = (IRabbitUseCase)scope.ServiceProvider.GetService(comandoRabbit.TipoCasoUso);

        await servicoTelemetria.RegistrarAsync(
                async () => await casoDeUso.Executar(mensagemRabbit),
                "RabbitMQ",
                rota,
                rota,
                mensagem);

        canalRabbit.BasicAck(ea.DeliveryTag, false);
    }
    catch (Exception ex)
    {
        transacao?.CaptureException(ex);
        canalRabbit.BasicReject(ea.DeliveryTag, false);
    }
    finally
    {
        transacao?.End();
    }
}

Dentro do processamento da mensagem em cada UseCase relacionado a fila pode ser incluso mais detalhes à transação por meio do ServicoTelemetria como feito com as queries demostrado na seção Performance da API.

Monitorar Performance dos Workers

No menu Observability > APM > Services do Kibana encontraremos todas as aplicações que registram telemetria no APM.

Acessando o serviço "SME_SGP_Fechamento_Worker", por exemplo, e aba transações devemos mudar o tipo de transação para "WorkerRabbitFechamento" e teremos o detalhamento de todas as filas processadas pelo Worker: