Contadores de eventos

O EF Core (Entity Framework Core) expõe métricas numéricas contínuas que podem fornecer uma boa indicação da integridade do seu programa. Essas métricas podem ser usadas com as seguintes finalidades:

  • Acompanhar a carga geral do banco de dados em tempo real enquanto o aplicativo está em execução
  • Expor práticas de codificação problemáticas que podem levar a um desempenho degradado
  • Rastrear e isolar um comportamento anômalo do programa

O EF Core relata métricas por meio do recurso de contadores de eventos .NET padrão. É recomendável ler esta postagem no blog para obter uma visão geral rápida de como os contadores funcionam.

Anexar a um processo usando a ferramenta dotnet-counters

A ferramenta dotnet-counters pode ser usada para anexar a um processo em execução e fazer relatórios sobre contadores de eventos do EF Core regularmente; nada de especial precisa ser feito no programa para que esses contadores fiquem disponíveis.

Primeiro, instale a ferramenta dotnet-counters: dotnet tool install --global dotnet-counters.

Em seguida, localize a ID do processo (PID) do processo do .NET executando seu aplicativo EF Core:

  1. Abra o Gerenciador de Tarefas do Windows clicando com o botão direito do mouse na barra de tarefas e selecionando "Gerenciador de Tarefas".
  2. Verifique se a opção "Mais detalhes" está selecionada na parte inferior da janela.
  3. Na guia Processos, clique com o botão direito do mouse em uma coluna e verifique se a coluna PID está habilitada.
  4. Localize seu aplicativo na lista de processos e obtenha sua ID de processo da coluna PID.

Dentro de seu aplicativo .NET, a ID do processo está disponível como Process.GetCurrentProcess().Id; isso pode ser útil para imprimir o PID na inicialização.

Por fim, inicie dotnet-counters da seguinte maneira:

dotnet counters monitor Microsoft.EntityFrameworkCore -p <PID>

O dotnet-counters agora será anexado ao processo em execução e começará a relatar dados contínuos do contador:

Press p to pause, r to resume, q to quit.
 Status: Running

[Microsoft.EntityFrameworkCore]
    Active DbContexts                                               1
    Execution Strategy Operation Failures (Count / 1 sec)           0
    Execution Strategy Operation Failures (Total)                   0
    Optimistic Concurrency Failures (Count / 1 sec)                 0
    Optimistic Concurrency Failures (Total)                         0
    Queries (Count / 1 sec)                                         1
    Queries (Total)                                               189
    Query Cache Hit Rate (%)                                      100
    SaveChanges (Count / 1 sec)                                     0
    SaveChanges (Total)                                             0

Contadores e seu significado

Nome do contador Descrição
DbContexts ativos
(active-db-contexts)
O número de instâncias DbContext ativas e não expostas atualmente em seu aplicativo. Se esse número aumentar continuamente, você poderá ter um vazamento porque as instâncias DbContext não estão sendo descartadas corretamente. Observe que, se o pool de contexto estiver habilitado, esse número inclui instâncias DbContext em pool que não estão em uso no momento.
Falhas na operação da estratégia de execução
(total-execution-strategy-operation-failures e execution-strategy-operation-failures-per-second)
O número de vezes que uma operação de banco de dados falhou ao ser executada. Se uma estratégia de execução de repetição estiver habilitada, isso incluirá cada falha individual em várias tentativas na mesma operação. Isso pode ser usado para detectar problemas transitórios com sua infraestrutura.
Falhas de simultaneidade otimistas
(total-optimistic-concurrency-failures e optimistic-concurrency-failures-per-second)
O número de vezes SaveChanges falhou devido a um erro de simultaneidade otimista, pois os dados no armazenamento de dados foram alterados desde que o código o carregou. Isso corresponde a uma DbUpdateConcurrencyException sendo gerada.
Consultas
(total-queries e queries-per-second)
O número de consultas executadas.
Taxa de ocorrência no cache de consulta (%)
(compiled-query-cache-hit-rate)
A proporção de ocorrências no cache de consulta em relação aos erros. Na primeira vez em que uma determinada consulta LINQ é executada pelo EF Core (excluindo parâmetros), ela deve ser compilada no que é um processo relativamente pesado. Em um aplicativo normal, todas as consultas são reutilizados e a taxa de ocorrência do cache de consultas deve ficar estável em 100% após um período de aquecimento inicial. Se esse número for menor que 100% ao longo do tempo, você poderá experimentar um desempenho degradado devido a compilações repetidas, o que pode ser resultado de uma geração de consulta dinâmica abaixo do ideal.
SaveChanges
(total-save-changes e save-changes-per-second)
O número de vezes SaveChanges foi chamado. Observe que SaveChanges salva várias alterações em um único lote, portanto, isso não representa necessariamente cada atualização individual feita em uma única entidade.

Recursos adicionais