Migra a Cloud Logging

Con solo unas pocas líneas de código, puedes actualizar tu app para usar Cloud Logging y lograr casi las mismas funciones de filtrado y correlación de registros que estaban disponibles con el servicio de registro de App Engine.

A fin de migrar a Cloud Logging, conecta el controlador de registro AppEngineHandler al módulo de registro de Python y, luego, sigue usando el módulo de registro de Python para escribir entradas de registro. Puedes realizar estas actualizaciones en la app de Python 2 y ver el mismo comportamiento de registro cuando la app se ejecuta en los entornos de ejecución de Python 2 o Python 3.

Diferencias clave entre el registro de App Engine y Cloud Logging

  • El registro de App Engine requiere que uses el módulo de registro de Python para escribir entradas de registro de la app. Cloud Logging admite los siguientes enfoques:

    • (Recomendado) Usa el módulo de registro de Python con AppEngineHandler como el controlador de registro. Este enfoque idiomático solo requiere algunas líneas de código adicionales para registrar el controlador de Cloud Logging y, por lo tanto, hace que la app sea más portátil en otros entornos de Python.

    • Escribe entradas en stdout o stderr. Estas entradas aparecen en el explorador de registros, pero, para habilitar el filtrado y la correlación con los registros de solicitudes, debes formatear las entradas como un objeto JSON y proporcionar metadatos específicos. Para obtener más información sobre este enfoque, consulta Registro estructurado.

    • Usa la biblioteca cliente de Cloud Logging directamente. Si usas AppEngineHandler, con este enfoque se logra el mismo resultado que con el módulo de registro de Python, pero cambiar de esta biblioteca a un framework de registro diferente podría requerir actualizaciones significativas en tu código.

  • Con el registro de App Engine, el explorador de registros asigna un nivel de gravedad a los registros de solicitudes y el nivel refleja la gravedad más alta de cualquier entrada de registro de la app que esté correlacionada con la solicitud. Por ejemplo, si una solicitud provoca que la app emita una entrada de registro de advertencia, el explorador de registros mostrará un ícono de advertencia junto a la entrada de registro de la solicitud. Cuando expandes la entrada de la solicitud, verás la entrada de registro de advertencia anidada en la entrada de la solicitud.

    Con Cloud Logging, el visor de registros no asigna un nivel de gravedad a los registros de solicitudes. Cuando expandas una entrada de solicitud, verás las entradas de la app anidadas dentro de la entrada de la solicitud y esas entradas de la app mostrarán un ícono de gravedad. Sin embargo, la entrada de la solicitud no muestra un ícono de gravedad y no puede filtrarse por nivel de gravedad.

  • Las cuotas y la retención de datos son las mismas para App Engine y Cloud Logging. Sin embargo, si superas la cuota gratuita de datos de registro, los precios de Cloud Logging pueden ser diferentes de los precios de los registros de App Engine.

Antes de comenzar la migración

  1. Habilita la API de Cloud Logging en el proyecto que contiene la app.

    Habilitar la API

  2. Asegúrate de que la app tenga permiso para escribir registros.

    De forma predeterminada, la cuenta de servicio predeterminada de la app tiene permiso para escribir registros.

    Si la app usa una cuenta de servicio o de usuario diferente, o si cambiaste los permisos de la cuenta de servicio predeterminada, asegúrate de que la cuenta que uses tenga permiso para escribir registros.

Descripción general del proceso de migración

Para migrar la app de Python a fin de usar Cloud Logging en lugar del registro de App Engine, haz lo siguiente:

  1. Instala la biblioteca cliente de Cloud para Cloud Logging.

  2. Conecta AppEngineHandler al módulo de registro de Python.

  3. Implementa la app en App Engine y confirma que el registro funciona como se espera.

Instala la biblioteca cliente de Cloud para Cloud Logging

Para hacer que AppEngineHandler esté disponible en tu app cuando se ejecute en App Engine, haz lo siguiente:

  1. Crea un archivo requirements.txt en la misma carpeta que el archivo app.yaml y agrega las siguientes líneas:

     google-cloud-logging==1.14.0
    

    Te recomendamos usar la versión 1.14.0 de la biblioteca cliente de Cloud Logging, ya que admite apps de Python 2.7.

  2. En el archivo app.yaml de la aplicación, especifica las bibliotecas RPC y setuptools de Google obligatorias y la biblioteca SSL opcional en la sección libraries:

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

    Algunas bibliotecas cliente no necesitan la biblioteca SSL. Si no incluyes la biblioteca SSL para una biblioteca cliente que la necesita, verás un error de SSL en el visor de registros cuando tu app reciba una solicitud.

  3. Crea un directorio para almacenar tus bibliotecas de terceros, como lib/. Luego, usa pip install para instalar las bibliotecas en el directorio. Por ejemplo:

      pip install -t lib -r requirements.txt
      

  4. Crea un archivo appengine_config.py en la misma carpeta que el archivo app.yaml. Agrega lo siguiente al archivo 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)
    

    En el archivo appengine_config.py del ejemplo anterior, se supone que la carpeta lib se encuentra en el directorio de trabajo actual. Si no puedes garantizar que lib esté siempre en el directorio de trabajo actual, especifica la ruta completa a la carpeta lib. Por ejemplo:

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

Para el desarrollo local, recomendamos que instales dependencias en un entorno virtual como virtualenv para Python 2.

Conecta AppEngineHandler al módulo de registro de Python

En cada archivo en los que se escriben entradas de registro, haz lo siguiente:

  1. Importa la biblioteca cliente de Cloud Logging.
  2. Crea una instancia del cliente de Cloud Logging.
  3. Recupera el controlador de Cloud Logging que sea adecuado para el entorno actual. Cuando la app se ejecuta en App Engine, el cliente de Cloud Logging recupera AppEngineHandler.

    Con AppEngineHandler, se formatearán las entradas como un objeto JSON y se proporcionarán los metadatos necesarios para admitir el filtrado por gravedad y correlacionar las entradas de la app con entradas de registro de solicitudes.

  4. Ejecuta el método setup_logging() del cliente de Cloud Logging, que adjunta su objeto de escucha predeterminado como el controlador de registro para el registrador raíz de Python.

Por ejemplo:

# 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 vez que se adjunte el controlador, se enviarán a Logging todos los registros a nivel de INFO o superior que se emitan en tu aplicación de forma predeterminada:

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

Implementa tu app

Cuando estés listo para implementar tu app, debes hacer lo siguiente:

  1. Prueba la app en App Engine.

    La única forma de probar las actualizaciones y confirmar que los niveles de gravedad se asignen y que las entradas de la app se correlacionen con las entradas de las solicitudes es implementar la app en el entorno de ejecución de Python 3.

    Si implementas las actualizaciones en el entorno de ejecución de Python 2, el servicio de registro de App Engine detectará las entradas del registrador raíz de Python y las formateará de forma correcta para el explorador de registros.

    Si ejecutas la app de forma local, Cloud Logging no usa AppEngineHandler y App Engine no puede escribir entradas de solicitud.

  2. Visualiza el explorador de registros y confirma que los niveles de gravedad se asignen a las entradas de la app. Expande una entrada de solicitud y confirma que las entradas que escribe la app mientras se procesa la solicitud aparezcan anidadas debajo de la entrada de la solicitud.

  3. Si la app se ejecuta sin errores, usa la división de tráfico a fin de aumentar de forma gradual el tráfico de tu app actualizada. Supervisa la app para detectar cualquier problema antes de enrutar más tráfico a la app actualizada.