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

接下来,找到运行 EF Core 应用程序的 .NET 进程的进程 ID (PID):

  1. 右键单击任务栏并选择“任务管理器”,打开 Windows 任务管理器。
  2. 确保已选中窗口底部的“更多详细信息”选项。
  3. 在“进程”选项卡中,右键单击某一列并确保已启用 PID 列。
  4. 在进程列表中找到你的应用程序,并从 PID 列中获取其进程 ID。

在 .NET 应用程序中,进程 ID 以 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

计数器及其含义

计数器名称 说明
活动 DbContexts
(active-db-contexts)
当前应用程序中活动的且未释放的 DbContext 实例的数量。 如果此数字持续增长,则可能出现了遗漏,因为 DbContext 实例未受到正确释放。 请注意,如果已启用上下文池,则此数字包括当前未使用的池化 DbContext 实例。
执行策略操作失败
total-execution-strategy-operation-failuresexecution-strategy-operation-failures-per-second
数据库操作执行失败的次数。 如果已启用重试执行策略,则这包括多次尝试同一操作时的每一次失败。 这可用于检测基础结构的瞬态问题。
乐观并发失败
total-optimistic-concurrency-failuresoptimistic-concurrency-failures-per-second
SaveChanges 因乐观并发错误(因为代码加载数据存储中的数据时该数据发生了更改)而失败的次数。 这对应于引发的 DbUpdateConcurrencyException
查询
total-queriesqueries-per-second
执行的查询数。
查询缓存命中率 (%)
(compiled-query-cache-hit-rate)
查询缓存命中与未命中的比率。 EF Core 首次执行指定的 LINQ 查询(不包括参数)时,必须在相对繁重的进程中对其进行编译。 在普通的应用程序中,所有查询都是重用的,并且在初始预热阶段后,查询缓存命中率应稳定在 100%。 如果此数字随着时间的推移低于 100%,则性能可能因重复编译而下降,这可能是次优动态查询生成的结果。
SaveChanges
total-save-changessave-changes-per-second
SaveChanges 的调用次数。 请注意,SaveChanges 在单批中保存多个更改,因此这不一定代表在单个实体上完成的每一个更新。

其他资源