Codelab de registro y seguimiento de Cloud Functions

El objetivo de este codelab es que comprendas cómo aprovechar las herramientas de registro y supervisión que se ofrecen a todos los desarrolladores de Cloud Functions. Estas herramientas vienen con todas las funciones de Cloud Functions que implementa en todos los lenguajes compatibles y deberían ser más productivos cuando escribe y opera su código sin servidores.

Aquí usaremos una función activada por HTTP, pero todo lo que abarcamos también se aplica a otros lenguajes y a funciones activadas por otros eventos (bucket de almacenamiento, Pub/Sub, etc.).

Configuración del entorno a su propio ritmo

Si aún no tienes una Cuenta de Google (Gmail o Google Apps), debes crear una. Accede a Google Cloud Platform Console (console.cloud.google.com) y crea un proyecto nuevo:

Captura de pantalla de 2016-02-10 12:45:26.png

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.

A continuación, debes habilitar la facturación en Cloud Console para usar los recursos de Google Cloud.

Ejecutar este codelab debería costar solo unos pocos dólares, pero su costo podría aumentar si decides usar más recursos o si los dejas en ejecución (consulta la sección “Limpiar” al final de este documento).

Los usuarios nuevos de Google Cloud Platform son aptos para obtener una prueba gratuita de USD 300.

Google Cloud Shell

Si bien Google Cloud Functions y sus funciones de registro y supervisión se pueden usar de forma remota desde su laptop, en este codelab usaremos Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

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

Para activar Google Cloud Shell, en Developer Console, simplemente haz clic en el botón que se encuentra en la esquina superior derecha (el aprovisionamiento y la conexión al entorno debería llevar solo unos minutos):

activateCloudShell.png

Haz clic en el botón “Iniciar Cloud Shell”:

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

Una vez conectado a Cloud Shell, deberías ver que ya estás autenticado y que el proyecto ya está configurado 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>

Cloud Shell también establece algunas variables de entorno de forma predeterminada, que pueden ser útiles cuando ejecute comandos futuros.

echo $GOOGLE_CLOUD_PROJECT

Resultado del comando

<PROJECT_ID>

Si, por algún motivo, el proyecto no se configuró, simplemente ejecuta el siguiente comando :

gcloud config set project <PROJECT_ID>

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

ID del proyecto.png

IMPORTANTE: Por último, establece la zona y la configuración de proyecto predeterminadas:

gcloud config set compute/zone us-central1-f

Puedes elegir una variedad de zonas diferentes. Obtenga más información en la documentación de regiones y zonas.

Para tener algo que supervisar, creemos una Cloud Function Hello World. En el menú de la izquierda de Console, haga clic en Cloud Functions y, luego,Create function"

Asigna un nombre a la nueva función hello-monitor& tt;

... y conserve todos los valores predeterminados del código fuente (sin embargo, puede elegir un idioma o entorno de ejecución diferente si lo desea) :

Por último, crea la función con el botón "Create"

Después de un momento breve, su función debería aparecer como lista para invocarse (como lo indica la marca de verificación verde) :

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

Primero, ejecute el siguiente comando en Cloud Shell :

$ gcloud functions describe hello-monitor

Se debería mostrar una descripción de la función, incluida una URL para httpsTrigger, que es el extremo HTTP(S) que invoca la función. Debería tener este formato: https://<region>-<project-id>.cloudfunctions.net/hello-monitor

Ahora, activar la función debería ser tan simple como curl'en esta URL :

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

Ahora usaremos Vegeta, una herramienta simple de prueba de carga HTTP. Para instalarlo, desde Cloud Shell, solo escriba el siguiente comando :

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

Para enviar algo de tráfico a su Cloud Function (5 solicitudes por segundo durante algunos minutos), use este comando :

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

En la vista de detalles de la función, haz clic en el menú derecho de la vista View :

Esto debería llevarlo a la sección Stackdriver Logging de su proyecto, que le mostrará solo sus registros de Cloud Function :

