Profilazione delle applicazioni Node.js

Questa pagina descrive come modificare l'applicazione Node.js per acquisire i dati di profilazione e inviarli al progetto Google Cloud. Per informazioni generali sulla profilazione, consulta Concetti di profilazione.

Tipi di profilo per Node.js:

  • Heap
  • Tempo totale di esecuzione

Versioni del linguaggio Node.js supportate:

Versioni dell'agente di profilazione supportate:

  • È supportata la versione più recente dell'agente. In genere, le release precedenti a un anno non sono supportate. Ti consigliamo di utilizzare la versione dell'agente rilasciata più di recente.

Sistemi operativi supportati:

  • Linux. Il profiling delle applicazioni Node.js è supportato per i kernel Linux la cui libreria C standard è implementata con glibc o con musl. Per informazioni sulla configurazione specifiche per i kernel Linux Alpine, consulta Esecuzione su Linux Alpine.

Ambienti supportati:

Attivazione dell'API Profiler

Prima di utilizzare l'agente di profilazione, assicurati che l'API Profiler di base sia abilitata. Puoi controllare lo stato dell'API e attivarla se necessario utilizzando Google Cloud CLI o la console Google Cloud:

Interfaccia a riga di comando gcloud

  1. Se non hai ancora installato Google Cloud CLI sulla tua workstation, consulta la documentazione di Google Cloud CLI.

  2. Esegui questo comando:

    gcloud services enable cloudprofiler.googleapis.com
    

Per ulteriori informazioni, consulta gcloud services.

Console Google Cloud

  1. Enable the required API.

    Enable the API

  2. Se viene visualizzato il messaggio API abilitata, significa che l'API è già abilitata. In caso contrario, fai clic sul pulsante Attiva.

Concedi il ruolo IAM all'account di servizio

Se stai eseguendo il deployment dell'applicazione sulle risorse Google Cloud, se utilizzi l'account di servizio predefinito e non hai modificato le concessioni dei ruoli a questo account, puoi saltare questa sezione.

Se esegui una delle seguenti operazioni, devi concedere all'account di servizio il ruolo IAM di agente Cloud Profiler (roles/cloudprofiler.agent):

  1. Utilizzi l'account di servizio predefinito, ma ne hai modificato le concessioni dei ruoli.
  2. Stai utilizzando un account di servizio creato dall'utente.
  3. Se utilizzi Workload Identity, assegna il ruolo Agente Cloud Profiler all'account di servizio Kubernetes.

Puoi concedere un ruolo IAM a un account di servizio utilizzando la console Google Cloud o Google Cloud CLI. Ad esempio, puoi utilizzare il comando gcloud projects add-iam-policy-binding:

gcloud projects add-iam-policy-binding GCP_PROJECT_ID \
    --member serviceAccount:MY_SVC_ACCT_ID@GCP_PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudprofiler.agent

Prima di utilizzare il comando precedente, sostituisci quanto segue:

  • GCP_PROJECT_ID: l'ID del tuo progetto.
  • MY_SVC_ACCT_ID: il nome del tuo account di servizio.

Per informazioni dettagliate, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.

Utilizzo di Cloud Profiler

In tutti gli ambienti supportati, puoi utilizzare il profiler installando il pacchetto @google-cloud/profiler, aggiungendo un'istruzione require alla tua applicazione ed eseguendo il deployment dell'applicazione nel modo consueto.

Prima di installare @google-cloud/profiler

Il pacchetto @google-cloud/profiler dipende da un modulo integrato. I file binari precompilati per questo modulo integrato sono disponibili per Linux e Alpine Linux per Node 14 e 16. Non sono richieste dipendenze aggiuntive. @google-cloud/profiler utilizza node-pre-gyp per determinare quale codice binario precompilato installare.

Quando utilizzi @google-cloud/profiler in altri ambienti che non dispongono di file binari precompilati, il modulo node-gyp viene utilizzato per compilare i file binari. Per informazioni sulle dipendenze necessarie per compilare i binari con node-gyp, consulta la documentazione di installazione di node-gyp.

Installazione

Per installare la versione più recente di Cloud Profiler:

    npm install --save @google-cloud/profiler

Se utilizzi anche l'agente Trace, quando modifichi l'applicazione, importa il pacchetto Profiler dopo il pacchetto dell'agente Trace (@google-cloud/trace-agent).

Compute Engine

Per Compute Engine:

  1. Installa la versione più recente di Cloud Profiler:

    npm install --save @google-cloud/profiler
    
  2. Modifica il codice require dell'applicazione per creare un oggetto serviceContext che assegni a service il nome del servizio di cui viene eseguito il profilo. Facoltativamente, puoi assegnare a version la versione del servizio di cui viene eseguito il profilo. Per ulteriori informazioni su queste opzioni di configurazione, consulta Argomenti nome e versione del servizio:

    require('@google-cloud/profiler').start({
      serviceContext: {
        service: 'your-service',
        version: '1.0.0',
      },
    });

GKE

Per GKE, svolgi i seguenti passaggi:

  1. Modifica il Dockerfile per installare il pacchetto Profiler:

    FROM node:10
    ...
    RUN npm install @google-cloud/profiler
    
  2. Modifica il codice require dell'applicazione per creare un oggetto serviceContext che assegni a service il nome del servizio di cui viene eseguito il profilo. Facoltativamente, puoi assegnare a version la versione del servizio di cui viene eseguito il profilo. Per ulteriori informazioni su queste opzioni di configurazione, consulta Argomenti nome e versione del servizio:

    require('@google-cloud/profiler').start({
      serviceContext: {
        service: 'your-service',
        version: '1.0.0',
      },
    });

