Utilizzo di Google Stackdriver Debug, Trace, Logging e Logpoints

Questo tutorial ti accompagna in un tour di Google Stackdriver, che ti consente di eseguire le seguenti operazioni con le tue applicazioni Google Cloud:

  • Acquisisci uno snapshot di debug nelle tue applicazioni in esecuzione su App Engine, Compute Engine e Container Engine.
  • Visualizza i log delle applicazioni.
  • Configura le metriche, monitorale e ricevi avvisi.
  • Traccia le chiamate API e ottieni una suddivisione dei tempi di risposta e dei potenziali colli di bottiglia nel codice.
  • Aggiungi punti di log a un'applicazione in esecuzione, senza doverla implementare. Si tratta di una funzionalità davvero unica (e, si spera, utile).

In questo tutorial, eseguiremo le seguenti operazioni da zero:

  1. Crea un progetto Google Cloud (in particolare App Engine)
  2. Configura il repository di origine del progetto Google Cloud Platform
  3. Utilizza l'origine dell'applicazione Python Guestbook standard disponibile da GitHub
  4. Esegui il deployment del codice
  5. Scopri come possiamo ottenere snapshot di debug dell'applicazione in esecuzione
  6. Esamina i log e le tracce delle chiamate dell'applicazione
  7. Aggiungi punti di interruzione all'applicazione in esecuzione corrente. Questa funzionalità è stata inizialmente trattata in questo post del blog : Add Application Logs to an application with no restarts

Iniziamo.

Questi contenuti sono stati creati inizialmente da Romin Irani e pubblicati qui.

Configurazione dell'ambiente autonoma

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

Screenshot from 2016-02-10 12:45:26.png

Ricorda l'ID progetto, un nome univoco per tutti i progetti Google Cloud (il nome riportato sopra è già stato utilizzato e non funzionerà per te, mi dispiace). In questo codelab verrà chiamato PROJECT_ID.

Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare le risorse Google Cloud.

L'esecuzione di questo codelab non dovrebbe costarti più di qualche dollaro, ma potrebbe essere più cara 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 possono beneficiare di una prova senza costi di 300$.

Google Cloud Shell

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

