Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Předpoklady
- Informace o výkonu najdete v prohlížeči MSAL , který popisuje techniky, které může vaše aplikace použít ke zlepšení výkonu získávání tokenů pomocí knihovny MSAL.
- Node.js
Měření výkonu
Aplikace, které chtějí měřit výkon toků ověřování v uzlu MSAL, to můžou provést ručně pomocí rozhraní API pro měření výkonu uzlu nebo podobných rozhraní API . Níže je uveden seznam některých významných datových bodů, které můžete shromažďovat:
| Data | Meaning | Návrhy |
|---|---|---|
authType |
acquireToken* Rozhraní API použité pro žádost o token |
Slouží k identifikaci využití. |
correlationId |
ID korelace použité pro požadavek tokenu. Tuto možnost můžete získat prostřednictvím correlationId vlastnosti AuthenticationResult. |
Slouží k identifikaci využití. |
durationTotalInMs |
Celkový čas strávený v MSAL, včetně síťových volání a přístupu k mezipaměti | Alarm při celkové vysoké latenci (> 1 sekunda). Hodnota závisí na zdroji tokenu. Z mezipaměti: jeden přístup k mezipaměti. Ze sítě: dva přístupy do mezipaměti plus dvě volání HTTP. |
durationInCacheInMs |
Doba strávená načítáním nebo ukládáním perzistence mezipaměti tokenů (např. Redis). | Alarm při špičkách. |
durationInHttpInMs |
Čas strávený voláním HTTP na IdP (např. Microsoft Entra ID). Vlastního síťového klienta můžete použít k podrobnějšímu monitorování. Další informace najdete v ukázce konfigurace a vlastní sítě . | Alarm při špičkách. |
tokenSource |
Zdroj tokenu (tj. z mezipaměti nebo ze sítě). Tuto možnost můžete získat prostřednictvím fromCache vlastnosti AuthenticationResult. |
Tokeny se načítají z mezipaměti mnohem rychleji (např. ~100 ms versus ~700 ms). Lze použít k monitorování a poměru přístupů do mezipaměti alarmů. Používejte společně s durationTotalInMs. |
Příklad:
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
}
});
Důležité informace o výkonu důvěrných klientských aplikací
Vzhledem k tomu, že důvěrné klientské aplikace se primárně používají se scénáři na straně serveru zahrnujícím souběžné zpracování požadavků, doporučujeme určit rozsah instancí MSAL ConfidenticalClientApplication (CCA) pro každého uživatele, požadavek nebo relaci.
Nová instance CCA pro každý požadavek znamená, že výchozí mezipaměť v paměti zpočátku neobsahuje žádné tokeny nebo metadata o tom, jak získat tokeny. Proto by instance CCA, kterou vytvoříte, měla být připravena před žádostí o token, aby se zabránilo nízkému výkonu.
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;
};
Další informace najdete v článku Web API (CCA) pomocí vlastního modulu pro distribuovanou mezipaměť.