MSAL.NET を使用したアプリケーションの監視

MSAL.NET を使用した認証サービスが正しく実行されていることを確認するために、MSAL には、運用環境で発生する前に問題を特定して対処できるように、その動作を監視するさまざまな方法が用意されています。 MSAL の不適切な使用は (トークンのライフサイクルとキャッシュに関連するため) すぐに失敗することはありませんが、アプリが一定期間運用環境に入った後、トラフィックの多いシナリオではバブルアップすることがあります。

たとえば、 機密クライアント アプリケーション のインスタンスが 1 つだけ使用され、MSAL がトークン キャッシュをシリアル化するように構成されていない場合、キャッシュは永久に拡張されます。 もう 1 つの問題は、新しい機密クライアント アプリケーションを作成し、キャッシュを使用しない場合に発生します。これにより、ID プロバイダーからの調整などの問題が発生します。 MSAL を適切に利用する方法に関する推奨事項については、「 高可用性」を参照してください。

Logging

MSAL が運用環境の問題に対処するために提供するツールの 1 つは、MSAL が正しく構成されていないときにエラーをログに記録することです。 ログでエラーを監視し、問題のあるイベントの診断に役立つログを可能な限り有効にすることが重要です。 詳細については、「MSAL.NET ログイン」を参照してください。

次のエラーが MSAL に記録されます。

  • /common または /organizations で終わる Authority を、クライアント資格情報認証 (AcquireTokenForClient(IEnumerable<String>)) に使用する場合。
    • 現在の機関は、推奨されない /common または /organizations エンドポイントをターゲットにしています。 詳細については、 クライアント資格情報フロー を参照してください。
  • 機密クライアント アプリケーションの使用中に既定の内部トークン キャッシュが使用される場合。
    • MSAL によって提供される既定のトークン キャッシュは、機密性の高いクライアント アプリケーションで使用する場合にパフォーマンスを発揮するようには設計されていません。 詳細については、MSAL.NET のトークン キャッシュのシリアル化に関するページを参照してください。

Metrics

MSAL では、ログに加えて、 AuthenticationResult.AuthenticationResultMetadataで重要なメトリックが公開されます。 詳細については、 MSAL 操作に関する監視の追加 を参照してください。

  • DurationTotalInMs - ネットワーク呼び出しやキャッシュ操作を含む、トークンの取得に MSAL で費やされた合計時間。 全体的な待機時間 (1 秒を超える) に関するアラートを作成します。 通常、初めてのトークン取得呼び出しでは、追加の HTTP 呼び出しが行われます。

  • DurationInCacheInMs - トークン キャッシュの読み込みまたは保存に費やされた時間。これはアプリ開発者によってカスタマイズされます (たとえば、Redis に保存)。 急増のアラートを作成します。

    Note

    トークン キャッシュをカスタマイズする方法については、MSAL.NET でのトークン キャッシュのシリアル化に関するページを参照してください。

  • DurationInHttpInMs - ID プロバイダーへの HTTP 呼び出しの作成に費やされた時間。 急増時のアラートを作成します。

  • TokenSource- トークンのソース (通常はキャッシュまたは ID プロバイダー) を示します。 トークンはキャッシュからはるかに高速に取得されます (たとえば、約 100 ミリ秒と約 700 ミリ秒)。 このメトリックを使用して、キャッシュ ヒット率を監視できます。

  • CacheRefreshReason - ID プロバイダーからアクセス トークンをフェッチする理由を指定します。 CacheRefreshReasonを参照してください。 TokenSourceと組み合わせて使用します。

  • TokenEndpoint - トークンのフェッチに使用される実際のトークン エンドポイント URI。 MSAL がサイレント呼び出しでテナントをどのように特定し、リージョン指定の呼び出しでリージョンをどのように特定するかを理解するのに役立ちます。

    Note

    地域化は、内部Microsoft アプリケーションでのみ使用できます。

  • RegionDetails - 使用されているリージョンや自動検出エラーなど、呼び出しに使用されるリージョンに関する詳細。

    Note

    地域化は、内部Microsoft アプリケーションでのみ使用できます。

OpenTelemetry

MSAL 4.58.0 以降、ライブラリでは OpenTelemetry がサポートされています。これは、一貫性のある標準化された方法でテレメトリ データのインストルメンテーション、生成、収集を可能にする一連の API です。 作業を開始するには、次のことを確認します。

  1. 最新バージョンの MSAL.NET をインストールします。
  2. OpenTelemetry パッケージの依存関係をプロジェクトに追加します。
  3. ログをエクスポートできるエクスポーターの依存関係を追加します。たとえば、OpenTelemetry.NET の Console exporter です。

