Prerequisites
- MSAL を使用したトークン取得のパフォーマンスを向上させるためにアプリケーションで使用できる手法の概要については、「 MSAL Browser のパフォーマンス」を参照してください。
- Node.js
パフォーマンスの測定
MSAL Node の認証フローのパフォーマンスを測定するアプリケーションは、Node の パフォーマンス測定 API などを 使用して手動で行うことができます。 収集できる注目すべきデータ ポイントの一覧を次に示します。
| データ | Meaning | 推奨事項 |
|---|---|---|
authType |
acquireToken* トークン要求に使用される API |
使用状況を識別するために使用します。 |
correlationId |
トークン要求に使用される関連付け ID。 これはcorrelationId の プロパティを使用して取得できます。 |
使用状況を識別するために使用します。 |
durationTotalInMs |
ネットワーク呼び出しとキャッシュ アクセスを含む、MSAL で費やされた合計時間 | 全体的な待機時間が長い場合のアラーム (> 1 秒)。 値はトークン ソースによって異なります。 キャッシュから: 1 つのキャッシュ アクセス。 ネットワークから: 2 つのキャッシュ アクセスと 2 つの HTTP 呼び出し。 |
durationInCacheInMs |
トークン キャッシュの永続化 (Redis など) の読み込みまたは保存に費やされた時間。 | スパイク時のアラーム。 |
durationInHttpInMs |
IdP への HTTP 呼び出しの実行に費やされた時間 (例: Microsoft Entra ID)。 より詳細な監視には、カスタム ネットワーク クライアントを使用できます。 詳細については、 構成 と カスタム ネットワークのサンプル を参照してください | スパイク時のアラーム。 |
tokenSource |
トークンのソース (つまり、キャッシュとネットワーク)。 これはfromCache の プロパティを使用して取得できます。 |
トークンはキャッシュからはるかに高速に取得されます (たとえば、約 100 ミリ秒と約 700 ミリ秒)。 キャッシュヒット率の監視とアラートに使用できます。
durationTotalInMsと一緒に使用します。 |
例えば次が挙げられます。
const { PerformanceObserver, performance } = require('node:perf_hooks');
const perfObserver = new PerformanceObserver((items) => {
items.getEntries().forEach((entry) => {
console.log(entry);
})
});
perfObserver.observe({ entryTypes: ["measure"], buffered: true });
// ...
performance.mark("acquireTokenByClientCredential-start");
const tokenResponse = await msalInstance.acquireTokenByClientCredential({
scopes: ["User.Read.All"],
});
performance.mark("acquireTokenByClientCredential-end");
performance.measure("acquireTokenByClientCredential", {
start: "acquireTokenByClientCredential-start"
end: "acquireTokenByClientCredential-end"
detail: {
tokenSource: tokenResponse.fromCache
correlationId: tokenResponse.correlationId
}
});
機密クライアント アプリケーションのパフォーマンスに関する考慮事項
機密クライアント アプリケーションは主に、要求の同時処理を伴うサーバー側のシナリオで使用されるため、MSAL ConfidenticalClientApplication (CCA) インスタンスのスコープを各ユーザー、要求、またはセッションにすることをお勧めします。
各要求の新しい CCA インスタンスは、既定のメモリ内キャッシュに、トークンの取得方法に関するトークンやメタデータが最初に含まれていないことを意味します。 そのため、パフォーマンスが低下しないように、作成する CCA インスタンスはトークン要求の前に準備する必要があります。
import {
ConfidentialClientApplication,
AuthenticationResult,
CryptoProvider,
OnBehalfOfRequest
} from "@azure/msal-node";
function getMsalInstance(partitionKey: string): ConfidentialClientApplication {
return new ConfidentialClientApplication({
auth: {
clientId: "ENTER_CLIENT_ID",
authority: "http://login.microsoftonline.com/ENTER_TENANT_ID"
cloudDiscoveryMetadata: "PROVIDE_STRINGIFIED_DISCOVERY_METADATA"
authorityMetadata: "PROVIDE_STRINGIFIED_AUTHORITY_METADATA"
},
cache: {
cachePlugin: new CustomCachePlugin(
this.cacheClientWrapper,
partitionKey
)
}
});
};
async function getToken(tokenRequest: OnBehalfOfRequest): Promise<AuthenticationResult | null> {
const partitionKey = await this.cryptoProvider.hashString(tokenRequest.oboAssertion);
const cca = getMsalInstance(partitionKey);
let tokenResponse = null;
try {
await cca.getTokenCache().getAllAccounts(); // required for cache read
tokenResponse = await cca.acquireTokenOnBehalfOf(tokenRequest);
} catch (error) {
throw error;
}
return tokenResponse;
};
詳細については、 カスタム分散キャッシュ プラグインを使用した (CCA) Web API を参照してください。