Cómo usar Google Stackdriver Debug, Trace, Logging y Logpoints

Este instructivo es una visita guiada de Google Stackdriver, que te permite hacer lo siguiente con tus aplicaciones de Google Cloud Platform:

  • Tome una instantánea de depuración en sus aplicaciones que se ejecutan en App Engine, Compute Engine y Container Engine.
  • Vea los registros de la aplicación.
  • Configure las métricas, supervíselos y obtenga alertas.
  • Realice un seguimiento de sus llamadas a la API y obtenga un desglose de los tiempos de respuesta y de los posibles cuellos de botella en su código.
  • Agrega puntos de registro a una aplicación en ejecución, sin necesidad de implementar la app. Esta es una función realmente única (y, con suerte, útil).

En este instructivo, haremos lo siguiente desde cero:

  1. Crea un proyecto de Google Cloud Platform (específicamente, App Engine)
  2. Configura el repositorio de código fuente del proyecto de Google Cloud Platform
  3. Usar la fuente de aplicación estándar de libro de visitas de Python disponible en GitHub
  4. Implementa el código
  5. Ve cómo podemos obtener instantáneas de depuración de la aplicación en ejecución
  6. Consultar registros de llamadas y registros de aplicaciones
  7. Agregar puntos de registro a la aplicación en ejecución actual Esta función se cubrió inicialmente en esta entrada de blog: Cómo agregar registros de aplicaciones a una aplicación sin reinicios.

Empecemos.

Romin Irani creó este contenido inicialmente y se publicó aquí.

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

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

Luego, acepte las condiciones del servicio y haga clic en el vínculo "Iniciar Cloud Shell&quot:

x.png

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>

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.

Echa un vistazo a las API de StackDriver habilitadas

Veamos las API que se habilitaron para tu proyecto. Usa la barra de búsqueda para encontrar el panel de la API como se muestra a continuación.

Observe las API específicas que se habilitaron para su proyecto :

Todos los proyectos de Google Cloud Platform ofrecen hosting privado de Git, pero primero debemos crear un repositorio predeterminado para trabajar. Use el cuadro de búsqueda de Console para buscar los siguientes repositorios :

Haz clic en CREAR REPOSITORIO para crear un nuevo repositorio de código denominado predeterminado:

Con Cloud Shell, ahora clonaremos este directorio en nuestra instancia de Google Cloud Shell. Para ello, primero debemos crear un directorio en nuestra instancia de Google Cloud Shell y navegar a él como se muestra a continuación (resultado de muestra):

mkdir stackdriver-demo
cd stackdriver-demo/

Ahora, podemos clonar el repositorio predeterminado aquí con el comando de gcloud, como se muestra a continuación:

gcloud source repos clone default

Este es el resultado que deberías ver en la consola :

Cloning into '/home/gcp123_student/default'...
warning: You appear to have cloned an empty repository.
Project [qwiklabs-gcp-1234abc1234] repository [default] was cloned to [/home/gcp123_student/default].

¡Genial! Dediquemos un momento a profundizar un poco en los controles remotos git que se configuraron. Esto no es necesariamente algo, sino algo, para que puedas comprender mejor lo que sucedió en segundo plano.

Ve al directorio predeterminado que creaste y activa el comando git remote -v como se muestra a continuación.

cd default
git remote -v

Este es el resultado que deberías ver en la consola:

origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (fetch)
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (push)

Puede ver que esto apunta correctamente al repositorio de Git asociado con nuestro proyecto de GCP.

Extrae la aplicación de libro de visitas de GitHub

La aplicación que usaremos es una aplicación estándar de App Engine llamada Guestbook y está disponible en el repositorio oficial de GitHub de Google Cloud Platform. Esta aplicación también forma parte de la documentación oficial para comenzar. El proyecto de GitHub está disponible en : https://github.com/GoogleCloudPlatform/appengine-guest-python.

Ahora, extraeremos este código a nuestra instancia de Cloud Shell. El comando y su resultado se muestran aquí :

git pull https://github.com/GoogleCloudPlatform/appengine-guestbook-python

Este es el resultado que deberías ver en la consola :