Per attivare Google Cloud Shell, fai clic sul pulsante in alto a destra della console per gli sviluppatori (il provisioning e la connessione all'ambiente richiedono solo pochi istanti):

activateCloudShell.png

Quindi, accetta i termini di servizio e fai clic sul link "Avvia Cloud Shell":

x.png

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:

Project_ID.png

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

gcloud config set compute/zone us-central1-f

Puoi scegliere tra una serie di zone diverse. Puoi trovare ulteriori informazioni nella documentazione relativa alle regioni e alle zone.

Controlla le API Stackdriver abilitate

Diamo un'occhiata alle API che sono state abilitate per il tuo progetto. Utilizza la barra di ricerca per trovare la dashboard API, come mostrato di seguito.

Osserva le API specifiche che sono state abilitate per il tuo progetto :

Ogni progetto Google Cloud Platform offre l'hosting Git privato, ma prima dobbiamo creare un repository predefinito con cui lavorare. Vai a Source Repositories utilizzando la casella di ricerca della console :

Fai clic su "CREA REPOSITORY" per creare un nuovo repository di codice denominato "default" :

Utilizzando Cloud Shell, cloneremo questa directory nella nostra istanza di Google Cloud Shell. Per farlo, creiamo prima una directory nella nostra istanza di Google Cloud Shell e andiamo alla directory come mostrato di seguito (output di esempio):

mkdir stackdriver-demo
cd stackdriver-demo/

Ora possiamo clonare il repository predefinito qui tramite il comando gcloud come mostrato di seguito:

gcloud source repos clone default

Questo è l'output della console che dovresti vedere :

Cloning into '/home/gcp123_student/default'...
warning: You appear to have cloned an empty repository.
Project [qwiklabs-gcp-1234abc1234] repository [default] was cloned to [/home/gcp123_student/default].

Bene. Dedichiamo un attimo ad approfondire i git remote che sono stati configurati. Non è necessario, ma è utile per capire meglio cosa è successo dietro le quinte.

Vai alla directory predefinita creata ed esegui il comando git remote -v come mostrato di seguito

cd default
git remote -v

Questo è l'output della console. Dovresti vedere qualcosa di simile a questo:

origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (fetch)
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (push)

Puoi vedere che punta correttamente al repository Git associato al nostro progetto Google Cloud.

Estrai l'applicazione Guestbook da GitHub

L'applicazione che utilizzeremo è un'applicazione App Engine standard denominata Guestbook ed è disponibile nel repository GitHub ufficiale di Google Cloud Platform. Questa applicazione fa parte anche della documentazione ufficiale per iniziare. Il progetto GitHub è disponibile all'indirizzo : https://github.com/GoogleCloudPlatform/appengine-guestbook-python

Ora estrarremo questo codice nella nostra istanza di Cloud Shell. Il comando e il relativo output sono mostrati qui :

git pull https://github.com/GoogleCloudPlatform/appengine-guestbook-python

Questo è l'output della console che dovresti vedere :

remote: Counting objects: 485, done.
remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485
Receiving objects: 100% (485/485), 436.42 KiB | 163.00 KiB/s, done.
Resolving deltas: 100% (195/195), done.
From https://github.com/GoogleCloudPlatform/appengine-guestbook-python
* branch HEAD -> FETCH_HEAD

Ora tutto il codice è presente localmente nella nostra istanza di Google Cloud Shell. Puoi visualizzare i vari file estratti dal progetto GitHub.

Esegui il push del codice attuale utilizzando Cloud Shell nel repository Git del progetto

Ora eseguiamo il push di questo codice nel repository Git del progetto GCP, in modo da poter impostare punti di interruzione, punti di log e altro ancora per il nostro codice. Tieni presente che questo passaggio non è obbligatorio, in quanto puoi eseguire l'integrazione direttamente con GitHub, la tua macchina locale e altri modi per collegare il codice sorgente.

Ma ai nostri fini, eseguiremo il push di questo codice nel repository Git del progetto Google Cloud. Questa operazione viene eseguita tramite il comando git push standard, come mostrato di seguito:

git push origin master

Questo è l'output della console che dovresti vedere :

Counting objects: 485, done.
Compressing objects: 100% (280/280), done.
Writing objects: 100% (485/485), 436.42 KiB | 0 bytes/s, done.
Total 485 (delta 195), reused 485 (delta 195)
remote: Storing objects: 100% (485/485), done.
remote: Processing commits: 100% (152/152), done.
To https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default
* [new branch] master -> master

Ora torna alla console Google Cloud e in particolare alla sezione Sviluppo. Fai clic su Codice sorgente e, per il repository predefinito, dovresti essere in grado di visualizzare tutti i file di progetto. L'output di esempio è mostrato di seguito:

Ora siamo pronti per eseguire il deployment della nostra applicazione App Engine Guestbook. Per eseguire il deployment dell'app, assicurati di essere in Google Cloud Shell e nella directory predefinita, come abbiamo fatto finora. Utilizza il comando gcloud app deploy come mostrato di seguito:

gcloud app deploy --version 1

Quando ti viene chiesto di scegliere una regione, seleziona [1] us-east1.

Questo è l'output della console che dovresti vedere :

You are about to deploy the following services:
— qwiklabs-gcp-1234abc1234/default/1 (from [/home/gcp123-student/default/app.yaml])
Deployed URL: [https://qwiklabs-gcp-1234abc1234.appspot.com]
Do you want to continue (Y/n)? Y
Beginning deployment of service [default]...
File upload done.
Updating service [default]...done.
Deployed service [default] to https://qwiklabs-gcp-1234abc1234.appspot.com]

Tieni presente che abbiamo fornito un parametro di versione al comando di deployment dell'app. Abbiamo assegnato un valore di "1".

Poiché l'applicazione Guestbook utilizza Google Cloud Datastore per la persistenza, dobbiamo aggiornare gli indici Datastore. Gli indici sono specificati nel file index.yaml e utilizziamo semplicemente il comando gcloud datastore create-indexes come mostrato di seguito:

gcloud datastore create-indexes index.yaml

Questo è l'output della console che dovresti vedere :

You are about to update the following configurations:
— qwiklabs-gcp-1234abc1234/index From: [/home/gcp123_student/default/index.yaml]
Do you want to continue (Y/n)? Y

L'aggiornamento degli indici Datastore potrebbe richiedere un po' di tempo. Per controllare lo stato, cerca "Indici Datastore" e fai clic su Indici. Durante la creazione degli indici, vedrai lo stato "Indicizzazione", come mostrato di seguito:

Possiamo verificare se la nostra app con la versione 1 è implementata e disponibile andando su Compute → App Engine e poi facendo clic su Versioni, come mostrato di seguito:

Ora tutto dovrebbe essere a posto e puoi dare un'occhiata al tuo progetto andando su https://<PROJECT_ID>.appspot.com. Anche in questo caso, potrebbero essere necessari alcuni minuti prima che gli indici del datastore siano pronti, quindi se l'applicazione restituisce un errore (ad esempio: errore interno del server), riprova qualche minuto dopo.

Ora utilizziamo l'applicazione accedendo e creando alcune voci del guestbook come mostrato di seguito:

Bene. Ora possiamo esaminare le funzionalità di Stackdriver.

Vediamo innanzitutto come possiamo acquisire snapshot della nostra applicazione in esecuzione. Gli snapshot sono utili se vuoi eseguire il debug di una parte specifica del codice, esaminare le variabili e altro ancora. Tutto ciò avviene mentre la tua applicazione è ancora in fase di pubblicazione. Questo è molto utile se ricevi segnalazioni di un problema con la tua applicazione e vuoi provare a eseguire il debug e vedere cosa sta succedendo con la tua app, esaminare una serie di variabili, acquisire lo snapshot in modo condizionale e altro ancora.

Facciamolo ora per l'applicazione Guestbook. Chiederemo uno snapshot se qualcuno richiede la home page e in particolare vogliamo che recuperi l'elenco dei saluti attualmente presenti nel Datastore.

Il codice è presente nel file guestbook.py. Nello specifico, ci interessa iniziare a esaminare il codice in fase di runtime una volta recuperato l'elenco dei saluti dal datastore. Questa operazione viene eseguita alla riga 72. Quindi possiamo inserire un punto di interruzione alla riga 74, in modo da sapere che la riga 72 è stata eseguita.

Per farlo, fai clic su "Debug" nella visualizzazione della versione di App Engine o vai a Stackdriver → Debug . Verrà visualizzata la schermata mostrata di seguito. Devi selezionare il file (guestbook.py) a sinistra, quindi fare clic sul numero di riga come mostrato.

Verrà visualizzato un messaggio evidenziato nella casella rossa sopra, che indica che è in attesa dell'attivazione di uno snapshot. Ora, non ci resta che visitare la nostra pagina all'indirizzo

https://<PROJECT_ID>.appspot.com.

A questo punto, lo snapshot verrà attivato e le sezioni Variabili e Stack di chiamate verranno compilate come mostrato di seguito. Guarda come vengono visualizzate le variabili e puoi espanderle per controllare i valori. È utilissimo.

Ad esempio, se espandi la variabile Saluti, vedrai che contiene i record corrispondenti al numero di voci del guestbook che hai creato.

Una funzionalità molto utile è la possibilità di scattare nuovamente uno snapshot in qualsiasi momento. Basta fare clic sull'icona della videocamera in qualsiasi momento e la videocamera attenderà di nuovo lo scatto, come mostrato di seguito:

Puoi utilizzare il campo Espressioni come mostrato di seguito per monitorare variabili specifiche. Ad esempio, sappiamo di avere una variabile greetings e ci interessa ispezionare il suo valore nel momento in cui viene acquisito uno snapshot. Possiamo inserire la variabile dei saluti come mostrato nello screenshot di seguito. Quando viene raggiunto lo snapshot, questo viene compilato con i valori mostrati.

Se vuoi che lo snapshot si attivi solo in determinate condizioni, puoi utilizzare il campo Condizione come mostrato di seguito. In questo caso, lo snapshot deve essere creato solo se il numero di saluti è maggiore di 1. Se vuoi, puoi sperimentare con questa opzione.

È molto importante assicurarsi che le prestazioni della tua applicazione web soddisfino i requisiti che hai impostato. Stackdriver Trace è uno strumento fondamentale che ti aiuta a comprendere la latenza nelle tue applicazioni.

È attivato per impostazione predefinita per tutte le applicazioni App Engine e ci fornisce dettagli molto utili sulle prestazioni di tutti i nostri endpoint, nonché una suddivisione delle varie chiamate.

Nel nostro caso, abbiamo visitato la home page ("/") e visualizzato / aggiunto le voci del guestbook. Queste informazioni sono sufficienti per consentire a Trace di fornirci maggiori dettagli sulla latenza. Basta andare alla panoramica di Stackdriver Trace e vedrai uno screenshot come mostrato di seguito. Nota le tracce recenti e le relative latenze.

Se facciamo clic su una delle tracce, ovvero sul link URI, verrà visualizzata la traccia dettagliata come mostrato di seguito:

Nota come sia in grado di fornirci una suddivisione della latenza e quali chiamate richiedono più tempo. Dalla visualizzazione precedente puoi notare che la query del datastore richiede tempo. Forse una delle opzioni da esaminare potrebbe essere la memorizzazione nella cache dei dati per ridurre questo collo di bottiglia. Anche in questo caso, tutto dipende dalla tua applicazione e questo dovrebbe essere molto utile per determinare quali aree della traccia della chiamata potrebbero richiedere un refactoring.

Puoi visualizzare i log delle applicazioni in qualsiasi momento accedendo a Stackdriver Logging (come mostrato di seguito). Sono disponibili più filtri a partire da vari servizi Google Cloud → Tipi di log → Livello di log → Data e altro ancora.

Lo screenshot seguente mostra i log per la nostra applicazione App Engine e la versione 1 predefinita.

logging.png

Infine, diamo un'occhiata a una funzionalità che dovrebbe entusiasmarti per le possibilità che offre. In genere, come sviluppatori facciamo del nostro meglio per inserire istruzioni di log nel nostro codice, implementarlo e poi sperare che il log ci dica tutto ciò che vogliamo sapere.

Ma sappiamo che non è sufficiente e solo durante il debug ci rendiamo conto che forse avremmo dovuto inserire qualche istruzione di log in più qua e là. Il flusso di lavoro abituale consiste quindi nel modificare il codice, inserire l'istruzione di log aggiuntiva, eseguire nuovamente il deployment e monitorare.

Va bene, ma cosa succederebbe se potessi aggiungere queste istruzioni di log (che ora chiameremo punti di interruzione) all'applicazione in esecuzione? Ciò significa che non dobbiamo interrompere l'applicazione, modificare il codice ed eseguire nuovamente il deployment. Invece, possiamo gestire l'elenco dei logpoint dall'esterno dell'applicazione utilizzando l'assistenza per i logpoint.

Sempre da Cloud Shell, controlliamo l'elenco attuale dei punti di log che abbiamo configurato (che ovviamente dovrebbe essere 0). Questa operazione viene eseguita tramite il comando gcloud, come mostrato di seguito:

gcloud debug logpoints list

Questo è l'output della console che dovresti vedere :

Debug target not specified. Using default target: default-1
Listed 0 items.

Ora aggiungeremo un logpoint all'applicazione in esecuzione. Per aggiungere un punto di interruzione, dobbiamo fare quanto segue:

  • Identifica il file del codice sorgente e il numero di riga in cui vuoi aggiungere il punto di log.
  • Identifica il messaggio di log. Questo messaggio di log può essere hardcoded o anche un'espressione.

Nel nostro caso, aggiungeremo un punto di log al file guestbook.py alla riga 74 tramite il comando di creazione dei punti di log, come mostrato di seguito:

gcloud debug logpoints create guestbook.py:74 "Fetched greetings from Datastore. Count of greetings : {len(greetings)}"

Questo è l'output della console che dovresti vedere :

Debug target not specified. Using default target: default-1
— id: 53538243519d4-f9a0-bdbce
location: guestbook.py:74
logLevel: INFO
logMessageFormat: Fetched greetings from Datastore. Count of greetings : {len(greetings)}
condition: None
status: ACTIVE

Abbiamo fornito filename:linenumber e il messaggio di log riportato sopra. Tieni presente che il nostro messaggio di log contiene anche un'espressione che stampa il numero di saluti recuperati dal datastore.

Il comando restituisce il messaggio che indica che il logpoint è stato aggiunto. Di seguito è riportato uno screenshot di Cloud Shell:

Ora, se esegui il comando per l'elenco dei punti di log, vedrai il seguente output:

gcloud debug logpoints list

Questo è l'output della console che dovresti vedere :

Debug target not specified. Using default target: default-1
STATUS LOCATION CONDITION LOG_LEVEL LOG_MESSAGE_FORMAT ID
ACTIVE
guestbook.py:74 INFO Fetched greetings from Datastore. Count of greetings : {len(greetings)} 53538243519d4-f9a0-bdbce

Per vedere questo in azione, possiamo tornare alla home page all'indirizzo https://<PROJECT_ID>.appspot.com. In questo modo verrà richiamato il codice e, a sua volta, il nostro punto di log. Ricorda che questa operazione verrà registrata per impostazione predefinita nei nostri log delle applicazioni. Quindi, tutto ciò che dobbiamo fare è visitare Stackdriver Logging un'altra volta, come mostrato di seguito:

Fai clic sulla richiesta specifica e il gioco è fatto. Nei dettagli, vedrai l'attivazione del nostro logpoint e il messaggio di log.

Ci auguriamo che questo tutorial ti sia piaciuto. Vengono trattate solo alcune delle funzionalità offerte dalla piattaforma Stackdriver. C'è ancora molto da esplorare. Consulta il blog di Romin Irani (l'autore originale di questo codelab) all'indirizzo https://rominirani.com/ per altri tutorial su Google Cloud Platform.

Puoi anche consultare questo altro codelab intitolato "Utilizzo del monitoraggio e della registrazione di Stackdriver per ottenere una migliore visibilità sull'integrità della tua applicazione".

Se hai feedback o vuoi segnalare problemi relativi a questo codelab, utilizza il link "Trova un bug" in basso a sinistra in questa pagina.