Monitoreando nuestra app con health checks en Ruby on Rails 7

Los health checks son comprobaciones que se realizan periódicamente para asegurarnos de que una o más partes de nuestra aplicación estén funcionando correctamente. Son una pieza clave para monitorear la salud de nuestra app, ya que sirven para garantizar disponibilidad y rendimiento.

En este caso vamos a enfocarnos en health checks que comprueban que nuestra app está ejecutándose correctamente en el servidor. Por suerte para nosotros, Rails 7 incorporó una acción por defecto para monitorear nuestra app.

El monitoreo de nuestros proyectos podría (y debería 🙃) incluir comprobaciones de muchos elementos de nuestra app como servidor, base de datos, recursos externos, uso de memoria, logs y registros, etc. En este caso tomamos como punto de partida los health checks que comprueban que nuestra app está ejecutándose en el servidor y respondiendo solicitudes correctamente.

Antes de Rails 7

Necesitábamos crear una ruta y un controlador manualmente.

# config/routes.rb
get '/health_check', to: 'health_check#show'

# app/controllers/health_check_controller.rb
class HealthCheckController < ApplicationController
# Si algo falla, se captura la excepción y retorna un status code 503.
rescue_from(Exception) { render head: 503 }

def show
# Si todo va bien, retorna un status code 200.
render head: 200
end
end

Desde Rails 7 en adelante

Ahora, Rails trae por defecto un controlador HealthController con la acción #show que está mapeada a la ruta /up. Esto nos evita tener que crear controladores y rutas a mano, además de que promueve la adopción de convenciones que facilitan y mejoran nuestros proyectos. El código fuente puede revisarse aquí.

Monitoreando

De esta forma, alcanza con usar cualquier herramienta de monitoreo y configurarla para que haga una solicitud a nuestra_app.com/up.

Algunas herramientas de monitoreo populares son updown.iouptimerobot.com o freshping.io, entre otras.