remote: Counting objects: 485, done.
remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485
Receiving objects: 100% (485/485), 436.42 KiB | 163.00 KiB/s, done.
Resolving deltas: 100% (195/195), done.
From https://github.com/GoogleCloudPlatform/appengine-guestbook-python
* branch HEAD -> FETCH_HEAD

Ahora, tenemos todo el código presente de manera local en nuestra instancia de Google Cloud Shell. Puede ver los distintos archivos que se extrajeron del proyecto de GitHub.

Enviar el código actual mediante Cloud Shell al repositorio de Git del proyecto

Ahora insertemos este código en el repositorio de Git del proyecto de GCP para que podamos establecer puntos de interrupción, puntos de registro y mucho más en nuestro código. Tenga en cuenta que este no es un paso obligatorio, ya que puede realizar la integración directamente con GitHub, su máquina local y otras formas de vincular su código fuente.

Sin embargo, para este propósito, enviaremos este código al repositorio de Git del proyecto de GCP. Esto se hace mediante el comando estándar de git push, como se muestra a continuación:

git push origin master

Este es el resultado que deberías ver en la consola :

Counting objects: 485, done.
Compressing objects: 100% (280/280), done.
Writing objects: 100% (485/485), 436.42 KiB | 0 bytes/s, done.
Total 485 (delta 195), reused 485 (delta 195)
remote: Storing objects: 100% (485/485), done.
remote: Processing commits: 100% (152/152), done.
To https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default
* [new branch] master -> master

Ahora regrese a GCP Cloud Console y, específicamente, a la sección Desarrollo. Haga clic en Código fuente y, para el repositorio predeterminado, debería poder ver todos los archivos del proyecto. El resultado de muestra es el siguiente:

Ya estamos listos para implementar nuestra aplicación de libro de visitas en App Engine. Para implementar la app, asegúrese de estar en Google Cloud Shell y en el directorio predeterminado como hemos estado todos. Usa el comando gcloud app deploy como se muestra a continuación:

gcloud app deploy --version 1

Cuando se te solicite elegir una región, selecciona [1] us-east1.

Este es el resultado que deberías ver en la consola :

