Usa Stackdriver Logging e Stackdriver Trace per Cloud Functions

1. Introduzione

In questo codelab imparerai a sfruttare gli strumenti di logging e monitoraggio disponibili per tutti gli sviluppatori che lavorano con Cloud Functions. Gli strumenti sono forniti con ogni funzione Cloud Functions di cui esegui il deployment in tutti i linguaggi supportati e dovrebbero consentirti di essere più produttivo quando scrivi e utilizzi il codice serverless.

5815064fec87444b.png

Utilizzerai una funzione Cloud Functions attivata da HTTP, ma gli argomenti trattati si applicano anche ad altri linguaggi e a Cloud Functions attivati da altri eventi.

2. Configurazione e requisiti

Configurazione dell'ambiente da seguire in modo autonomo

  1. Accedi alla console Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o G Suite, devi crearne uno.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Ricorda l'ID progetto, un nome univoco in tutti i progetti Google Cloud (il nome precedente è già stato utilizzato e non funzionerà correttamente). Verrà indicato più avanti in questo codelab come PROJECT_ID.

  1. Successivamente, dovrai abilitare la fatturazione in Cloud Console per utilizzare le risorse Google Cloud.

Eseguire questo codelab non dovrebbe costare molto. Assicurati di seguire le istruzioni nella sezione "Pulizia" in cui viene spiegato come arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Cloud Shell

Mentre Cloud Functions e le sue funzionalità di logging e monitoraggio possono essere utilizzati da remoto dal tuo laptop, utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud.

