Laboratorio de observabilidad: Prometheus y Grafana, con una regla de alerta que escribir

Este laboratorio da a cada alumno un pequeño servidor web que vigilar y las herramientas que lo vigilan: un exportador que convierte la página de estado del servidor en métricas, Prometheus que las recoge cada cinco segundos y Grafana, ya con la sesión iniciada y ya conectado a Prometheus. El alumno hace consultas en PromQL, dibuja un panel, escribe después una regla de alerta, rompe el servidor a propósito y ve cómo la alerta pasa de «pending» a «firing».

Lo hemos diseñado nosotros a partir de cuatro imágenes públicas, así que no hay nada vulnerable que atacar: solo un sistema que vigilar. No es un laboratorio de ataque. La copia del laboratorio no tiene ruta a internet ni a ningún otro alumno.

Qué aprenden los alumnos

Para qué sirve la monitorización y cómo encajan sus piezas: un programa que publica cifras, un exportador para el software que no las publica, un recolector que las lee con un temporizador y las guarda, y un panel que las dibuja. Hacen consultas en PromQL, como nginx_up y el ritmo de peticiones en un minuto, tanto en la página de Prometheus como con curl contra su API, y crean un panel de Grafana con la misma consulta. El centro del laboratorio es una regla de alerta: la escriben en un archivo de reglas, recargan Prometheus, la ven en la lista como inactiva, rompen el servidor y ven cómo la alerta pasa a «pending», luego a «firing», y se apaga cuando arreglan el servidor. Encaja en unidades de DevOps, operaciones, nube y sistemas; consulta la redacción exacta en la unidad de tu propio organismo certificador.

Ejecútalo en tu navegador

El servidor web es el servicio llamado app, su exportador es exporter, y el terminal del laboratorio llega a Prometheus como prometheus y a Grafana como grafana. Un comando docker del terminal puede mirar, entrar, detener, iniciar y reiniciar los servicios del laboratorio y leer sus registros: no puede crear, descargar ni eliminar nada. La configuración y las reglas de Prometheus, y los paneles de Grafana del alumno, están en volúmenes con nombre, así que siguen ahí cuando el laboratorio se detiene y se vuelve a iniciar. Las mediciones no se guardan, de modo que un laboratorio reiniciado empieza con la gráfica vacía.

  1. Abre la página Contenedor. Abre «Crear» en la barra y elige «Ejecutar un contenedor». Cualquiera puede abrir la página, y el laboratorio de Git y el de SQL se inician sin cuenta. Todos los demás laboratorios necesitan una cuenta gratuita: crea una, inicia sesión y pulsa «Iniciar».
  2. Busca el laboratorio. La tarjeta «Laboratorios de ejemplo» lista todos los ejemplos. Busca Observability: Prometheus and Grafana.
  3. Pulsa «Iniciar». «Iniciar» lo ejecuta tal cual, con una sola pulsación. «Editar el archivo primero» abre el archivo compose para que lo cambies antes de iniciarlo.
  4. Ábrelo. En la página del laboratorio, la barra del laboratorio tiene dos enlaces, Prometheus y Grafana, ya con la sesión iniciada y conectado a Prometheus. En Prometheus, ejecuta nginx_up. En el terminal junto al laboratorio, curl http://prometheus:9090/api/v1/query?query=nginx_up hace la misma pregunta. Para escribir una regla, ejecuta docker exec -it prometheus sh y crea un archivo que termine en .yml en /etc/prometheus/rules, recarga con curl -X POST http://prometheus:9090/-/reload, después docker stop app y mira la página Alerts. docker start app deja el servidor como estaba.

Qué pedir a los alumnos que entreguen

La propia regla, una captura de pantalla de ella disparada en la página Alerts de Prometheus y un panel de Grafana que muestre la misma señal. Para la comprensión, una o dos frases sobre lo que pregunta la regla, por qué espera diez segundos antes de dispararse y qué haría la persona de guardia al verla. Para un trabajo más exigente, pide una segunda regla sobre otra señal, como el ritmo de peticiones.

