Codelab su logging e tracciamento delle funzioni Cloud

L'obiettivo di questo codelab è capire come sfruttare gli strumenti di logging e monitoraggio offerti a tutti gli sviluppatori di funzioni Cloud. Questi strumenti sono dotati di tutte le funzioni Cloud Functions di cui esegui il deployment in tutti i linguaggi supportati e dovrebbero consentirti di essere più produttivi quando scrivi e utilizzi il tuo codice serverless.

Useremo una funzione attivata da HTTP, ma tutto ciò che tratteremo si applica anche ad altre lingue e a funzioni attivate da altri eventi (bucket di archiviazione, pub/sub ecc.).

Configurazione automatica dell'ambiente

Se non hai ancora un Account Google (Gmail o Google Apps), devi crearne uno. Accedi alla console di Google Cloud Platform (console.cloud.google.com) e crea un nuovo progetto.

Screenshot dal 10/02/2016 alle 00:45:26.png

Ricorda l'ID progetto, un nome univoco in tutti i progetti Google Cloud (il nome sopra riportato è già stato utilizzato e non funzionerà per te). Vi verrà fatto riferimento più avanti in questo codelab come PROJECT_ID.

Il prossimo passaggio consiste nell'attivare la fatturazione in Cloud Console per utilizzare le risorse di Google Cloud.

L'esecuzione di questo codelab non dovrebbe costare più di qualche euro, ma potrebbe essere di più se decidi di utilizzare più risorse o se le lasci in esecuzione (vedi la sezione "pulizia" alla fine di questo documento).

I nuovi utenti di Google Cloud Platform sono idonei per una prova senza costi di 300 $.

Google Cloud Shell

Sebbene Google Cloud Functions e le sue funzionalità di logging e monitoraggio possano essere utilizzate da remoto dal tuo laptop, in questo codelab utilizzeremo Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Questa macchina virtuale basata su Debian viene caricata con tutti gli strumenti di sviluppo di cui hai bisogno. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Ciò significa che ti servirà solo un browser (sì, funziona su Chromebook).