Questa macchina virtuale basata su Debian viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Ciò significa che per questo codelab è sufficiente un browser (sì, funziona su Chromebook).

  1. Per attivare Cloud Shell dalla console Cloud, fai semplicemente clic su Attiva Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (il provisioning e la connessione all'ambiente dovrebbero richiedere solo pochi minuti).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

Dopo la connessione a Cloud Shell, dovresti vedere che hai già eseguito l'autenticazione e che il progetto è già impostato su PROJECT_ID.

gcloud auth list

Output comando

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Output comando

[core]
project = <PROJECT_ID>

Se, per qualche motivo, il progetto non è impostato, invia semplicemente il seguente comando:

gcloud config set project <PROJECT_ID>

Stai cercando il tuo PROJECT_ID? Controlla l'ID utilizzato nei passaggi di configurazione o cercalo nella dashboard della console Cloud:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell imposta anche alcune variabili di ambiente per impostazione predefinita, cosa che può essere utile quando eseguirai comandi futuri.

echo $GOOGLE_CLOUD_PROJECT

Output comando

<PROJECT_ID>
  1. Infine, imposta la zona e la configurazione del progetto predefinite.
gcloud config set compute/zone us-central1-f

Puoi scegliere zone diverse. Per ulteriori informazioni, consulta Regioni e Zone.

3. Esegui il deployment di una funzione Cloud Functions semplice

Per avere qualcosa da monitorare, crea un "Hello World" la funzione Cloud Function. Nel menu a sinistra della console Google Cloud, fai clic su Cloud Functions, quindi su Crea funzione.

3c13aa20af602aa7.png

Inserisci "hello-monitor" come nome della nuova funzione Cloud Functions.

fa6816c96d6d5b94.png

Mantieni tutte le impostazioni predefinite per il codice sorgente. Tuttavia, se vuoi, puoi scegliere una lingua/un runtime diverso.

7aadf164450484e.png

Infine, fai clic su Crea.

dc74cd21000d6c91.png

Dovresti vedere la funzione Cloud Functions elencata con un segno di spunta verde accanto alla funzione, che indica che è pronta per essere richiamata.

5363a34eb001d5ed.png

4. Testa la funzione Cloud Functions e invia il traffico utilizzando un generatore di carico

Ora che il deployment della funzione Cloud Functions è stato eseguito correttamente, testala dalla riga di comando.

Per prima cosa, utilizzando Cloud Shell, emetti questo comando:

$ gcloud functions describe hello-monitor

Dovrebbe essere restituita una descrizione della funzione Cloud Functions, incluso un URL per httpsTrigger, che è l'endpoint HTTP(S) per richiamare la funzione Cloud Functions. Dovrebbe avere un aspetto simile al seguente: https://<region>-<project-id>.cloudfunctions.net/hello-monitor.

Ora l'attivazione della funzione Cloud Functions dovrebbe essere semplice: basta utilizzare il comando curl su quell'URL.

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

Ora utilizza Vegeta, un semplice strumento di test del carico HTTP. Per installarlo, da Cloud Shell, digita semplicemente il seguente comando :

$ go get -u github.com/tsenart/vegeta

Per inviare del traffico alla funzione Cloud Functions (cinque richieste al secondo per un paio di minuti), utilizza il comando seguente:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

5. Naviga tra i log

Nella visualizzazione dei dettagli della funzione Cloud Functions, fai clic su Visualizza log.

b24157fd3376e6a8.png

Questo dovrebbe portarti alla sezione Stackdriver Logging del tuo progetto, dove vedrai solo i log della funzione Cloud Functions.

5a36fa75d2fb0165.png

Tutte le richieste alla funzione Cloud Functions devono restituire un codice di stato 200.

Quando visualizzi i log, puoi:

  • Filtra per livello di log (in questo caso, tutti i log sono a livello di debug).
  • Seleziona un periodo di tempo specifico (relativo o assoluto).
  • Attiva il flusso di log (con Riproduci 751a4600016f34a7.pngnella parte superiore dello schermo).
  • Copia un link alla voce di log (per la condivisione con i membri del team).
  • Mostra una voce di log nel contesto della risorsa.
  • Fissa una voce di log (come segnale visivo).
  • Esporta i log in BigQuery, Cloud Storage o Pub/Sub (oppure scaricali semplicemente come file JSON o CSV).

6. Aggiorna la funzione

Utilizzando la console Cloud, vai alla visualizzazione Dettagli funzione e osserva il picco che hai creato con il tester del carico per il numero di chiamate al secondo e il relativo tempo di esecuzione.

aaee3159bbe395d3.png 7ed347101da5eca0.png

Un altro strumento più dettagliato per osservare la latenza e le chiamate RPC è Stackdriver Trace, ma prima di poterlo utilizzare, devi apportare alcune modifiche a Cloud Functions. Segui questi passaggi:

  1. Aggiungi il pacchetto node-emoji salvavita come dipendenza.
  2. Aggiorna il codice della funzione per utilizzare il modulo node-emoji e introdurre un po' di latenza.
  3. Aggiungi una variabile di ambiente per abilitare Stackdriver Trace per Cloud Functions.

In Dettagli funzione, fai clic su Modifica per modificare la funzione.

39b0f8f98b18a6c0.png

Modifica il file package.json per aggiungere una dipendenza per il pacchetto node-emoji.

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

Modifica la funzione effettiva cambiando i contenuti di index.js come segue:

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

Ciò consente di aggiungere un'emoji casuale al messaggio restituito dalla funzione Cloud Functions dopo una pausa di 300 millisecondi.

Infine, aggiungi una variabile di ambiente della funzione Cloud Functions denominata GOOGLE_CLOUD_TRACE_ENABLED e impostala su true come segue:

9205bd277b76aa21.png

Fai clic su Salva.

Torna a Cloud Shell e richiama il comando per generare un carico sulla funzione Cloud Functions di cui è stato appena eseguito il deployment:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

Ora puoi esaminare l'elenco delle tracce prodotte senza altri requisiti di configurazione e senza libreria di tracciamento specifica nel codice.

7. Traccia la funzione Cloud Functions aggiornata

Dal menu a sinistra, vai a Elenco di tracce (in Stackdriver Trace).

576373f38cad6f8.png

Dovresti vedere qualcosa di simile al seguente screenshot:

44a36b758b49f88f.png

Questo dovrebbe chiarire che la latenza introdotta nella funzione Cloud Functions è effettivamente misurata a 300 millisecondi.

Ogni punto del grafico è una richiesta per la quale puoi visualizzare informazioni dettagliate, come timestamp, metodo e stato HTTP, relative etichette, un link alla voce di log corrispondente e qualsiasi chiamata RPC successiva effettuata dalla funzione Cloud Functions.

5815064fec87444b.png

Per aumentare lo zoom, fai clic sul grafico e trascinalo. Selezione di un intervallo di tempo personalizzato nel grafico di traccia

Per diminuire lo zoom, fai clic su Annulla zoom nella parte superiore della pagina.

Poiché hai eseguito il deployment di una singola funzione Cloud Functions, il grafico mostra solo le richieste GET nell'URI hello-monitor, ma puoi filtrare le tracce per metodo HTTP (GET, POST, DELETE) in base allo stato HTTP (2XX, 3XX) o utilizzando il filtro delle richieste.

Vai a Panoramica nel menu a sinistra:

e920cfca2a50899e.png

In questa pagina Panoramica puoi trovare tracce recenti e altri insight.

ef5a45647967d275.png

Inoltre, è possibile creare report personalizzati basati su una combinazione di un filtro per le richieste URI, un metodo HTTP, uno stato HTTP e un intervallo di tempo. Ti consente anche di confrontare i valori generati con un riferimento temporale.

5bd34e9d13b47fb6.png

Se riesci a impostare gli intervalli di tempo corretti con punti dati sufficienti, puoi generare un report che mostri l'importante scostamento di latenza tra la funzione Cloud Functions iniziale e quella nuova.

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

Un report personalizzato di questo tipo può essere utilizzato per scoprire quando è stato introdotto un problema di prestazioni e monitorare un indicatore del livello del servizio (SLI), come la latenza delle richieste dell'utente finale.

8. Tempo per la pulizia delle risorse

Con questo si conclude il codelab.

Sebbene Cloud Functions e gli strumenti Stackdriver siano piattaforme serverless che non comportano costi quando non sono in uso, ti consigliamo di essere un buon cittadino del cloud ed eliminare la tua funzione Cloud Functions. È sufficiente selezionare hello-monitor in Panoramica in Cloud Functions e fare clic su Elimina.

aceb633cf70a4a27.png

9. Passaggi successivi

Ecco alcune informazioni di follow-up:

/