Migrazione a Cloud Logging

Con solo poche righe di codice, puoi aggiornare l'app in modo che utilizzi Cloud Logging e ottenere quasi le stesse funzionalità di filtro e correlazione dei log disponibili con il servizio di logging di App Engine.

Per eseguire la migrazione a Cloud Logging, collega il gestore di log AppEngineHandler al modulo di logging di Python, quindi continua a utilizzare il modulo di logging di Python per scrivere le voci di log. Puoi eseguire questi aggiornamenti nell'app Python 2 e visualizzare lo stesso comportamento di logging quando l'app viene eseguita nei runtime Python 2 o Python 3.

Principali differenze tra il logging di App Engine e Cloud Logging

  • Il logging di App Engine richiede l'utilizzo del modulo di logging di Python per scrivere le voci di log dell'app. Cloud Logging supporta tutti i seguenti approcci:

    • (Consigliato) Utilizza il modulo di logging Python con AppEngineHandler come gestore di logging. Questo approccio idiomatico richiede solo poche righe di codice aggiuntive per registrare il gestore di Cloud Logging, pertanto la tua app sarà più portabile ad altri ambienti Python.

    • Scrivi le voci in stdout o stderr. Queste voci vengono visualizzate in Esplora log, ma per abilitare i filtri e la correlazione con i log delle richieste devi formattare le voci come un oggetto JSON e fornire metadati specifici. Per ulteriori informazioni su questo approccio, consulta Logging strutturato.

    • Utilizza la libreria client di Cloud Logging direttamente. Se utilizzi AppEngineHandler, questo approccio ottiene gli stessi risultati dell'utilizzo del modulo di logging Python, ma il passaggio da questa libreria a un framework di logging diverso potrebbe richiedere aggiornamenti significativi del codice.

  • Con il logging di App Engine, Esplora log assegna un livello di gravità ai log della richiesta e il livello di gravità riflette la massima gravità di qualsiasi voce di log dell'app correlata alla richiesta. Ad esempio, se in una richiesta viene eseguita l'emissione di una voce di log di avviso nell'applicazione, in Esplora log viene visualizzata un'icona di avviso accanto alla voce di log della richiesta. Quando espandi la voce di richiesta, viene visualizzata la voce di log di avviso nidificata all'interno della voce di richiesta.

    Con Cloud Logging, il visualizzatore log non assegna un livello di gravità ai log di richiesta. Quando espandi una voce di richiesta, vedrai le voci dell'app nidificate all'interno della voce di richiesta, e queste voci mostreranno un'icona di gravità. Tuttavia, la voce di richiesta stessa non mostra un'icona di gravità e non può essere filtrata in base al livello di gravità.

  • Le quote e la conservazione dei dati sono uguali sia per App Engine che per Cloud Logging, ma se superi la quota gratuita di dati dei log, i prezzi di Cloud Logging potrebbero essere diversi dai prezzi dei log di App Engine.

Prima di iniziare la migrazione

  1. Attiva l'API Cloud Logging nel progetto che contiene l'app.

    Abilitare l'API

  2. Assicurati che la tua app sia autorizzata a scrivere log.

    Per impostazione predefinita, l'account di servizio predefinito dell'app è autorizzato a scrivere log.

    Se l'app utilizza un account di servizio o un account utente diverso o se hai modificato le autorizzazioni per l'account di servizio predefinito, assicurati che l'account che utilizzi abbia l'autorizzazione per scrivere i log.

Panoramica del processo di migrazione

Per eseguire la migrazione dell'app Python in modo da utilizzare Cloud Logging anziché il logging di App Engine:

  1. Installa la libreria client di Cloud per Cloud Logging.

  2. Collega AppEngineHandler al modulo di logging di Python.

  3. Esegui il deployment della tua app in App Engine e conferma che il logging funziona come previsto.

Installazione della libreria client di Cloud per Cloud Logging