Per attivare Google Cloud Shell, nella Console per gli sviluppatori basta fare clic sul pulsante in alto a destra (il provisioning e la connessione all'ambiente devono essere pochi minuti):

attivaCloudShell.png

Fai clic sul pulsante "Avvia Cloud Shell":

Screen Shot 2017-06-14 alle 22:13.43 PM

Dopo aver effettuato la connessione a Cloud Shell, dovresti vedere che sei già autenticato 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>

Per impostazione predefinita, Cloud Shell imposta anche alcune variabili di ambiente, che possono essere utili durante l'esecuzione di comandi futuri.

echo $GOOGLE_CLOUD_PROJECT

Output comando

<PROJECT_ID>

Se per qualche motivo il progetto non è configurato, esegui semplicemente il seguente comando :

gcloud config set project <PROJECT_ID>

Stai cercando il tuo dispositivo PROJECT_ID? Controlla quale ID hai utilizzato nei passaggi di configurazione o cercalo nella dashboard della console:

ID progetto

IMPORTANTE: infine, imposta la zona e la configurazione del progetto predefinite:

gcloud config set compute/zone us-central1-f

Puoi scegliere una varietà di zone. Scopri di più nella documentazione relativa ad aree geografiche e zone.

Per poter monitorare qualcosa, creiamo una funzione cloud di Hello World. Nel menu a sinistra della console, fai clic su Cloud Functions, quindi su"Create function":

Assegna un nome alla nuova funzione "hello-monitor" :

... e mantenere tutte le impostazioni predefinite per il codice sorgente (puoi comunque scegliere una lingua/un'ora di esecuzione diverse se vuoi) :

Infine, crea la funzione utilizzando il pulsante "Create";

Dopo poco tempo dovresti vedere la funzione indicata come pronta per essere richiamata (come indicato dal segno di spunta verde) :

Ora che hai eseguito correttamente il deployment della funzione Cloud, la testeremo dalla riga di comando.

Innanzitutto, utilizzando Cloud Shell, emetti il seguente comando :

$ gcloud functions describe hello-monitor

Questo dovrebbe restituire una descrizione della funzione, incluso un URL per httpsTrigger, che è l'endpoint HTTP(S) per richiamare la funzione. Deve avere il seguente formato : https://<region>-<project-id>.cloudfunctions.net/hello-monitor

Attivare la funzione dovrebbe essere semplice, come curl'in questo URL :

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

Ora utilizzeremo Vegeta, un semplice strumento di test per il caricamento del codice HTTP. Per installarlo, da Cloud Shell è sufficiente digitare questo comando :

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

Per inviare traffico alla tua funzione Cloud Functions (5 richieste al secondo per un paio di minuti), utilizza questo comando :

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

Dalla visualizzazione dei dettagli della funzione, fai clic sul menu di destra "Visualizza log":

Dovrebbe aprirsi la sezione Stackdriver Logging del tuo progetto, che mostra solo i tuoi log delle funzioni cloud :

Speriamo che tutte le richieste alla tua funzione restituiscano un codice di stato 200.

Con questo visualizzatore log puoi :

  • Filtra per livello di log (nel nostro caso tutti i log sono a livello di Debug)
  • seleziona un periodo di tempo specifico (relativo o assoluto)
  • Attiva flusso dei log (pulsante "Riproduci" nella parte superiore dello schermo)
  • Copiare 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)
  • esportare i log in BigQuery, Cloud Storage o Cloud Pub/Sub (o semplicemente scaricarli in formato JSON o CSV)

Tieni presente inoltre che il selettore in alto a sinistra puoi filtrare i log per funzione. Puoi anche cercare le etichette o un testo completo nella barra di ricerca nella parte superiore della finestra. Nel nostro caso le etichette sono hello-monitor (il nome della funzione) e un identificatore di esecuzione per ogni richiesta.

I filtri possono anche essere copiati per essere condivisi (dai un'occhiata al menu a discesa nella casella di ricerca) :

Utilizzando la console, vai a "Dettagli funzione": visualizza e osserva il picco che abbiamo creato con il nostro tester del carico, sia in termini di numero di chiamate al secondo che di esecuzione:

Un altro strumento più dettagliato per osservare la latenza e le chiamate RPC è la funzionalità Stackdriver Trace, ma prima di poter utilizzare questa funzionalità dobbiamo apportare alcune modifiche alle nostre funzioni, ovvero:

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

Dalla pagina "Dettagli funzione", fai clic su Modifica per modificare la funzione.

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 modificando 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
  
};

L'emoji verrà aggiunta al messaggio restituito dalla funzione dopo che viene messa in pausa per 300 millisecondi.

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

Non dimenticare di fare clic su Salva.

Ora torna a Cloud Shell e richiama il comando per generare carico sulla nuova funzione di cui hai eseguito il deployment :

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

Siamo pronti a osservare l'elenco delle tracce prodotte senza altri requisiti di configurazione e senza alcuna libreria di traccia specifica nel tuo codice.

Dal menu a sinistra, vai a Elenco di tracce (sotto Stackdriver Trace) :

Dovresti vedere una schermata simile alla seguente :

Dovrebbe essere abbastanza ovvio che la latenza introdotta nella nostra funzione viene effettivamente misurata a 300 ms.

Ogni punto su questo grafico è una richiesta per la quale è possibile visualizzare informazioni dettagliate, ad esempio timestamp, metodo e stato HTTP, etichette, un link per tornare alla voce di log corrispondente ed eventuali chiamate RPC successive effettuate dalla funzione :

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

Per diminuire lo zoom, fai clic sul pulsante "Annulla zoom" nella parte superiore della pagina.

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

Vai alla sezione Tracce "Panoramica"; nel menu a sinistra :

In questa pagina di panoramica puoi trovare tracce recenti e altre informazioni importanti.

... nonché la possibilità di creare report personalizzati basati su una combinazione di un filtro di richiesta URI, un metodo HTTP, uno stato HTTP e un intervallo di tempo. Ti consente anche di confrontare i valori generati con un valore basale :

Se riesci a configurare gli intervalli di tempo corretti e con un numero sufficiente di punti dati, puoi generare un rapporto che mostra l'importante variazione della latenza tra la funzione iniziale e la nuova :

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

Questo conclude il nostro codelab, che ha trattato il deployment di una nuova funzione Cloud, la navigazione nei suoi log e l'osservazione delle sue richieste di richiesta.

Anche se Cloud Functions e gli strumenti Stackdriver sono piattaforme serverless che non comportano costi quando non sono in uso, per essere un buon cittadino del cloud eliminiamo la nostra funzione.

È sufficiente selezionare la funzione hello-monitor nella pagina della panoramica di Cloud Functions e fare clic su "delete".

Con questo si conclude questo semplice codelab su come iniziare con il logging e le tracce di Cloud Functions.

Ecco alcune informazioni di seguito :

/