Utilizzo di Google Stackdriver Debug, Trace, Logging e punti di log

Questo tutorial illustra un tour di Google Stackdriver che ti consente di eseguire le seguenti operazioni con le tue applicazioni Google Cloud Platform:

  • Crea uno istantanea 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 visualizza un'analisi dettagliata dei tempi di risposta e dei potenziali colli di bottiglia nel codice.
  • Aggiungi punti di log a un'applicazione in esecuzione, senza dover eseguire il deployment dell'app. Si tratta di una funzionalità davvero unica (e speriamo utile).

In questo tutorial, riprenderemo le seguenti operazioni da zero:

  1. Creare un progetto Google Cloud Platform (in particolare App Engine)
  2. Configura repository di codice sorgente 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 ottenere snapshot di debug dell'applicazione in esecuzione
  6. Analisi di tracce di registrazione e chiamata delle applicazioni
  7. Aggiungi punti di log all'applicazione in esecuzione. Questa funzionalità è stata inizialmente trattata in questo post del blog: Add Application Logs to an application with no restarts

Let's get started.

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

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

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

Quindi, accetta i termini di servizio e fai clic sul link "Start Cloud Shell".

X.png

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>

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.

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 dell'API, come mostrato di seguito.

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

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

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

Utilizzando Cloud Shell, stiamo per clonare questa directory nella nostra istanza di Google Cloud Shell. Per farlo, crea innanzitutto una directory nell'istanza di Google Cloud Shell, quindi procedi come indicato di seguito (esempio di output):

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

Ecco 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. Dedica un momento all'analisi più approfondita dei telecomandi Git configurati. Non si tratta necessariamente di un elemento, in modo da capire meglio cosa è successo dietro le quinte.

Vai alla directory predefinita creata e attiva il comando git remote -v come mostrato di seguito.

cd default
git remote -v

Ecco 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)

Come puoi notare, questo rimanda correttamente al repository Git associato al nostro progetto GCP.

Esegui il pull dell'applicazione Guestbook da GitHub

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

Estremo questo codice nella nostra istanza di Cloud Shell. Il comando e il relativo output sono visualizzati qui :

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

Ecco 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 vedere i vari file che sono stati estratti dal progetto GitHub.

Esegui il push del codice corrente utilizzando Cloud Shell al repository Git di progetto

Eseguiamo ora 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 non è un passaggio obbligatorio perché puoi eseguire l'integrazione direttamente con GitHub, la tua macchina locale e altri modi per collegare il codice sorgente.

A questo scopo, Tuttavia, eseguiremo il push di questo codice nel Repository Git del progetto GCP. Per questa operazione viene usato il comando push standard di Git, come mostrato di seguito:

git push origin master

Ecco 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 tua GCP Cloud Console e in particolare alla sezione Sviluppo. Fai clic su Codice sorgente e il repository predefinito dovrebbe essere in grado di visualizzare tutti i file di progetto. L'output di esempio è il seguente:

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

gcloud app deploy --version 1

Quando ti viene chiesto di scegliere un'area geografica, seleziona [1] us-east1.

Ecco 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]

Abbiamo fornito un parametro di versione al comando di deployment dell'app. È stato assegnato un valore di "1".

Poiché l'applicazione Guestbook utilizza Google Cloud Datastore per la persistenza, è necessario 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

Ecco 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 può richiedere un po' di tempo. Per controllare lo stato, cerca "Indici: datastore" e fai clic su Indici. Durante la creazione degli indici, visualizzerai uno stato con il valore "Indicizzazione" come mostrato di seguito:

Possiamo verificare se è stato eseguito il deployment della nostra app con versione 1 e sarà disponibile andando su Compute → App Engine e facendo clic su Versioni come mostrato di seguito:

