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
microsoft.entityframeworkcore.queries
microsoft.entityframeworkcore.savechanges
microsoft.entityframeworkcore.compiled_query_cache_hits
microsoft.entityframeworkcore.compiled_query_cache_misses
microsoft.entityframeworkcore.execution_strategy_operation_failures
microsoft.entityframeworkcore.optimistic_concurrency_failures
指标: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):
- 右键单击任务栏并选择“任务管理器”,打开 Windows 任务管理器。
- 确保已选中窗口底部的“更多详细信息”选项。
- 在“进程”选项卡中,右键单击某一列并确保已启用 PID 列。
- 在进程列表中找到你的应用程序,并从 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-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 ) |
查询缓存命中与未命中的比率。 EF Core 首次执行指定的 LINQ 查询(不包括参数)时,必须在相对繁重的进程中对其进行编译。 在普通的应用程序中,所有查询都是重用的,并且在初始预热阶段后,查询缓存命中率应稳定在 100%。 如果此数字随着时间的推移低于 100%,则性能可能因重复编译而下降,这可能是次优动态查询生成的结果。 |
SaveChanges ( total-save-changes 和 save-changes-per-second ) |
SaveChanges 的调用次数。 请注意,SaveChanges 在单批中保存多个更改,因此这不一定代表在单个实体上完成的每一个更新。 |