En este instructivo, se realiza un recorrido por 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.
- Configura métricas, supervisa su rendimiento y recibe 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.
- Agregar puntos de registro a una aplicación en ejecución, sin necesidad de implementar tu app. Esta es una función verdaderamente única (y, con suerte, útil).
En este instructivo, haremos lo siguiente desde cero:
- Crea un proyecto de Google Cloud Platform (específicamente, App Engine)
- Configura el repositorio de código fuente del proyecto de Google Cloud
- Utiliza el código fuente estándar de la aplicación de Python de Guestbook disponible en GitHub.
- Implementa el código
- Descubre cómo obtener instantáneas de depuración de la aplicación en ejecución
- Observa los registros y los seguimientos de llamadas de la aplicación
- Agrega puntos de registro a la aplicación en ejecución actual. Esta función se abordó inicialmente en esta entrada de blog : Cómo agregar registros de aplicación a una aplicación sin reinicios
Empecemos.
Romin Irani creó este contenido originalmente y lo publicó aquí.
Configuración del entorno de autoaprendizaje
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:
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, deberás habilitar la facturación en la consola de Cloud 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, haz clic en el botón que se encuentra en la parte superior derecha de la consola para desarrolladores (el aprovisionamiento y la conexión al entorno debería llevar solo unos minutos):
Luego, acepta las Condiciones del Servicio y haz clic en el vínculo "Iniciar Cloud Shell":
Una vez que te conectes a Cloud Shell, deberías ver que ya te autenticaste 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 se configuró, 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:
IMPORTANTE: Por último, 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. Obtén más información en la documentación Regiones y zonas.
Consulta las APIs de Stackdriver habilitadas
Veamos las APIs 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.
Observa las APIs específicas que se habilitaron para tu proyecto :
Todos los proyectos de Google Cloud Platform ofrecen alojamiento privado de Git, pero primero debemos crear un repositorio predeterminado con el que trabajar. Navega a Source Repositories con el cuadro de búsqueda de la consola :
Haz clic en "CREATE REPOSITORY" para crear un nuevo repositorio de código llamado "default" :
Con Cloud Shell, ahora clonaremos este directorio en nuestra instancia de Google Cloud Shell. Para ello, primero crearemos un directorio en nuestra instancia de Google Cloud Shell y navegaremos a él, como se muestra a continuación (salida de muestra):
mkdir stackdriver-demo
cd stackdriver-demo/
Ahora, podemos clonar el repositorio predeterminado aquí a través del 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 analizar con más detalle los remotos de Git que se configuraron. Esto no es necesario, pero te ayudará a comprender mejor lo que sucedió en segundo plano.
Ve al directorio predeterminado creado y ejecuta 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)
Puedes ver que apunta correctamente al repositorio de Git asociado con nuestro proyecto de GCP.
Extrae la aplicación de Guestbook 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 Google Cloud Platform en GitHub. 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-guestbook-python.
Ahora extraeremos este código a nuestra instancia de Cloud Shell. Aquí se muestran el comando y su resultado :
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 forma local en nuestra instancia de Google Cloud Shell. Puedes ver los distintos archivos que se extrajeron del proyecto de GitHub.
Envía el código actual al repositorio de Git del proyecto con Cloud Shell
Ahora, enviemos este código al repositorio de Git del proyecto de GCP para que podamos establecer puntos de interrupción, puntos de registro y mucho más para nuestro código. Ten en cuenta que este no es un paso obligatorio, ya que puedes realizar la integración directamente con GitHub, tu máquina local y otras formas de vincular tu código fuente.
Sin embargo, para nuestro propósito aquí, enviaremos este código al repositorio de Git del proyecto de GCP. Esto se hace a través del comando git push estándar, 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, regresa a tu consola de Google Cloud y, específicamente, a la sección Desarrollo. Haz clic en Código fuente y, en el repositorio predeterminado, deberías poder ver todos los archivos del proyecto. A continuación, se muestra el resultado de muestra:
Ya está todo listo para implementar nuestra aplicación de App Engine de libro de visitas. Para implementar la app, asegúrate de estar en Google Cloud Shell y en el directorio predeterminado, como lo hemos estado haciendo todo el tiempo. Usa el comando gcloud app deploy
como se muestra a continuación:
gcloud app deploy --version 1
Cuando se te solicite que elijas 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 al comando de implementación de la app. Le asignamos un valor de "1"
.
Dado que la aplicación Guestbook usa Google Cloud Datastore para la persistencia, debemos actualizar los índices de Datastore. Los índices se especifican en el archivo index.yaml
y simplemente 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
Es posible que los índices de Datastore tarden un poco en actualizarse. Para verificar el estado, busca "Índices de Datastore" y haz clic en Índices. Mientras se compilan los índices, verás un estado con el valor "Indexando", como se muestra a continuación:
Para verificar si nuestra app con la versión 1 está implementada y disponible, ve a Compute → App Engine y, luego, haz clic en Versions, como se muestra a continuación:
Todo debería verse bien ahora, y puedes ver tu proyecto en https://<PROJECT_ID>.appspot.com
. Nuevamente, es posible que los índices del almacén de datos tarden unos minutos en estar listos, por lo que, si la aplicación te muestra un error (por ejemplo, Internal Server Error), vuelve a intentarlo unos minutos después.
Ahora, usemos la aplicación. Para ello, accede y crea algunas entradas en el libro de visitas, como se muestra a continuación:
¡Genial! Ahora sí, podemos explorar las funciones 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 en particular, inspeccionar las variables y mucho más. Todo esto sucede mientras tu aplicación sigue publicándose. Esto es muy útil en caso de que recibas informes de un problema con tu aplicación y quieras intentar depurar y ver qué sucede con ella, inspeccionar una gran cantidad de variables, tomar la instantánea de forma condicional y mucho más.
Hagámoslo ahora para la aplicación de libro de visitas. Solicitaremos una instantánea si alguien solicita la página principal y, específicamente, queremos que recupere la lista de saludos que se encuentran actualmente en Datastore.
El código para esto está presente 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 hace en la línea 72. Así que 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 "Debug" en la vista de la versión de App Engine o ve a Stackdriver → Debug . Se mostrará la siguiente pantalla. Lo que debes hacer es seleccionar el archivo (guestbook.py
) a la izquierda y, luego, hacer clic en el número de línea como se muestra.
Se mostrará un mensaje destacado en el cuadro rojo anterior que indica que se está esperando que se active una instantánea. Ahora, todo lo que debemos hacer es acceder a nuestra página en
https://<PROJECT_ID>.appspot.com
.
Una vez que lo hagas, se activará la instantánea y verás que se propagan las secciones Variables y Pila de llamadas, como se muestra a continuación. Observa cómo se muestran las variables y expándelas para verificar los valores. Es muy útil.
Por ejemplo, si expandes la variable de saludos, verás que tiene los registros correspondientes a la cantidad de entradas del libro de visitas que creaste.
Una función muy útil es la de volver a tomar una instantánea en cualquier momento. Solo haz clic en el ícono de la cámara en cualquier momento y volverá a esperar a que se tome la instantánea, como se muestra a continuación:
Puedes usar el campo Expressions, como se muestra a continuación, para hacer un seguimiento de variables específicas. Por ejemplo, sabemos que tenemos una variable greetings y nos interesa inspeccionar su valor en el momento en que se alcanza una instantánea. Podemos colocar la variable de saludo como se muestra en la siguiente captura de pantalla. Cuando se alcance la instantánea, se completará con los valores que se muestran.
Si deseas que la instantánea se active solo en una condición determinada, puedes usar el campo Condición, como se muestra a continuación. Aquí indicamos que la instantánea solo debe tomarse si la cantidad de saludos es mayor que 1. Experimenta con esto si quieres.
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 te ayuda a comprender la latencia en tus aplicaciones.
Está habilitado de forma predeterminada para todas las aplicaciones de App Engine y nos brinda detalles de rendimiento muy útiles para todos nuestros extremos, junto con un desglose de varias llamadas.
En nuestro caso, accedimos a la página principal ("/") y vimos o agregamos las entradas del libro de visitas. Esto es suficiente para que el registro nos brinde más información sobre la latencia. Solo debes navegar al resumen de Stackdriver Trace y verás una captura de pantalla como la que se muestra a continuación. Observa los seguimientos recientes y sus latencias.
Si hacemos clic en cualquiera de los seguimientos, es decir, en el vínculo del URI, se mostrará el seguimiento detallado como se indica a continuación:
Observa cómo puede desglosar la latencia y qué llamadas tardan más. En la visualización anterior, puedes ver que la consulta de Datastore lleva tiempo. Quizás una opción para analizar podría ser almacenar los datos en caché para reducir ese cuello de botella. Nuevamente, todo esto depende de tu aplicación, y debería ser muy útil para determinar qué áreas en tu registro de llamadas podrían requerir alguna refactorización.
Puedes ver los registros de tu aplicación en cualquier momento. Para ello, navega a Stackdriver Logging (como se muestra a continuación). Hay varios filtros disponibles, desde varios servicios de GCP → Tipos de registros → Nivel de registro → Fecha y mucho más.
En la siguiente captura de pantalla, se muestran los registros de nuestra aplicación de App Engine y la versión 1 predeterminada.
Por último, veamos una función que debería entusiasmarte por las posibilidades que ofrece. Por lo general, como desarrolladores, hacemos todo lo posible para incluir instrucciones de registro en nuestro código, implementarlo y, luego, esperar que el registro nos diga todo lo que queremos saber.
Pero sabemos que eso no es suficiente y solo durante la depuración nos damos cuenta de que tal vez deberíamos haber agregado algunas instrucciones de registro más aquí y allá. El flujo de trabajo habitual es modificar el código, agregar la instrucción de registro adicional, volver a implementar y supervisar.
Esto está bien, pero ¿qué pasaría si pudieras agregar estas instrucciones de registro (llamémoslas puntos de registro ahora) a tu aplicación en ejecución? Esto significa que no necesitamos detener la aplicación, cambiar el código y volver a implementarla. En cambio, podemos administrar nuestra lista de puntos de registro desde fuera de nuestra aplicación con la compatibilidad con puntos de registro.
Aún en Cloud Shell, verifiquemos la lista actual de puntos de registro que configuramos (que, obviamente, debería ser 0). Para ello, usa 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:
- Identifica el archivo de código fuente y el número de línea en el 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 guestbook.py en la línea 74 con el comando logpoints create, 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 el filename:linenumber
y el mensaje de registro anteriores. Ten en cuenta que nuestro mensaje de registro también contiene una expresión que imprimirá la cantidad de saludos que recuperamos del almacén de datos.
El comando vuelve con el mensaje de que se agregó el punto de registro. A continuación, se muestra una captura de pantalla de nuestro Cloud Shell:
Ahora, si ejecutas el comando de lista de puntos de registro, verás 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 esto en acción, 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. Recuerda que esto se registrará de forma predeterminada en nuestros registros de la aplicación. Por lo tanto, todo lo que debemos hacer es visitar Stackdriver Logging una vez más, como se muestra a continuación:
Haz clic en la solicitud específica y listo. En los detalles, verás que se activa nuestro punto de registro y se muestra el mensaje de registro.
Esperamos que hayas disfrutado este instructivo. Solo hace referencia a algunas de las funciones que ofrece la plataforma de Stackdriver. Hay mucho más por explorar. Visita el blog de Romin Irani (el autor original de este codelab) en https://rominirani.com/ para obtener más instructivos sobre Google Cloud Platform.
También puedes consultar este otro codelab llamado "Usa el registro y la supervisión de Stackdriver para obtener una mejor visibilidad del estado de tu aplicación".
Si tienes comentarios o quieres informar problemas con este codelab, usa el vínculo "Please find a bug" que se encuentra en la parte inferior izquierda de esta página.