Esperamos que todas las solicitudes a tu función muestren un código de estado 200.

Con este visor de registros, puedes hacer lo siguiente :

  • Filtrar por nivel de registro (en nuestro caso, todos los registros son de nivel Debug)
  • seleccionar un período específico (relativa o absoluto)
  • habilitar la transmisión de registros (botón de reproducción en la parte superior de la pantalla)
  • copia un vínculo a la entrada de registro (para compartir con miembros del equipo)
  • Mostrar una entrada de registro en el contexto del recurso
  • fijar una entrada de registro (como una indicación visual)
  • Exportar registros a BigQuery, Cloud Storage o Cloud Pub/Sub (o solo descargarlos en formato JSON o CSV)

Además, ten en cuenta que el selector de la parte superior izquierda puede filtrar registros por función. También puedes buscar etiquetas o una búsqueda de texto completo en la barra de búsqueda, en la parte superior de la ventana. En nuestro caso, las etiquetas son hello-monitor (el nombre de la función), así como un identificador de ejecución para cada solicitud.

También puedes copiar los filtros y compartirlos (consulta el menú desplegable en el cuadro de búsqueda) :

En la consola, ve a los detalles de la función & observa el aumento que creamos con nuestro verificador de carga, en términos de la cantidad de invocaciones por segundo y su tiempo de ejecución :

Otra herramienta más detallada para observar la latencia y las llamadas de RPC es la función Stackdriver Trace, pero antes de poder usar esta función, debemos hacer algunos cambios en nuestras funciones, por ejemplo:

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

En la página &Detalles de la función, haz clic en Editar para modificar la función :

Edita el archivo package.json a fin de 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 este modo, se agregará un emoji aleatorio al mensaje que muestra la función después de que se detenga durante 300 milisegundos.

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

No te olvides de hacer clic en Guardar.

Ahora regrese a Cloud Shell y recuerde el comando para generar carga en la función recién implementada :

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

Ya podemos observar la lista de seguimientos producidos sin otros requisitos de configuración y sin una biblioteca de seguimiento específica en tu código.

En el menú de la izquierda, navegue a la lista de seguimientos (en Stackdriver Trace) :

Debería ver algo similar a esta captura de pantalla :

Esto debería hacer evidente que la latencia que se introduce en nuestra función se mide a 300 ms.

Cada punto de este gráfico es una solicitud a la que se puede ver información detallada, como la marca de tiempo, el método y el estado de HTTP, sus etiquetas, un vínculo a la entrada de registro correspondiente y cualquier llamada RPC posterior que haga la función :

Si deseas 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, haz clic en el botón "Deshacer zoom" en la parte superior de la página.

Dado que implementamos una sola función, el gráfico solo muestra las 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 solicitud.

Navega a la sección Traces & Overview (Descripción general) en el menú de la izquierda :

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

Además de la posibilidad de 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 le permite comparar los valores generados con un modelo de referencia del tiempo :

Si logra configurar los intervalos de tiempo correctos y con suficientes datos, puede generar un informe que muestre el cambio importante en la latencia entre la función inicial y la nueva :

Este informe personalizado puede usarse para encontrar el momento en que se introdujo un problema de rendimiento y realizar un seguimiento de un indicador de nivel de servicio (SLI), como la latencia de las solicitudes de los usuarios finales.

Aquí concluye nuestro codelab, que cubrió la implementación de una nueva Cloud Function, navegando por sus registros y observando sus seguimientos de solicitudes.

Si bien Cloud Functions y las herramientas de Stackdriver son plataformas sin servidores que no generarán costos cuando no se usan, ser una buena ciudadana de la nube es una función que borre nuestra función.

Simplemente selecciona la función hello-monitor en la página de descripción general de Cloud Functions y haz clic en &&t;borrar.

Aquí concluye este sencillo codelab introductorio sobre el registro y los seguimientos de Cloud Functions.

Esta lectura de seguimiento es la siguiente :

/