Метрики в 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) Описание
microsoft.entityframeworkcore.active_dbcontexts ObservableUpDownCounter (ОбзерваблАпДаунКантер) {dbcontext} Число текущих активных DbContext экземпляров.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Имя. Тип инструмента Единица (UCUM) Описание
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 --counters 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

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

Имя счетчика Описание
Активные DbContext'ы
(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 % с течением времени, вы можете столкнуться с снижением производительности из-за повторяющихся компиляций, что может быть результатом неоптимального создания динамических запросов.
Сохранить изменения
(total-save-changes и save-changes-per-second)
Количество вызовов SaveChanges. Обратите внимание, что SaveChanges сохраняет несколько изменений в одном пакете, поэтому это не обязательно означает каждое индивидуальное обновление, выполняемое на единой сущности.

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