You are about to deploy the following services:
— qwiklabs-gcp-1234abc1234/default/1 (from [/home/gcp123-student/default/app.yaml])
Deployed URL: [https://qwiklabs-gcp-1234abc1234.appspot.com]
Do you want to continue (Y/n)? Y
Beginning deployment of service [default]...
File upload done.
Updating service [default]...done.
Deployed service [default] to https://qwiklabs-gcp-1234abc1234.appspot.com]

Ten en cuenta que proporcionamos un parámetro de versión para el comando de implementación de la app. Le asignamos un valor de "1".

Dado que la aplicación de libro de visitas usa Google Cloud Datastore para la persistencia, debemos actualizar los índices de Datastore. Los índices se especifican en el archivo index.yaml y solo usamos el comando gcloud datastore create-indexes como se muestra a continuación:

gcloud datastore create-indexes index.yaml

Este es el resultado que deberías ver en la consola :

You are about to update the following configurations:
— qwiklabs-gcp-1234abc1234/index From: [/home/gcp123_student/default/index.yaml]
Do you want to continue (Y/n)? Y

Los índices de Datastore pueden tardar un poco en actualizarse. Para verificar el estado, busca Índices de Datastore y haz clic en Índices. Mientras se crean los índices, verás un estado con un valor de "Indexación", como se muestra a continuación:

Para verificar si nuestra app con la versión 1 está implementada y disponible, vayamos a Compute → App Engine y, luego, haga clic en Versiones como se muestra a continuación:

Ahora, todo debería verse bien y puedes echar un vistazo al proyecto en https://<PROJECT_ID>.appspot.com. Una vez más, los índices del almacén de datos pueden tardar unos minutos en estar listos, por lo que, si la aplicación muestra un error (por ejemplo: Error interno del servidor), vuelve a intentarlo unos minutos más tarde.

Ahora, para acceder a la aplicación, crearemos algunas entradas del libro de visitas, como se muestra a continuación:

¡Genial! Ya estamos listos para profundizar en las características de Stackdriver.

Primero, veamos cómo podemos tomar instantáneas de nuestra aplicación en ejecución. Las instantáneas son útiles si deseas depurar un fragmento de código particular, inspeccionar las variables y mucho más. Todo esto sucede mientras se entrega tu aplicación. Esto es muy útil si recibes informes sobre un problema con tu aplicación y quieres tratar de depurar y ver lo que sucede en ella, inspeccionar una serie de variables, tomar la instantánea de forma condicional y más.

Hagamos eso ahora con la aplicación de libro de visitas. Solicitaremos una instantánea si alguien solicita la página principal y, en particular, queremos que se recupere la lista de saludos que hay actualmente en Datastore.

El código correspondiente se encuentra en el archivo guestbook.py. Específicamente, nos interesa comenzar a inspeccionar el código en el tiempo de ejecución una vez que haya recuperado la lista de saludos del almacén de datos. Esto se realiza en la línea n.o 72. Podemos poner un punto de interrupción en la línea 74 para saber que se habría ejecutado el número 72.

Para ello, haz clic en “Depurar” (Debug) en la vista de la versión de App Engine o ve a Stackdriver → Depurar . Se mostrará la pantalla que se muestra a continuación. Lo que debes hacer es seleccionar el archivo (guestbook.py) que se encuentra a la izquierda y hacer clic en el número de línea como se muestra.

Se mostrará un mensaje destacado en el cuadro rojo que se encuentra arriba, en el que se indica que la instantánea está esperando que se active. Ahora, lo único que debemos hacer es acceder a nuestra página en

https://<PROJECT_ID>.appspot.com.

Una vez que lo hagas, la instantánea se activará y verás que las secciones Variables y Call stack se propagan como se muestra a continuación. Observe cómo se muestran las variables y puede expandirlas para verificar los valores. Esto es muy útil.

Por ejemplo, si expandes la variable saludos, verás que tiene los registros correspondientes a la cantidad de entradas de libro de visitas que creaste.

Una función muy útil es volver a tomar una instantánea en cualquier momento. Haz clic en el ícono de la cámara en cualquier momento y volverá a esperar a que se capture la instantánea, como se muestra a continuación:

Puedes usar el campo Expresiones como se muestra a continuación para realizar un seguimiento de variables específicas. Por ejemplo, sabemos que tenemos saludos variables y nos interesa inspeccionar su valor en el momento en que se envía la instantánea. Podemos ingresar la variable "greetings", como se muestra en la siguiente captura de pantalla. Cuando se alcance la instantánea, se propagará con los valores que se muestran.

Si desea que la instantánea se active solo en una condición determinada, puede usar el campo Condición como se muestra a continuación. Aquí, se indica que la instantánea solo debe ocurrir si la cantidad de saludos es superior a 1. Si quiere, puede experimentar con esto.

Es muy importante asegurarse de que el rendimiento de su aplicación web cumpla con los requisitos que estableció. Stackdriver Trace es una herramienta clave que lo ayuda a comprender la latencia en sus aplicaciones.

Está habilitada de forma predeterminada para todas las aplicaciones de App Engine y nos proporciona detalles de rendimiento muy útiles para todos nuestros extremos junto con un desglose de varias llamadas.

En nuestro caso, llegamos a la página principal ("/") y observamos o agregamos las entradas del libro de visitas. Esto es suficiente para que Trace nos proporcione más información sobre la latencia. Solo navega a Stackdriver Traces Overview y verás una captura de pantalla como se muestra a continuación. Observa los seguimientos recientes y sus latencias.

Si hacemos clic en cualquiera de los registros, es decir, en el vínculo de URI, se mostrará el seguimiento detallado como se indica a continuación:

Observe cómo puede darnos un desglose de la latencia y qué llamadas tardan más tiempo. A partir de la visualización anterior, puedes ver que la consulta del almacén de datos tarda tiempo. Una opción que se podría tomar sería almacenar en caché los datos para reducir el cuello de botella. Una vez más, todo esto depende de su aplicación, y esto debería ser muy útil para determinar las áreas de su seguimiento de llamadas que podrían requerir una refactorización.

Para ver los registros de tu aplicación en cualquier momento, navega a Stackdriver Logging (como se muestra a continuación). Hay varios filtros disponibles a partir de varios servicios de GCP → Tipos de registros → Nivel de registro → Fecha y más.

La siguiente captura de pantalla muestra los registros de nuestra aplicación de App Engine y la versión predeterminada 1.

logging.png

Por último, analicemos una función que te entusiasme con las posibilidades que ofrece. Por lo general, como desarrolladores hacemos todo lo posible para incluir instrucciones de registro en nuestro código, lo implementamos y esperamos que el registro nos indique todo lo que queremos saber.

Pero sabemos que eso no es suficiente y solo con la depuración, nos damos cuenta de que tal vez deberíamos haber colocado algunas instrucciones de registro aquí y allá. El flujo de trabajo habitual es modificar el código, colocar la instrucción de registro adicional, volver a implementarlo y supervisarlo.

Esto es correcto, pero ¿qué pasaría si pudieras agregar estas instrucciones de registro (denominada puntos de registro) a tu aplicación en ejecución? Esto significa que no necesitamos realizar el proceso de detener la aplicación, cambiar el código y volver a implementar. En cambio, podemos administrar nuestra lista de puntos de registro desde fuera de nuestra aplicación mediante la compatibilidad con puntos de registro.

Desde Cloud Shell, verifiquemos la lista actual de puntos de registro que configuramos (que debe ser 0). Esto se hace mediante el comando gcloud, como se muestra a continuación:

gcloud debug logpoints list

Este es el resultado que deberías ver en la consola :

Debug target not specified. Using default target: default-1
Listed 0 items.

Ahora, agregaremos un punto de registro a la aplicación en ejecución. Para agregar un punto de registro, debemos hacer lo siguiente:

  • Identifique el archivo de código fuente y el número de línea al que queremos agregar el punto de registro.
  • Identificar el mensaje de registro. Este mensaje de registro puede estar codificado o, incluso, ser una expresión.

En nuestro caso, agregaremos un punto de registro al archivo guest.py en la línea n.o 74 con el comando createpoints, como se muestra a continuación:

gcloud debug logpoints create guestbook.py:74 "Fetched greetings from Datastore. Count of greetings : {len(greetings)}"

Este es el resultado que deberías ver en la consola :

Debug target not specified. Using default target: default-1
— id: 53538243519d4-f9a0-bdbce
location: guestbook.py:74
logLevel: INFO
logMessageFormat: Fetched greetings from Datastore. Count of greetings : {len(greetings)}
condition: None
status: ACTIVE

Proporcionamos la filename:linenumber y el mensaje de registro anterior. Tenga en cuenta que nuestro mensaje de registro también contiene una expresión que imprimirá la cantidad de saludos que se recuperaron del almacén de datos.

El comando regresa con el mensaje que indica que se agregó el punto de registro. A continuación, se muestra una captura de pantalla de Cloud Shell:

Ahora, si activa el comando list points, verá el siguiente resultado:

gcloud debug logpoints list

Este es el resultado que deberías ver en la consola :

Debug target not specified. Using default target: default-1
STATUS LOCATION CONDITION LOG_LEVEL LOG_MESSAGE_FORMAT ID
ACTIVE
guestbook.py:74 INFO Fetched greetings from Datastore. Count of greetings : {len(greetings)} 53538243519d4-f9a0-bdbce

Para ver cómo funciona, podemos volver a acceder a la página principal en https://<PROJECT_ID>.appspot.com. Esto invocará el código y, a su vez, nuestro punto de registro. Recuerde que esto se registrará de forma predeterminada en nuestros registros de aplicaciones. Por lo tanto, lo único que necesitamos hacer es visitar Stackdriver Logging una vez más, como se muestra a continuación:

Haz clic en la solicitud en particular y listo. En los detalles, verá que nuestro punto de registro se activa y se muestra el mensaje de registro.

Esperamos que haya disfrutado de este instructivo. Hace referencia a solo algunas de las funcionalidades que ofrece la plataforma Stackdriver. Hay mucho más que explorar. Consulta el blog de Romin Irani (el autor original de este codelab) en https://rominirani.com/ para obtener más instructivos de Google Cloud Platform.

También puedes consultar este otro codelab llamado “Supervisión y registro de Stackdriver” para obtener una mejor visibilidad del estado de la aplicación.

Si tienes algún comentario o deseas informar sobre este codelab, usa el vínculo "Encuentra un error" en la parte inferior izquierda de esta página.