Profilazione delle applicazioni Node.js

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

Tipi di profili per Node.js:

  • Heap
  • Tempo totale di esecuzione

Versioni lingua supportate per Node.js:

  • 10.4.1 o versioni successive sul ramo versione 10.x.
  • 12.0.0 o versioni successive sul ramo della versione 12.x.
  • 14.0.0 o versioni successive nel ramo della versione 14.x.
  • Per il criterio di rilascio Node.js, consulta Release.

Versioni dell'agente di profilazione supportate:

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

Sistemi operativi supportati:

  • Linux La profilazione delle applicazioni Node.js è supportata per i kernel Linux la cui libreria C standard è implementata con glibc o con musl. Per informazioni di configurazione specifiche per i kernel Linux Alpine, consulta In esecuzione su Linux Alpine.

Ambienti supportati:

Abilitazione dell'API Profiler

Prima di utilizzare l'agente di profilazione, assicurati che l'API Profiler sia attiva. Puoi controllare lo stato dell'API e abilitarla, se necessario, utilizzando l'interfaccia a riga di comando di Google Cloud o Google Cloud Console:

Interfaccia a riga di comando gcloud

  1. Se non hai già installato l'interfaccia a riga di comando di Google Cloud sulla workstation, consulta la documentazione sull'interfaccia a riga di comando di Google Cloud.

  2. Esegui questo comando:

    gcloud services enable cloudprofiler.googleapis.com
    

Per ulteriori informazioni, consulta gcloud services.

Cloud Console

  1. Vai alla dashboard API e servizi:

    Vai ad API e servizi

  2. Seleziona il progetto che utilizzerai per accedere all'API.

  3. Fai clic sul pulsante Aggiungi API e servizi.

    Aggiungi API e servizi

  4. Cerca l'API Profiler.

  5. Nei risultati di ricerca, seleziona API Cloud Profiler.

    Se non vedi l'API Cloud Profiler, seleziona l'API Stackdriver Profiler.

  6. Se è visualizzata l'opzione API abilitata, l'API è già abilitata. In caso contrario, fai clic sul pulsante Attiva.

Utilizzo di Cloud Profiler

In tutti gli ambienti supportati, puoi utilizzare Profiler installando il pacchetto @google-cloud/profiler, aggiungendo un'istruzione require all'applicazione e eseguendo quindi il deployment dell'applicazione.

Prima di installare @google-cloud/profiler

Il pacchetto @google-cloud/profiler dipende da un modulo nativo. I programmi binari predefiniti per questo modulo nativo sono disponibili per tutte le combinazioni di lingue e piattaforme supportate. Per determinare quale programma binario predefinito installare, @google-cloud/profiler usa node-pre-gyp.

Installazione

Per installare la versione più recente di Cloud Profiler, segui questi passaggi:

    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). Per ulteriori informazioni, consulta la sezione Configurare Cloud Trace per Node.js.

Compute Engine

Per Compute Engine, procedi nel seguente modo:

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

    npm install --save @google-cloud/profiler
    
  2. Modifica il codice dell'applicazione require per creare un oggetto serviceContext che assegni a service il nome del servizio profilato. Facoltativamente, puoi assegnare a version la versione del servizio profilato. Consulta l'argomento Nome del servizio e argomenti della versione per ulteriori informazioni su queste opzioni di configurazione:

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

GKE

Per GKE, segui questi passaggi:

  1. Modifica il tuo Dockerfile per installare il pacchetto Profiler:

    FROM node:10
    ...
    RUN npm install @google-cloud/profiler
    
  2. Modifica il codice dell'applicazione require per creare un oggetto serviceContext che assegni a service il nome del servizio profilato. Facoltativamente, puoi assegnare a version la versione del servizio profilato. Consulta l'argomento Nome del servizio e argomenti della versione per ulteriori informazioni su queste opzioni di configurazione:

    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 derivano dall'ambiente, quindi non è necessario specificarli. Pertanto, non devi creare un oggetto serviceContext.

Analisi dei dati

Dopo aver raccolto dati, Profiler può visualizzare e analizzare questi dati utilizzando l'interfaccia di Profiler. Per iniziare a utilizzare questa interfaccia, consulta la pagina Apertura dell'interfaccia di Profiler.

Argomenti del nome e della versione del servizio

Quando carichi l'agente Profiler, devi specificare un argomento del nome servizio e un argomento facoltativo della versione servizio per configurarlo.

Il nome del servizio consente a Profiler di raccogliere i dati di profilazione per tutte le repliche del servizio. Il servizio profiler garantisce una frequenza di raccolta di un profilo al minuto, in media, per ogni nome di servizio in ogni versione e zona del servizio combinata.

Ad esempio, se utilizzi un servizio con due versioni in esecuzione in più repliche in tre zone, il profiler creerà una media di sei profili al minuto per quel servizio.

Se utilizzi nomi di servizio diversi per le tue repliche, il servizio verrà profilo più spesso del necessario, con un sovraccarico di conseguenza superiore.

Quando selezioni il nome di un servizio:

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

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

  • La stringa nome-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 da più istanze e visualizzarle correttamente. Può essere utilizzato per contrassegnare versioni diverse dei servizi durante l'implementazione. La UI di Profiler ti consente di filtrare i dati in base alla versione del servizio; in questo modo puoi confrontare le prestazioni delle versioni precedenti e più recenti del codice.

Il valore dell'argomento relativo alla versione del servizio è una stringa in formato libero, ma i valori per questo argomento in genere sono simili ai numeri di versione, ad esempio 1.0.0 o 2.1.2.

Logging dell'agente

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

  • 0: disabilita tutti i log dell'agente.
  • 1: abilita il logging degli errori.
  • 2: abilita il logging degli avvisi (impostazione predefinita).
  • 3: consente il logging delle informazioni.
  • 4: abilita 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
});

Corsa con Linux Alpine

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

Se utilizzi immagini Docker 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 è necessario che sia abilitato il logging degli agenti.

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

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

Dovrai quindi ricreare e sottoporre nuovamente a deployment l'applicazione.

Problemi noti

L'agente di profilazione per Node.js interferisce con la normale uscita del programma; può trascorrere fino a un'ora prima che l'uscita del programma venga completata dopo che tutte le attività sono state completate. Quando emetti SIGINT, ad esempio con Ctrl-C, il processo viene terminato correttamente.

Passaggi successivi

Per informazioni sul grafico e sui controlli di Profiler, consulta Utilizzo dell'interfaccia di Cloud Profiler. Per informazioni avanzate, consulta: