Výkon v uzlu MSAL

Předpoklady

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ěť.

Viz také