App Engine

Per l'ambiente flessibile di App Engine e per l'ambiente standard di App Engine, il codice require è simile al seguente:

require('@google-cloud/profiler').start();

In App Engine, i parametri service e version vengono ricavati dall'ambiente, quindi non devi specificarli. Di conseguenza, non è necessario creare un oggetto serviceContext.

Analisi dei dati

Dopo che Profiler ha raccolto i dati, puoi visualizzarli e analizzarli utilizzando l'interfaccia di Profiler.

Nella console Google Cloud, vai alla pagina Profiler:

Vai a Profiler

Puoi trovare questa pagina anche utilizzando la barra di ricerca.

Argomenti nome e versione del servizio

Quando carichi l'agente Profiler, specifica un argomento service-name e un argomento service-version facoltativo per configurarlo.

Il nome del servizio consente a Profiler di raccogliere i dati di profilazione per tutte le repliche del servizio. Il servizio di profilazione garantisce un tasso di raccolta di un profilo al minuto, in media, per ogni nome di servizio in tutte le versioni e le zone dei servizi combinati.

Ad esempio, se hai un servizio con due versioni in esecuzione su repliche in tre zone, il profiler creerà in media 6 profili al minuto per quel servizio.

Se utilizzi nomi di servizi diversi per le repliche, il servizio verrà sottoposto a profilazione più spesso del necessario, con un overhead di conseguenza più elevato.

Quando selezioni un nome di servizio:

  • Scegli un nome che rappresenti chiaramente il servizio nell'architettura dell'applicazione. La scelta del nome del servizio è meno importante se esegui un solo servizio o un'unica applicazione. È più importante se la tua applicazione viene eseguita come un insieme di microservizi, ad esempio.

  • Assicurati di non utilizzare valori specifici per il processo, ad esempio un ID processo, nella stringa del nome del servizio.

  • La stringa del nome del servizio deve corrispondere a questa espressione regolare:

    ^[a-z0-9]([-a-z0-9_.]{0,253}[a-z0-9])?$

Una buona linea guida è utilizzare una stringa statica come imageproc-service come nome del servizio.

La versione del servizio è facoltativa. Se specifichi la versione del servizio, Profiler può aggregare le informazioni di profilazione di più istanze e visualizzarle correttamente. Può essere utilizzato per contrassegnare versioni diverse degli tuoi servizi durante il loro dispiegamento. L'interfaccia utente di Profiler ti consente di filtrare i dati in base alla versione del servizio. In questo modo, puoi confrontare il rendimento delle versioni precedenti e successive del codice.

Il valore dell'argomento service-version è una stringa di formato libero, ma i valori per questo argomento in genere assomigliano a numeri di versione, ad esempio 1.0.0 o 2.1.2.

Logging dell'agente

L'agente di profilazione può segnalare le informazioni di log. Per attivare il logging, imposta l'opzione logLevel all'avvio dell'agente. I valori logLevel supportati sono:

  • 0: disattiva tutto il logging dell'agente.
  • 1: attiva il logging degli errori.
  • 2: attiva la registrazione degli avvisi (impostazione predefinita).
  • 3: attiva il logging delle informazioni.
  • 4: attiva il logging di debug.

Imposta il valore logLevel nello stesso oggetto che fornisce il contesto del servizio:

require('@google-cloud/profiler').start({
    serviceContext: { ... }
    logLevel:       3
});

Esecuzione con Linux Alpine

L'agente di profilazione Node.js per Linux Alpine è supportato solo per le configurazioni di Google Kubernetes Engine.

Errore di compilazione

Se esegui npm install e la compilazione non riesce con il seguente errore, nel tuo Dockerfile mancano alcune dipendenze di compilazione:

ERR! stack Error: not found: make

Per risolvere il problema, aggiungi la seguente istruzione alla fase di compilazione del Dockerfile:

RUN apk add python3 g++ make

Errore di autenticazione

Se utilizzi immagini Docker che vengono eseguite con Linux Alpine (ad esempio golang:alpine o solo alpine), potresti visualizzare il seguente errore di autenticazione:

connection error: desc = "transport: authentication handshake failed: x509: failed to load system roots and no roots provided"

Tieni presente che per visualizzare l'errore devi aver attivato la registrazione degli agenti.

L'errore indica che le immagini Docker con Linux Alpine non hanno i certificati SSL di root installati per impostazione predefinita. Questi certificati sono necessari per consentire all'agente di profilazione di comunicare con l'API profiler. Per risolvere questo errore, aggiungi il seguente comando apk al tuo Dockerfile:

FROM alpine
...
RUN apk add --no-cache ca-certificates

Devi quindi ricostruire e eseguire nuovamente il deployment dell'applicazione.

Problemi noti

L'agente di profilazione per Node.js interferisce con la normale uscita del programma. L'uscita del programma può richiedere fino a un'ora al termine di tutte le attività al suo interno. Quando emetti un SIGINT, ad esempio utilizzando Ctrl-C, il processo termina in modo corretto.

Passaggi successivi