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 vienen con cada Cloud Function que implementas en todos los lenguajes compatibles y deberían permitirte aumentar tu productividad cuando escribes y operas tu código sin servidores.

5815064fec87444b.png

Usarás una Cloud Function activada por HTTP, pero todo lo que se trate también se aplica a otros lenguajes y a Cloud Functions activada 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 no incurrir en facturación 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 un mensaje "Hello, World" de Google Cloud. En el menú de la izquierda de la consola de Google Cloud, haz clic en Cloud Functions y, luego, en Crear función.

8c13aa20af602aa7.png

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

fa6816c96d6d5b94.png

Mantén todos los valores predeterminados del código fuente. (Sin embargo, puedes elegir un idioma o entorno de ejecución diferente 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. Prueba la Cloud Function y envía tráfico con un generador de cargas

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

Primero, en Cloud Shell, emite el siguiente comando:

$ gcloud functions describe hello-monitor

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

Ahora, activar la Cloud Function 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 cargas HTTP. Para instalarla, desde Cloud Shell, simplemente escribe el siguiente comando :

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

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

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

5. Navega por los registros

Haz clic en Ver registros en la vista de detalles de tu Cloud Function.

b24157fd3376e6a8.png

Esto debería llevarte a la sección Stackdriver Logging de tu proyecto, que te mostrará solo tus registros de Cloud Function.

5a36fa75d2fb0165.png

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

Cuando visualizas los registros, puedes hacer lo siguiente:

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

6. Actualiza la función

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

aaee3159bbe395d3.png 8ed347101da5eca0.png

Otra herramienta más detallada para observar la latencia y las llamadas RPC es Stackdriver Trace, pero antes de poder usarlo, debes realizar algunos cambios en 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 generar latencia.
  3. Agrega una variable de entorno a fin de 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"
  }
}

Para editar la función real, cambia 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
  
};

De esta manera, se agrega un emoji aleatorio al mensaje que muestra la Cloud Function después de una pausa de 300 milisegundos.

Por último, agrega una variable de entorno de Cloud Function llamada GOOGLE_CLOUD_TRACE_ENABLED y establécela en true de la siguiente manera:

9205bd277b76aa21.png

Haz clic en Guardar.

Regresa 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

Ya tienes todo listo para observar la lista de seguimientos producidos sin otros requisitos de configuración ni una biblioteca de seguimiento 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

Eso debería dejar en claro que la latencia ingresada en su Cloud Function se mide en 300 milisegundos.

Cada punto del gráfico es una solicitud de 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, simplemente haz clic y arrastra el gráfico. Cómo seleccionar un intervalo de tiempo personalizado en el gráfico de seguimiento

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

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

Navega a Descripción general en el menú de la izquierda:

e920cfca2a50899e.png

En esta página de descripción general, puedes encontrar los seguimientos recientes y otras estadísticas.

ef5a45647967d275.png

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

5bd34e9d13b47fb6.png

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

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

Este informe personalizado se puede usar para detectar cuándo se presentó un problema de rendimiento y hacer un seguimiento de un indicador de nivel de servicio (SLI), como la latencia de la solicitud del usuario final.

8. Es hora de limpiar los recursos

Con esto concluye el codelab.

Si bien las herramientas de Cloud Functions y 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 selecciona hello-monitor en Descripción general, en Cloud Functions, y haz clic en Borrar.

aceb633cf70a4a27.png

9. Próximos pasos

Aquí tienes una lectura de seguimiento:

/