Métricas en EF Core

Entity Framework Core (EF Core) expone métricas numéricas continuas que pueden proporcionar una buena indicación del estado del programa. Estas métricas se pueden usar con los siguientes fines:

  • Seguimiento de la carga general de la base de datos en tiempo real mientras se ejecuta la aplicación
  • Exponer las prácticas de codificación problemáticas que pueden degradar el rendimiento
  • Seguimiento y aislamiento del comportamiento anómalo del programa

Métricas

EF Core notifica métricas a través de la API de System.Diagnostics.Metrics estándar. Microsoft.EntityFrameworkCore es el nombre de la métrica. Se recomienda leer la documentación de .NET sobre las métricas.

Nota:

Esta característica se incluye por primera vez en EF Core 9.0 (versión preliminar). Consulte los contadores de eventos siguientes para versiones anteriores de EF Core.

Métricas y su significado

Métrica: microsoft.entityframeworkcore.active_dbcontexts

Nombre Tipo de instrumento Unidad (UCUM) Descripción
microsoft.entityframeworkcore.active_dbcontexts ObservableUpDownCounter {dbcontext} Número de instancias de DbContext activas actualmente.

Disponible a partir de Entity Framework Core 9.0.

Métrica: microsoft.entityframeworkcore.queries

Nombre Tipo de instrumento Unidad (UCUM) Descripción
microsoft.entityframeworkcore.queries ObservableCounter {query} Recuento acumulado de consultas ejecutadas.

Disponible a partir de Entity Framework Core 9.0.

Métrica: microsoft.entityframeworkcore.savechanges

Nombre Tipo de instrumento Unidad (UCUM) Descripción
microsoft.entityframeworkcore.savechanges ObservableCounter {savechanges} Recuento acumulado de cambios guardados.

Disponible a partir de Entity Framework Core 9.0.

Métrica: microsoft.entityframeworkcore.compiled_query_cache_hits

Nombre Tipo de instrumento Unidad (UCUM) Descripción
microsoft.entityframeworkcore.compiled_query_cache_hits ObservableCounter {hits} Recuento acumulativo de aciertos de las consultas compiladas de la memoria caché.

Disponible a partir de Entity Framework Core 9.0.

Métrica: microsoft.entityframeworkcore.compiled_query_cache_misses

Nombre Tipo de instrumento Unidad (UCUM) Descripción
microsoft.entityframeworkcore.compiled_query_cache_misses ObservableCounter {misses} Recuento acumulativo de errores de las consultas compiladas de la memoria caché.

Disponible a partir de Entity Framework Core 9.0.

Métrica: microsoft.entityframeworkcore.execution_strategy_operation_failures

Nombre Tipo de instrumento Unidad (UCUM) Descripción
microsoft.entityframeworkcore.execution_strategy_operation_failures ObservableCounter {failure} Número acumulativo de operaciones con error ejecutadas por una IExecutionStrategy.

Disponible a partir de Entity Framework Core 9.0.

Métrica: microsoft.entityframeworkcore.optimistic_concurrency_failures

Nombre Tipo de instrumento Unidad (UCUM) Descripción
microsoft.entityframeworkcore.optimistic_concurrency_failures ObservableCounter {failure} Número acumulado de errores de simultaneidad optimista.

Disponible a partir de Entity Framework Core 9.0.

Contadores de eventos (heredado)

EF Core informa de las métricas a través de la función estándar de contadores de eventos de .NET; se recomienda leer esta entrada de blog para obtener información general rápida sobre cómo funcionan los contadores.

Adjuntar un proceso usando dotnet-counters

La herramienta dotnet-counters se puede usar para asociarse a un proceso en ejecución e informar periódicamente de contadores de eventos de EF Core; no es necesario hacer nada especial en el programa para que estos contadores estén disponibles.

Primero, instale la dotnet-counters herramienta:dotnet tool install --global dotnet-counters.

A continuación, busque el identificador de proceso (PID) del proceso de .NET que ejecuta la aplicación de EF Core:

  1. Abra el administrador de tareas de Windows haciendo clic con el botón derecho del ratón en la barra de tareas y seleccionando "Administrador de tareas".
  2. Asegúrese de que la opción "Más detalles" esté seleccionada en la parte inferior de la ventana.
  3. En la pestaña Procesos, haga clic con el botón derecho en una columna y asegúrese de que la columna PID esté habilitada.
  4. Busque la aplicación en la lista de procesos y obtenga su Id. de proceso en la columna PID.

Dentro de la aplicación .NET, el identificador de proceso está disponible como Process.GetCurrentProcess().Id; esto puede ser útil para imprimir el PID al iniciarse.

Por último, inicie dotnet-counters de la siguiente manera:

dotnet counters monitor Microsoft.EntityFrameworkCore -p <PID>

dotnet-counters ahora se asociará al proceso en ejecución e iniciará la generación de informes de datos de contadores continuos:

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 y su significado

Nombre del contador Descripción
DbContexts activos
(active-db-contexts)
El número de instancias DbContext activas y no dispuestas actualmente en la aplicación. Si este número crece continuamente, es posible que tenga una pérdida porque las instancias de DbContext no se eliminan correctamente. Tenga en cuenta que si la agrupación de contextos está habilitada, este número incluye instancias de DbContext agrupadas que no están actualmente en uso.
Errores de operación de estrategia de ejecución
(total-execution-strategy-operation-failures y execution-strategy-operation-failures-per-second)
Número de veces que no se ha podido ejecutar una operación de base de datos. Si se habilita una estrategia de ejecución de reintento, esto incluye cada error individual dentro de varios intentos en la misma operación. Esto se puede usar para detectar problemas transitorios con la infraestructura.
Errores de simultaneidad optimista
(total-optimistic-concurrency-failures y optimistic-concurrency-failures-per-second)
SaveChanges número de veces que se ha producido un error de simultaneidad optimista, porque los datos del almacén de datos se cambiaron desde que el código lo cargó. Esto corresponde a un DbUpdateConcurrencyException que se produce.
Consultas
(total-queries y queries-per-second)
Número de consultas ejecutadas.
Tasa de aciertos de caché de consultas (%)
(compiled-query-cache-hit-rate)
Proporción de aciertos de caché de consultas a errores. La primera vez que EF Core ejecuta una consulta LINQ determinada (excepto los parámetros), debe compilarse en lo que es un proceso relativamente pesado. En una aplicación normal, se reutilizan todas las consultas y tasa de visitas de la caché de consultas debe ser estable al 100 % después de un período de preparación inicial. Si este número es inferior al 100 % a lo largo del tiempo, puede experimentar un rendimiento degradado debido a compilaciones repetidas, lo que podría ser un resultado de la generación de consultas dinámicas poco óptimas.
SaveChanges
(total-save-changes y save-changes-per-second)
Número de veces que se ha llamado a SaveChanges. Tenga en cuenta que SaveChanges guarda varios cambios en un solo lote, por lo que esto no representa necesariamente cada actualización individual realizada en una sola entidad.

Recursos adicionales