Usa Stackdriver Logging y Stackdriver Trace para Cloud Functions

1. Introducción

En este codelab, aprenderás a aprovechar las herramientas de registro y supervisión disponibles para todos los desarrolladores que trabajan con Cloud Functions. Las herramientas se incluyen con cada Cloud Function que implementas en todos los lenguajes compatibles y deberían permitirte ser más productivo cuando escribes y operas tu código sin servidores.

5815064fec87444b.png

Usarás una Cloud Function activada por HTTP, pero todo lo que abarcaremos también se aplica a otros lenguajes y a las Cloud Functions activadas por otros eventos.

2. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a la consola de Cloud y crea un proyecto nuevo o reutiliza uno existente. (Si todavía no tienes una cuenta de Gmail o de G Suite, debes crear una).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Recuerde el ID de proyecto, un nombre único en todos los proyectos de Google Cloud (el nombre anterior ya se encuentra en uso y no lo podrá usar). Se mencionará más adelante en este codelab como PROJECT_ID.

  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar los recursos de Google Cloud recursos.

Ejecutar este codelab no debería costar mucho, tal vez nada. Asegúrate de seguir las instrucciones de la sección “Realiza una limpieza”, en la que se aconseja cómo cerrar recursos para que no se te facture más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Cloud Shell

Si bien Cloud Functions y sus capacidades de registro y supervisión se pueden usar de forma remota desde tu laptop, usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud.

Esta máquina virtual basada en Debian está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Esto significa que todo lo que necesitarás para este Codelab es un navegador (sí, funciona en una Chromebook).

  1. Para activar Cloud Shell desde la consola de Cloud, solo haz clic en Activar Cloud ShellfEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (el aprovisionamiento y la conexión al entorno debería llevar solo unos minutos).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Captura de pantalla del 14 de junio de 2017 a las 10.13.43 p.m. .png

Una vez conectado a Cloud Shell, debería ver que ya se autenticó y que el proyecto ya se configuró con tu PROJECT_ID:

gcloud auth list

Resultado del comando

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Resultado del comando

[core]
project = <PROJECT_ID>

Si, por algún motivo, el proyecto no está configurado, solo emite el siguiente comando:

gcloud config set project <PROJECT_ID>

Si no conoce su PROJECT_ID, Observa el ID que usaste en los pasos de configuración o búscalo en el panel de la consola de Cloud:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell también configura algunas variables de entorno de forma predeterminada, lo que puede resultar útil cuando ejecutas comandos futuros.

echo $GOOGLE_CLOUD_PROJECT

Resultado del comando

<PROJECT_ID>
  1. Establece la zona predeterminada y la configuración del proyecto.
gcloud config set compute/zone us-central1-f

Puedes elegir una variedad de zonas diferentes. Para obtener más información, consulta Regiones y zonas.

3. Implementa una Cloud Function simple

Para tener algo que supervisar, crea una Cloud Function de "Hello, World". En el menú de la izquierda de la consola de Google Cloud, haz clic en Cloud Functions y, luego, en Crear función.

3c13aa20af602aa7.png

Ingresa "hello-monitor" como el nombre de tu nueva Cloud Function.

fa6816c96d6d5b94.png

Conserva todos los valores predeterminados del código fuente. (Sin embargo, puedes elegir otro lenguaje o tiempo de ejecución si lo deseas).

7aadf164450484e.png

Por último, haga clic en Crear.

dc74cd21000d6c91.png

Deberías ver tu Cloud Function con una marca de verificación verde junto a ella, lo que significa que está lista para invocarse.

5363a34eb001d5ed.png

4. Probar la Cloud Function y enviar tráfico con un generador de carga

Ahora que la Cloud Function se implementó correctamente, pruébala desde la línea de comandos.

Primero, usa Cloud Shell para emitir el siguiente comando:

$ gcloud functions describe hello-monitor

Esto debería devolver una descripción de Cloud Function, incluida una URL para httpsTrigger, que es el extremo HTTP(S) para invocar Cloud Function. Debería verse de la siguiente manera: https://<region>-<project-id>.cloudfunctions.net/hello-monitor.

Activar la Cloud Function ahora debería ser tan simple como usar el comando curl en esa URL.

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

Ahora usa Vegeta, una herramienta simple de prueba de carga HTTP. Para instalarlo, en Cloud Shell, simplemente escribe el siguiente comando :

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

Para enviar tráfico a tu Cloud Function (cinco solicitudes por segundo durante un par de minutos), usa el siguiente comando:

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

5. Cómo navegar por los registros

En la vista de detalles de Cloud Function, haz clic en Ver registros.

b24157fd3376e6a8.png

Esto debería llevarte a la sección Stackdriver Logging de tu proyecto, en la que se muestran solo los registros de Cloud Functions.

5a36fa75d2fb0165.png

