Desempenho no MSAL Node

Pré-requisitos

Medir desempenho

Aplicações que pretendam medir o desempenho dos fluxos de autenticação no MSAL Node podem fazê-lo manualmente, utilizando as APIs de medição de desempenho do Node ou similares. Abaixo está uma lista de alguns pontos de dados notáveis que pode recolher:

Dados Meaning Sugestões
authType acquireToken* API usada para o pedido de token Utilizar para identificar a utilização.
correlationId ID de correlação usado para o pedido de token. Pode obter isto através da correlationId propriedade em AuthenticationResult Utilizar para identificar a utilização.
durationTotalInMs Tempo total gasto em MSAL, incluindo chamadas de rede e acesso à cache Alarme com latência geral elevada (> 1 segundo). O valor depende da origem do token. Do cache: um acesso ao cache. Da rede: dois acessos à cache mais duas chamadas HTTP.
durationInCacheInMs Tempo gasto a carregar ou guardar a persistência da cache do token (por exemplo, Redis). Alarme em caso de picos.
durationInHttpInMs Tempo gasto a fazer chamadas HTTP para IdP (por exemplo, Microsoft Entra ID). Podes usar um cliente de rede personalizado para monitorização mais detalhada. Veja Configuração e exemplo de rede personalizada para mais informações Alarme em caso de picos.
tokenSource Origem do token (ou seja, cache vs rede). Pode obter isto através da fromCache propriedade em AuthenticationResult Os tokens são recuperados da cache muito mais rapidamente (por exemplo, ~100 ms contra ~700 ms). Pode ser usado para monitorizar e emitir alertas para a taxa de acerto da cache. Use juntamente com durationTotalInMs.

Por exemplo:

    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
        }
    });

Considerações de desempenho para aplicações confidenciais de clientes

Como as aplicações cliente confidenciais são principalmente usadas em cenários do lado do servidor que envolvem processamento simultâneo de pedidos, recomendamos que as instâncias MSAL ConfidenticalClientApplication (CCA) sejam atribuídas a cada utilizador, pedido ou sessão.

Uma instância CCA nova para cada pedido significa que a sua cache predefinida em memória inicialmente não conterá quaisquer tokens ou metadados sobre como adquirir tokens. Assim, a instância CCA que criar deve estar preparada antes do pedido de token para evitar um desempenho fraco.

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;
};

Consulte (CCA) Web API usando um plugin de cache distribuído personalizado para mais informações.

Consulte também