Nada se califica automáticamente. Conviene decir en voz alta los límites del laboratorio: la alerta se puede observar pero no avisa a nadie, porque no hay correo ni chat al que llegar.

Una lección básica en este laboratorio

Observability Basics es una lección breve hecha en este laboratorio, con cada paso explicado y un botón Ejecutar que escribe su comando en el terminal del alumno. Hace una pregunta a Prometheus, escribe una regla de alerta desde el terminal, detiene el servidor web y muestra cómo la alerta pasa a «pending» y luego a «firing», y lo vuelve a iniciar. Dibujar un panel queda para el alumno.

Una cuenta personal gratuita la recibe en el módulo Basics, que está en Inicio, cada centro puede copiarla de la carpeta Basics de la Biblioteca, y un centro nuevo la tiene en un módulo llamado Lab Basics (Sample). Es deliberadamente breve: muestra a un docente lo que es una lección hecha en un laboratorio, y el laboratorio hace el resto. Cópiala en un módulo propio para cambiarla.

El código en GitHub

El archivo compose ejecuta cuatro imágenes públicas, cada una fijada a una versión y usada sin modificar: nginx (BSD-2-Clause), el exportador de Prometheus de NGINX y Prometheus (ambos Apache-2.0) y Grafana (AGPL-3.0). Nosotros no distribuimos ninguna. La configuración de cada una la escribe su propio punto de entrada, y la de Prometheus solo se escribe en el primer inicio, así que lo que el alumno cambia no se vuelve a poner. La prueba del repositorio recorre el laboratorio como un alumno, con una regla que se dispara y una parada y un inicio, bajo los mismos límites que aplica la plataforma. El catálogo de complementos y la búsqueda de actualizaciones de Grafana están desactivados, porque el laboratorio no tiene salida a internet.

Asígnalo como trabajo

Indica en la tarea qué regla escribir y qué entregar.

  1. Crea el laboratorio. En tu módulo añade una tarea y elige la tarjeta «Laboratorio de contenedores», y después «En un repositorio de GitHub». Indica https://github.com/mitsurutech/lab-observability con la rama main. El archivo compose es el predeterminado, compose.yaml. Haz un fork del repositorio antes si quieres modificarlo.
  2. Publica y pruébalo. «Publicar» fija el commit que te mostraron, así que un cambio posterior en el repositorio no altera un laboratorio que ya has asignado. Inicia primero tu propia copia.
  3. Asígnalo. Asígnalo como cualquier tarea, con una fecha de entrega si quieres, e indica en la tarea qué hacer y qué entregar.
  4. Califica lo entregado. Abre la copia de un alumno y el trabajo que ha entregado, califícalo y devuélvelo con un motivo si necesita más.

Preguntas frecuentes

¿Puede una alerta enviar un correo o un mensaje?
No. El laboratorio no tiene salida a internet ni servicio de correo, así que una alerta se ve en la página Alerts y en la API pero no se envía a ninguna parte. Merece la pena decirlo a la clase: la regla es la parte que escribe el alumno, y el lugar al que se envía es otra pieza, Alertmanager, que este laboratorio no incluye.
¿Qué pasa si un alumno rompe la configuración de Prometheus?
El archivo se escribe una sola vez, en el primer inicio, y después es del alumno, así que un reinicio no lo vuelve a poner. Cuando una recarga falla, por ejemplo por un error en un archivo de reglas, el comando de recarga muestra el motivo y Prometheus conserva las reglas que tenía antes. Para volver al original, elimina el archivo .lab-seeded en /etc/prometheus y reinicia el servicio, o empieza una copia nueva.
¿El laboratorio de observabilidad califica la regla de alerta automáticamente?
No. Nada se califica automáticamente, así que pide a los alumnos que entreguen la regla, una captura de ella disparándose en la página Alerts de Prometheus y un panel de Grafana con la misma señal. Una frase sobre por qué la regla espera diez segundos antes de dispararse muestra si la han entendido.