Ora dovrebbe andare tutto bene. Puoi dare un'occhiata al tuo progetto nella pagina https://<PROJECT_ID>.appspot.com. Anche in questo caso, potrebbero essere necessari alcuni minuti perché gli indici del datastore siano pronti, quindi se l'applicazione restituisce un errore, ad esempio Errore interno del server, riprova dopo qualche minuto.

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

Bene. Ora è tutto pronto per iniziare a utilizzare le funzionalità di Stackdriver.

Innanzitutto, diamo un'occhiata a come possiamo acquisire istantanee della nostra applicazione in esecuzione. Gli snapshot sono utili se vuoi eseguire il debug di una determinata porzione di codice, esaminare le variabili e altro ancora. Tutto questo accade quando la tua applicazione è ancora in fase di pubblicazione. Ciò è molto utile se ricevi rapporti su un problema con la tua applicazione e vuoi provare a eseguire il debug per capire cosa sta succedendo alla tua app, esaminare una serie di variabili, acquisire l'istantanea in modo condizionale e altro ancora.

Eseguiamo questa operazione per l'applicazione guestbook. Richiediamo un'istantanea se qualcuno richiede la home page e, nello specifico, vogliamo che recupera l'elenco di annunci che si trova attualmente in Datastore.

Il codice è presente nel file guestbook.py. Nello specifico, ci interessa iniziare a esaminare il codice in fase di esecuzione dopo aver recuperato l'elenco dei saluti dal datastore. Questa operazione è eseguita alla riga 72. Possiamo mettere un punto di interruzione sulla linea 74 per farci sapere che il numero 72 sarebbe stato eseguito.

Per farlo, fai clic su "Debug", dalla visualizzazione della versione di AppEngine o vai a Stackdriver → Debug . Verrà visualizzata la schermata mostrata di seguito. Seleziona il file (guestbook.py) a sinistra, quindi fai clic sul numero di riga mostrato.

Nella casella rossa sopra riportata verrà visualizzato un messaggio che indica che è in attesa dell'attivazione di uno snapshot. Ora dobbiamo solo aprire la pagina

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

Dopo averlo fatto, l'istantanea verrà attivata e le sezioni Variabili e Stack di chiamate verranno completate, come mostrato di seguito. Guarda come vengono visualizzate le variabili ed espandile per controllare i valori. Questo è utilissimo.

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

Una funzionalità molto utile è acquisire un'istantanea in qualsiasi momento. Fai clic sull'icona della videocamera in qualsiasi momento e l'istantanea verrà nuovamente visualizzata come mostrato di seguito:

Puoi utilizzare il campo Espressioni come mostrato di seguito per monitorare variabili specifiche. Ad esempio, sappiamo di avere un annuncio variabile e siamo interessati a esaminarne il valore, nel momento in cui viene acquisito un'istantanea. Possiamo inserire la variabile dei saluti come mostrato nello screenshot di seguito. Quando l'istantanea viene raggiunta, i valori vengono mostrati.

Se vuoi che lo snapshot venga attivato solo in una determinata condizione, puoi utilizzare il campo Condizione come mostrato di seguito. Diciamo che l'istantanea deve avvenire solo se il numero di saluti è maggiore di 1. Prova con questo, se vuoi.

È molto importante assicurarsi che le prestazioni della propria applicazione web siano conformi ai requisiti impostati. Stackdriver Trace è uno strumento chiave che ti aiuta a comprendere la latenza delle tue applicazioni.

Questa funzionalità è abilitata per impostazione predefinita per tutte le applicazioni App Engine e offre dettagli molto utili sulle prestazioni per tutti i nostri endpoint, oltre a una separazione tra più chiamate.

Nel nostro caso, abbiamo raggiunto la home page ("/") e visualizzato / aggiunto le voci del guestbook. Questo è sufficiente per consentire a Trace di fornirci ulteriori informazioni sulla latenza. Vai alla panoramica di Stackdriver Traces e vediamo uno screenshot come mostrato di seguito. Osserva le tracce recenti e le relative latenze.

