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 inclusi in ogni funzione Cloud che esegui il deployment in tutte le lingue supportate e dovrebbero consentirti di essere più produttivo durante la scrittura e l'utilizzo del codice serverless.

5815064fec87444b.png

Utilizzerai una funzione Cloud attivata tramite HTTP, ma tutto ciò che tratterai si applica anche ad altri linguaggi e alle funzioni Cloud attivate da altri eventi.

2. Configurazione e requisiti

Configurazione dell'ambiente autonomo

  1. Accedi alla console Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai già 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 tra tutti i progetti Google Cloud (il nome sopra è già stato utilizzato e non funzionerà per te, mi dispiace). In questo codelab verrà chiamato PROJECT_ID.

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

L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Assicurati di seguire le istruzioni riportate nella sezione "Pulizia", che ti consiglia come arrestare le risorse in modo da non incorrere in addebiti oltre questo tutorial. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Cloud Shell

Anche se Cloud Functions e le relative funzionalità di logging e monitoraggio possono essere utilizzate in 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 di cui avrai bisogno. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Ciò significa che per questo codelab ti servirà solo un browser (sì, funziona su Chromebook).

  1. Per attivare Cloud Shell dalla console Cloud, fai clic su Attiva Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (bastano pochi istanti per eseguire il provisioning e connettersi all'ambiente).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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

Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e il progetto è già impostato sul tuo 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, esegui questo comando:

gcloud config set project <PROJECT_ID>

Stai cercando PROJECT_ID? Controlla l'ID che hai 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, che potrebbero essere utili quando esegui i 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 una serie di zone diverse. Per saperne di più, consulta Regioni e zone.

3. Esegui il deployment di una semplice funzione Cloud Functions

Per avere qualcosa da monitorare, crea una funzione Cloud Functions "Hello, World". 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 tutti i valori predefiniti per il codice sorgente. Tuttavia, puoi scegliere una lingua/runtime diversa, se preferisci.

7aadf164450484e.png

Infine, fai clic su Crea.

dc74cd21000d6c91.png

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

5363a34eb001d5ed.png

4. Testare la funzione Cloud Functions e inviare traffico utilizzando un generatore di carico

Ora che la funzione Cloud è stata eseguita correttamente, testala dalla riga di comando.

Innanzitutto, utilizzando Cloud Shell, esegui questo comando:

$ gcloud functions describe hello-monitor

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

L'attivazione della funzione Cloud dovrebbe ora essere semplice come l'utilizzo del 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, digita questo comando in Cloud Shell :

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

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

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

5. Navigare tra i log

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

b24157fd3376e6a8.png

In questo modo dovresti accedere alla sezione Stackdriver Logging del tuo progetto, che mostra solo i log di Cloud Functions.

5a36fa75d2fb0165.png

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

Quando visualizzi i log, puoi eseguire le seguenti operazioni:

  • Filtra per livello di log (nel tuo caso, tutti i log sono di livello debug).
  • Seleziona un periodo di tempo specifico (relativo o assoluto).
  • Attiva lo streaming dei log (con Play 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.
  • Bloccare una voce di log (come spunto visivo).
  • Esporta i log in BigQuery, Cloud Storage o Pub/Sub oppure scaricali semplicemente come file JSON o CSV.

6. Aggiorna la funzione

Utilizzando Cloud Console, vai alla visualizzazione Dettagli funzione e osserva il picco creato con il tester di carico nel numero di chiamate al secondo e nel 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 alle tue 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
  
};

In questo modo, viene aggiunta un'emoji casuale al messaggio restituito dalla funzione Cloud Functions dopo una pausa di 300 millisecondi.

Infine, aggiungi una variabile di ambiente 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 po' di carico sulla funzione Cloud Functions appena implementata:

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

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

7. Traccia la funzione Cloud aggiornata

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

576373f38cad6f8.png

Dovresti visualizzare un messaggio simile a quello dello screenshot seguente:

44a36b758b49f88f.png

In questo modo dovrebbe essere abbastanza ovvio che la latenza introdotta nella tua funzione Cloud viene misurata a 300 millisecondi.

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

5815064fec87444b.png

Se vuoi aumentare lo zoom, fai clic e trascina il cursore sul grafico. Selezionare un intervallo di tempo personalizzato nel grafico della traccia

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

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

Vai a Panoramica nel menu a sinistra:

e920cfca2a50899e.png

In questa pagina di panoramica puoi trovare le tracce recenti e altri approfondimenti.

ef5a45647967d275.png

Puoi anche creare report personalizzati in base a una combinazione di un filtro delle richieste URI, un metodo HTTP, uno stato HTTP e un intervallo di tempo. Ti consente persino di confrontare i valori generati con un valore di riferimento temporale.

5bd34e9d13b47fb6.png

Se riesci a configurare gli intervalli di tempo corretti con un numero sufficiente di punti dati, puoi generare un report che mostri l'importante spostamento della latenza tra la funzione Cloud 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 per monitorare un indicatore del livello di servizio (SLI), ad esempio la latenza delle richieste degli utenti finali.

8. È il momento di eseguire la pulizia delle risorse

Il codelab termina qui.

Anche se Cloud Functions e gli strumenti Stackdriver sono piattaforme serverless che non comportano costi quando non sono in uso, comportati in modo responsabile e elimina la tua funzione Cloud. Basta selezionare hello-monitor in Panoramica nella sezione Cloud Functions e fare clic su Elimina.

aceb633cf70a4a27.png

9. Passaggi successivi

Ecco alcuni articoli da leggere:

/