Note

コンソール エクスポーターはローカル デバッグと診断に適していますが、運用環境でデプロイされたアプリケーションには最適な選択肢ではありません。 使用可能なオプションの詳細については、 公式の輸出者のドキュメント を参照することをお勧めします。 Azureでアプリケーションをホストしている場合は、Azure Data ExplorerまたはAzure Monitorに OpenTelemetry データを取り込することを検討してください。

アプリケーション初期化コードでは、MSAL 認証クライアント ( PublicClientApplicationConfidentialClientApplication など) をブートストラップする前に、次のコードを使用して新しい MeterProvider インスタンスを宣言します。

using var meterProvider = Sdk.CreateMeterProviderBuilder()
    .AddMeter("MicrosoftIdentityClient_Common_Meter")
    .AddConsoleExporter()
    .Build();

これにより、メーター プロバイダーが初期化され、一連のカウンターとヒストグラムをキャプチャする組み込みの MSAL.NET メーター (MicrosoftIdentityClient_Common_Meter) が使用されます。 コンソール エクスポーターを使用すると、出力がターミナルで直接パイプ処理されていることがわかります。

ターミナルにメトリックを出力する OpenTelemetry の例

次のセクションでは、既定のメーターでサポートされているカウンターとヒストグラムについて説明します。

カウンタ

msalsuccess_counter

MSAL で成功したリクエストの集計を取得するためのカウンター。

Metadata
フィールド 説明
MsalVersion 使用される MSAL のバージョン。
Platform 使用された .NET SKU
ApiId トークンの取得に使用される API の ID。
TokenSource トークンのソース (ID プロバイダーやキャッシュなど)。
CacheRefreshReason キャッシュ更新の理由。
CacheLevel カスタム キャッシュが使用されていてもレベルが記録されない場合は、L1、L2、または不明。

msalfailure_counter

MSAL で失敗した要求の集計をキャプチャするカウンター。

Metadata
フィールド 説明
MsalVersion 使用される MSAL のバージョン。
Platform 使用された.NET SKU。
ErrorCode MsalServiceException の場合は Microsoft Entra ID のエラー コード、MsalErrorCode の場合は MsalClientExceptionMsalException でない場合は例外名を指定します。
ApiId トークンの取得に使用される API の ID。
CacheRefreshReason キャッシュ更新の理由。

ヒストグラム

MsalTotalDuration_1a_histogram

MSAL を使用したトークン取得の合計待機時間をミリ秒単位でキャプチャするヒストグラム。

Metadata
フィールド 説明
MsalVersion 使用される MSAL のバージョン。
Platform 使用された .NET SKU。
ApiId トークンの取得に使用される API の ID。
CacheLevel カスタム キャッシュが使用されていてもレベルが記録されない場合は、L1、L2、または不明。
TokenSource トークンのソース (ID プロバイダーやキャッシュなど)。
CacheRefreshReason キャッシュ更新の理由。

MsalDurationInL1CacheInUs_1b_histogram

L1 キャッシュが使用されたときの待機時間をキャプチャするヒストグラム。 MSAL を使用したトークン取得の値はマイクロ秒単位です。

Metadata
フィールド 説明
MsalVersion 使用される MSAL のバージョン。
Platform 使用された .NET SKU。
ApiId トークンの取得に使用される API の ID。
CacheLevel カスタム キャッシュが使用されていてもレベルが記録されない場合は、L1、L2、または不明。
TokenSource トークンのソース (ID プロバイダーやキャッシュなど)。
CacheRefreshReason キャッシュ更新の理由。

MsalDurationInL2Cache_1a_histogram

MSAL を使用したトークン取得の L2 キャッシュ待機時間をミリ秒単位でキャプチャするヒストグラム。

Metadata
フィールド 説明
MsalVersion 使用される MSAL のバージョン。
Platform .NET SKU を使用。
ApiId トークンの取得に使用される API の ID。
CacheRefreshReason キャッシュ更新の理由。

MsalDurationInHttp_1a_histogram

MSAL を使用したトークン取得の HTTP 待機時間をミリ秒単位でキャプチャするヒストグラム。

Metadata
フィールド 説明
MsalVersion 使用される MSAL のバージョン。
Platform 使用された .NET SKU。
ApiId トークンの取得に使用される API の ID。

追加情報

.NET アプリケーションでの OpenTelemetry の使用の詳細については、OpenTelemetry での.NET可観測性に関するページを参照してください。