Per rendere disponibile AppEngineHandler per la tua app quando viene eseguita in App Engine:

  1. Crea un file requirements.txt nella stessa cartella del file app.yaml e aggiungi le seguenti righe:

     google-cloud-logging==1.14.0
    

    Consigliamo di utilizzare la versione 1.14.0 della libreria client di Cloud Logging, poiché supporta le app Python 2.7.

  2. Nel file app.yaml dell'app, specifica le librerie RPC e setuptools richieste di Google e la libreria SSL facoltativa nella sezione libraries:

    libraries:
    - name: grpcio
      version: 1.0.0
    - name: setuptools
      version: 36.6.0
    - name: ssl
      version: latest
    

    Alcune librerie client non hanno bisogno della libreria SSL. Se non includi la libreria SSL per una libreria client che la richiede, visualizzerai un errore SSL in Esplora log quando l'app riceve una richiesta.

  3. Crea una directory per archiviare le librerie di terze parti, ad esempio lib/. quindi utilizza pip install per installare le librerie nella directory. Ad esempio:

      pip install -t lib -r requirements.txt
      

  4. Crea un file appengine_config.py nella stessa cartella in cui si trova il file app.yaml. Aggiungi quanto segue al tuo file appengine_config.py:

    # appengine_config.py
    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set path to your libraries folder.
    path = 'lib'
    # Add libraries installed in the path folder.
    vendor.add(path)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(path)
    

    Per il file appengine_config.py nell'esempio precedente si presuppone che la cartella lib si trovi nella directory di lavoro attuale. Se non puoi garantire che lib sia sempre nella directory di lavoro attuale, specifica il percorso completo della cartella lib. Ad esempio:

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
    

Per lo sviluppo locale, ti consigliamo di installare le dipendenze in un ambiente virtuale, ad esempio virtualenv per Python 2.

Collegamento di AppEngineHandler al modulo di logging Python

In ogni file che scrive le voci di log:

  1. Importa la libreria client di Cloud Logging.
  2. Creare un'istanza del client Cloud Logging.
  3. Recupera il gestore di Cloud Logging appropriato per l'ambiente attuale. Quando la tua app viene eseguita in App Engine, il client Cloud Logging recupera AppEngineHandler.

    AppEngineHandler formatterà le voci come un oggetto JSON e fornirà i metadati necessari per supportare il filtro in base alla gravità e correlando le voci dell'app alle voci del log delle richieste.

  4. Esegui il metodo setup_logging() del client Cloud Logging, che collega il relativo listener predefinito come gestore di logging per il logger radice Python.

Ad esempio:

# Imports the Cloud Logging client library
import google.cloud.logging

# Instantiates a client
client = google.cloud.logging.Client()

# Retrieves a Cloud Logging handler based on the environment
# you're running in and integrates the handler with the
# Python logging module. By default this captures all logs
# at INFO level and higher
client.setup_logging()

Una volta collegato il gestore, tutti i log che, per impostazione predefinita, hanno un livello INFO o superiore emesso nell'applicazione verranno inviati a Logging:

# Imports Python standard library logging
import logging

# The data to log
text = "Hello, world!"

# Emits the data using the standard logging module
logging.warning(text)

Deployment dell'app

Quando è tutto pronto per il deployment dell'app, devi:

  1. Testa l'app su App Engine.

    L'unico modo per testare gli aggiornamenti e confermare che i livelli di gravità sono assegnati e che le voci dell'app sono correlate con le richieste è eseguire il deployment dell'app nel runtime Python 3.

    Se esegui il deployment degli aggiornamenti nel runtime Python 2, il servizio di logging di App Engine ascolterà le voci dal logger root di Python e le formatterà in modo appropriato per Esplora log.

    Se esegui la tua app localmente, Cloud Logging non utilizza AppEngineHandler e App Engine non può scrivere voci di richiesta.

  2. Visualizza Esplora log e verifica che i livelli di gravità siano assegnati alle voci della tua app. Espandi una voce di richiesta e verifica che le voci scritte dalla tua app durante l'elaborazione della richiesta siano visualizzate sotto la voce stessa.

  3. Se l'app viene eseguita senza errori, utilizza la suddivisione del traffico per aumentare il traffico in modo lento per la tua app aggiornata. Monitora attentamente l'app per rilevare eventuali problemi prima di indirizzare più traffico all'app aggiornata.