EF Core のメトリック

Entity Framework Core (EF Core) は連続的な数値メトリックを明らかにし、プログラムの正常性を適切に示すことができます。 これらのメトリックは、次の目的で使用できます。

  • アプリケーションの実行中に、データベースの一般的な負荷をリアルタイムで追跡する
  • パフォーマンスの低下につながる可能性がある、問題のあるコーディング プラクティスを明らかにする
  • 異常なプログラムの動作を追跡して特定する

メトリック

EF Core は、標準 System.Diagnostics.Metrics API を介してメトリックを報告します。 Microsoft.EntityFrameworkCore はメーターの名前です。 メトリックに関する .NET ドキュメントを参照することをお勧めします。

Note

この機能は 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_hit_rate

名前 インストルメントの種類 単位 (UCUM) 説明
microsoft.entityframeworkcore.compiled_query_cache_hit_rate ObservableGauge % コンパイルされたクエリ キャッシュの (最後の観測以降の) ヒット率。

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

カウンターとその意味

カウンター名 説明
Active DbContexts
(active-db-contexts)
現在アプリケーション内にある、アクティブで破棄されていない DbContext インスタンスの数。 この数が増え続けている場合、DbContext インスタンスが適切に破棄されていないことによりリークが発生しているおそれがあります。 コンテキスト プールが有効になっている場合、この数には、現在使用されていないプールされた DbContext インスタンスが含まれているので注意してください。
Execution Strategy Operation Failures
(total-execution-strategy-operation-failuresexecution-strategy-operation-failures-per-second)
データベース操作の実行に失敗した回数。 再試行実行戦略が有効になっている場合、これには、同じ操作で複数回行われた試みのうちの個々の失敗が含まれます。 これは、インフラストラクチャに関する一時的な問題の検出に使用できます。
Optimistic Concurrency Failures
(total-optimistic-concurrency-failuresoptimistic-concurrency-failures-per-second)
オプティミスティック同時実行制御エラーのために SaveChanges が失敗した回数。データ ストア内のデータがコードでの読み込み後に変更されたことが原因です。 これは、スローされる DbUpdateConcurrencyException に対応します。
クエリ
(total-queriesqueries-per-second)
実行されたクエリの数。
Query Cache Hit Rate (%)
(compiled-query-cache-hit-rate)
クエリ キャッシュのヒットとミスの割合。 特定の LINQ クエリが EF Core によって初めて実行された (パラメーターを除く) ときは、比較的負荷の大きいプロセスでそれをコンパイルする必要があります。 通常のアプリケーションではすべてのクエリが再利用され、クエリ キャッシュ ヒット率は、初期ウォームアップ期間の経過後に 100% で安定します。 時間の経過と共にこの数値が 100% 未満になった場合は、コンパイルが繰り返されたためにパフォーマンスが低下している可能性があります。これは、動的なクエリ生成が最適でないことが原因であると考えられます。
SaveChanges
(total-save-changessave-changes-per-second)
SaveChanges が呼び出された回数。 SaveChanges では 1 回のバッチで複数の変更が保存されるため、これが必ずしも 1 つのエンティティに対して行われた個々の更新を表すとは限りません。

その他のリソース