Todas las solicitudes a tu Cloud Function deben devolver un código de estado 200.

Cuando veas los registros, podrás hacer lo siguiente:

  • Filtra por nivel de registro (en tu caso, todos los registros son de nivel debug).
  • Selecciona un período específico (relativo o absoluto).
  • Habilita la transmisión de registros (con Play 751a4600016f34a7.pngen la parte superior de la pantalla).
  • Copiar un vínculo a la entrada de registro (para compartirlo con los miembros del equipo)
  • Muestra una entrada de registro en el contexto de recursos.
  • Fija una entrada de registro (como una señal visual).
  • Exporta registros a BigQuery, Cloud Storage o Pub/Sub (o simplemente descárgalos como archivos JSON o CSV).

6. Actualiza la función

En la consola de Cloud, navega a la vista Detalles de la función y observa el aumento repentino que creaste con tu verificador de carga en la cantidad de invocaciones por segundo y su tiempo de ejecución.

aaee3159bbe395d3.png 7ed347101da5eca0.png

Otra herramienta más detallada para observar la latencia y las llamadas a RPC es Stackdriver Trace, pero, antes de que puedas usarla, debes realizar algunos cambios en tus Cloud Functions. Puedes hacer lo siguiente:

  1. Agrega el paquete node-emoji que salva vidas como dependencia.
  2. Actualiza el código de la función para usar el módulo node-emoji y agregar algo de latencia.
  3. Agrega una variable de entorno para habilitar Stackdriver Trace para Cloud Functions.

En Detalles de la función, haz clic en Editar para modificar la función.

39b0f8f98b18a6c0.png

Edita el archivo package.json para agregar una dependencia para el paquete node-emoji.

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

Edita la función real cambiando el contenido de index.js por lo siguiente:

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

Esto agrega un emoji aleatorio al mensaje que devuelve Cloud Function después de una pausa de 300 milisegundos.

Por último, agrega una variable de entorno de Cloud Functions llamada GOOGLE_CLOUD_TRACE_ENABLED y configúrala en true de la siguiente manera:

9205bd277b76aa21.png

Haz clic en Guardar.

Vuelve a Cloud Shell y recupera el comando para generar algo de carga en la Cloud Function recién implementada:

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

Ahora puedes observar la lista de registros producidos sin otros requisitos de configuración ni una biblioteca de registro específica en tu código.

7. Realiza un seguimiento de la Cloud Function actualizada

En el menú de la izquierda, navega a Lista de seguimientos (en Stackdriver Trace).

576373f38cad6f8.png

Deberías ver algo similar a la siguiente captura de pantalla:

44a36b758b49f88f.png

Esto debería dejar en claro que la latencia introducida en tu Cloud Function se mide en 300 milisegundos.

Cada punto del gráfico es una solicitud para la que puedes ver información detallada, como la marca de tiempo, el método y el estado HTTP, sus etiquetas, un vínculo a la entrada de registro correspondiente y cualquier llamada RPC posterior que realice la Cloud Function.

5815064fec87444b.png

Si quieres acercar la imagen, haz clic en el gráfico y arrástralo. Cómo seleccionar un intervalo de tiempo personalizado en el gráfico de seguimiento

Para alejar la imagen, haz clic en Deshacer zoom en la parte superior de la página.

Como implementaste una sola Cloud Function, el gráfico solo muestra solicitudes GET en el URI hello-monitor, pero puedes filtrar los registros por método HTTP (GET, POST, DELETE), por estado HTTP (2XX, 3XX) o con el filtro de solicitudes.

Navega a Overview en el menú de la izquierda:

e920cfca2a50899e.png

En esta página de resumen, puedes encontrar registros recientes y otras estadísticas.

ef5a45647967d275.png

También puedes crear informes personalizados basados en una combinación de un filtro de solicitudes de URI, un método HTTP, un estado HTTP y un período. Incluso te permite comparar los valores generados con un período de referencia.

5bd34e9d13b47fb6.png

Si logras configurar los períodos correctos con suficientes puntos de datos, puedes generar un informe que muestre el cambio importante en la latencia entre la Cloud Function inicial y la nueva.

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

Este tipo de informe personalizado se puede usar para saber cuándo se introdujo un problema de rendimiento y hacer un seguimiento de un indicador de nivel de servicio (SLI), como la latencia de las solicitudes de los usuarios finales.

8. Es hora de limpiar los recursos

Con esto concluye el codelab.

Si bien Cloud Functions y las herramientas de Stackdriver son plataformas sin servidores que no generan costos cuando no se usan, sé un buen ciudadano de la nube y borra tu Cloud Function. Solo tienes que seleccionar hello-monitor en Descripción general en Cloud Functions y hacer clic en Borrar.

aceb633cf70a4a27.png

9. Próximos pasos

Aquí tienes algunas lecturas complementarias:

/