Se facciamo clic su una delle tracce, ovvero fai clic sul link URI, verrà mostrata la traccia dettagliata fornita di seguito:

Nota come l'azienda può suddividerci la latenza e quali chiamate richiedono più tempo. Dalla vista in alto puoi vedere che la query sul datastore sta richiedendo del tempo. Un'opzione da esaminare potrebbe essere la memorizzazione nella cache dei dati per ridurre il collo di bottiglia. Anche in questo caso, tutto dipende dalla tua applicazione e ciò dovrebbe essere molto utile per determinare quali aree della traccia di chiamata potrebbero richiedere del refactoring.

Puoi visualizzare i log dell'applicazione in qualsiasi momento andando a Stackdriver Logging (come mostrato di seguito). Sono disponibili più filtri a partire da vari servizi GCP → Tipi di log → Livello di log → Data e altro ancora.

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

logging.png

Infine, diamo un'occhiata a una funzionalità che dovrebbe suscitare entusiasmo nei confronti delle possibilità offerte. In genere, come sviluppatori, facciamo del nostro meglio per inserire istruzioni di log nel codice, eseguirne il deployment e quindi sperare che il log ci dia tutte le informazioni necessarie.

Sappiamo che ciò non è sufficiente e che solo nel debug ci rendiamo conto che forse dovremmo avere inserito qualche altra indicazione di log. Il flusso di lavoro consueto è quello di modificare il codice, inserire l'istruzione di log aggiuntiva, eseguire nuovamente il deployment e monitorare.

Non è un problema, ma se potessi aggiungere ora queste istruzioni di log (chiamate punti di log) alla tua applicazione in esecuzione, Ciò significa che non dobbiamo affrontare la procedura di arresto dell'applicazione, modifica del codice e nuovo deployment. Possiamo invece gestire il nostro elenco di punti di log dall'esterno della nostra applicazione utilizzando il supporto dei punti di log.

Sempre dall'interno di Cloud Shell, vediamo l'elenco attuale di punti di log che abbiamo configurato (che dovrebbe ovviamente essere 0). A tale scopo, utilizza il comando gcloud come mostrato di seguito:

gcloud debug logpoints list

Ecco l'output della console che dovresti vedere :

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

Ora aggiungeremo un punto di log all'applicazione in esecuzione. Per aggiungere un punto di log è necessario:

  • Identifica il file del codice sorgente e il numero della riga a cui vogliamo 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 logpoints create come mostrato di seguito:

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

Ecco 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 i filename:linenumber e il messaggio di log in alto. 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 punto di log è stato aggiunto. Di seguito è riportato uno screenshot di Cloud Shell:

Ora, se attivi il comando dell'elenco dei punti di log, verrà visualizzato il seguente output:

gcloud debug logpoints list

Ecco 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 come funziona, possiamo tornare ad andare 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 questo viene registrato per impostazione predefinita nei nostri log dell'applicazione. Quindi, tutto ciò che devi fare è visitare di nuovo Stackdriver Logging come mostrato di seguito:

Fai clic sulla richiesta e Voila! Nei dettagli, vedrai che il punto di log viene attivato e viene mostrato il messaggio di log.

Ci auguriamo che questo tutorial sia stato di tuo gradimento. Si concentra solo su alcune delle funzionalità che la piattaforma Stackdriver offre alla tabella. C'è molto altro da esplorare. Dai un'occhiata al blog di Romin Irani (l'autore originale di questo codelab) all'indirizzo https://rominirani.com/ per altri tutorial su Google Cloud Platform.

Puoi anche Dai un'occhiata a questo altro codelab chiamato "Monitoraggio e logging di Stackdriver per avere maggiore visibilità sull'integrità della tua applicazione."

Se hai commenti da condividere o vuoi segnalare problemi con questo codelab, utilizza il link "Trova un bug" in basso a sinistra in questa pagina.