Desempenho no MSAL Node

Pré-requisitos

  • Consulte o desempenho no MSAL Browser , que descreve as técnicas que seu aplicativo pode usar para melhorar o desempenho da aquisição de token usando MSAL.
  • Node.js

Medição do desempenho

Os aplicativos que desejam medir o desempenho dos fluxos de autenticação no nó MSAL podem fazer isso manualmente, usando APIs de medida de desempenho do Node ou semelhantes. Abaixo está uma lista de alguns pontos de dados notáveis que você pode coletar:

Dados Meaning Suggestions
authType acquireToken* API usada para a solicitação de token Use isto para identificar o uso.
correlationId ID de correlação usada para a solicitação de token. Você pode obter isso por meio da correlationId propriedade em AuthenticationResult Utilizado para identificar o uso.
durationTotalInMs Tempo total gasto na MSAL, incluindo chamadas de rede e acesso ao cache Alarme para latência geral alta (> 1 segundo). O valor depende da origem do token. Do cache: um acesso ao cache. Da rede: dois acessos de cache mais duas chamadas HTTP.
durationInCacheInMs Tempo gasto carregando ou salvando a persistência do cache de token (por exemplo, Redis). Alarme em picos.
durationInHttpInMs Tempo gasto fazendo chamadas HTTP ao IdP (por exemplo, Microsoft Entra ID). Você pode usar um cliente de rede personalizado para um monitoramento mais refinado. Consulte Configuração e exemplo de rede personalizada para obter mais informações Alarme em picos.
tokenSource Origem do token (ou seja, cache versus rede). Você pode obter isso por meio da fromCache propriedade em AuthenticationResult Os tokens são recuperados do cache muito mais rápido (por exemplo, ~100 ms versus ~700 ms). Pode ser usado para monitorar e emitir alertas sobre a taxa de acertos do cache. Use em conjunto 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 aplicativos cliente confidenciais

Como os aplicativos cliente confidenciais são usados principalmente com cenários do lado do servidor envolvendo o processamento simultâneo de solicitações, recomendamos definir o escopo das instâncias da MSAL ConfidenticalClientApplication (CCA) para cada usuário, solicitação ou sessão.

Uma nova instância de CCA para cada solicitação significa que seu cache na memória padrão inicialmente não conterá tokens ou metadados sobre como adquirir tokens. Dessa forma, a instância de CCA que você cria deve ser preparada antes da solicitação de token, a fim de evitar um desempenho ruim.

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 a API Web (CCA) usando um plug-in de cache distribuído personalizado para obter mais informações.

Consulte também