Поделиться через


Метрики в EF Core

Entity Framework Core (EF Core) предоставляет непрерывные числовые метрики, которые могут обеспечить хорошее представление о работоспособности вашей программы. Эти метрики можно использовать в следующих целях:

  • Отслеживание общей загрузки базы данных в режиме реального времени при запуске приложения
  • Предоставление проблемных методов кодирования, которые могут привести к снижению производительности
  • Отслеживание и изоляция аномального поведения программы

Метрики

EF Core сообщает метрики через стандартный System.Diagnostics.Metrics API. Microsoft.EntityFrameworkCore — имя счетчика. Рекомендуется ознакомиться с документацией .NET по метрикам.

Примечание.

Эта функция представлена в EF Core 9.0 (в предварительной версии). Ознакомьтесь со счетчиками событий ниже для более старых версий EF Core.

Метрики и их смысл

Метрика: microsoft.entityframeworkcore.active_dbcontexts

Имя. Тип инструмента Единица (UCUM) Description
microsoft.entityframeworkcore.active_dbcontexts ObservableUpDownCounter {dbcontext} Число текущих активных DbContext экземпляров.

Доступно начиная с: Entity Framework Core 9.0.

Метрика: microsoft.entityframeworkcore.queries

Имя. Тип инструмента Единица (UCUM) Description
microsoft.entityframeworkcore.queries ObservableCounter {query} Совокупное количество выполненных запросов.

Доступно начиная с: Entity Framework Core 9.0.

Метрика: microsoft.entityframeworkcore.savechanges

Имя. Тип инструмента Единица (UCUM) Description
microsoft.entityframeworkcore.savechanges ObservableCounter {savechanges} Совокупное количество сохраненных изменений.

Доступно начиная с: Entity Framework Core 9.0.

Метрика: microsoft.entityframeworkcore.compiled_query_cache_hits

Имя. Тип инструмента Единица (UCUM) Description
microsoft.entityframeworkcore.compiled_query_cache_hits ObservableCounter {hits} Совокупное количество попаданий для скомпилированного кэша запросов.

Доступно начиная с: Entity Framework Core 9.0.

Метрика: microsoft.entityframeworkcore.compiled_query_cache_misses

Имя. Тип инструмента Единица (UCUM) Description
microsoft.entityframeworkcore.compiled_query_cache_misses ObservableCounter {misses} Совокупное количество промахов для скомпилированного кэша запросов.

Доступно начиная с: Entity Framework Core 9.0.

Метрика: microsoft.entityframeworkcore.execution_strategy_operation_failures

Имя. Тип инструмента Единица (UCUM) Description
microsoft.entityframeworkcore.execution_strategy_operation_failures ObservableCounter {failure} Совокупное число неудачных операций, выполняемых с IExecutionStrategyпомощью объекта .

Доступно начиная с: Entity Framework Core 9.0.

Метрика: microsoft.entityframeworkcore.optimistic_concurrency_failures

Имя. Тип инструмента Единица (UCUM) Description
microsoft.entityframeworkcore.optimistic_concurrency_failures ObservableCounter {failure} Совокупное число сбоев оптимистического параллелизма.

Доступно начиная с: Entity Framework Core 9.0.

Счетчики событий (устаревшие версии)

EF Core сообщает метрики с помощью стандартной функции счетчиков событий .NET; Рекомендуется ознакомиться с этой записью блога, чтобы получить краткий обзор работы счетчиков.

Присоединение к процессу с помощью счетчиков dotnet-counters

Средство dotnet-counters можно использовать для присоединения к запущенным процессам и регулярного отчета счетчиков событий EF Core. Для доступа к этим счетчикам не требуется ничего особенного.

Сначала установите dotnet-counters средство: dotnet tool install --global dotnet-counters

Затем найдите идентификатор процесса (PID) процесса для процесса .NET, выполняющего приложение EF Core:

  1. Откройте диспетчер задач Windows, щелкнув правой кнопкой мыши панель задач и выбрав "Диспетчер задач".
  2. Убедитесь, что в нижней части окна выбран параметр "Дополнительные сведения".
  3. На вкладке "Процессы" щелкните правой кнопкой мыши столбец и убедитесь, что столбец PID включен.
  4. Найдите приложение в списке процессов и получите его идентификатор процесса из столбца PID.

В приложении .NET идентификатор процесса доступен, так как Process.GetCurrentProcess().Idэто может быть полезно для печати PID при запуске.

Наконец, запустите dotnet-counters следующее:

dotnet counters monitor Microsoft.EntityFrameworkCore -p <PID>

dotnet-counters Теперь подключитесь к выполняемой процедуре и начнет создавать отчеты о непрерывных данных счетчиков:

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

Счетчики и их смысл

Имя счетчика Description
Активные dbContexts
(active-db-contexts)
Количество активных нерасположенных экземпляров DbContext в настоящее время в приложении. Если это число постоянно растет, может возникнуть утечка, так как экземпляры DbContext не удаляются должным образом. Обратите внимание, что если пул контекстов включен, это число включает в себя экземпляры DbContext, которые в настоящее время не используются.
Сбои стратегии выполнения
(total-execution-strategy-operation-failures и execution-strategy-operation-failures-per-second)
Количество неудачных операций базы данных. Если включена стратегия повтора выполнения, это включает каждый отдельный сбой в рамках нескольких попыток одной операции. Это можно использовать для обнаружения временных проблем с инфраструктурой.
Оптимистические сбои параллелизма
(total-optimistic-concurrency-failures и optimistic-concurrency-failures-per-second)
Количество SaveChanges неудачных попыток из-за ошибки оптимистического параллелизма, так как данные в хранилище данных были изменены после загрузки кода. Это соответствует создаваемому объекту DbUpdateConcurrencyException .
Запросов
(total-queries и queries-per-second)
Количество выполненных запросов.
Частота попаданий кэша запросов (%)
(compiled-query-cache-hit-rate)
Соотношение попаданий кэша запросов к пропущенным. При первом выполнении заданного запроса LINQ EF Core (за исключением параметров), его необходимо скомпилировать в том, что является относительно тяжелым процессом. В обычном приложении все запросы повторно используются, а скорость попадания кэша запросов должна быть стабильной в 100% после начального периода разогрева. Если это число меньше 100 % с течением времени, вы можете столкнуться с снижением производительности из-за повторяющихся компиляций, что может быть результатом неоптимального создания динамических запросов.
SaveChanges
(total-save-changes и save-changes-per-second)
Число раз SaveChanges было вызвано. Обратите внимание, что SaveChanges сохраняет несколько изменений в одном пакете, поэтому это не обязательно представляет каждое отдельное обновление, выполняемое в одной сущности.

Дополнительные ресурсы