Implementación de un Health Check Endpoint en API con RSpec

Clase 6 de 33Curso de Creación de APIs con Ruby on Rails

Resumen

Implementa un health check endpoint en Rails con RSpec y TDD para asegurar servicios confiables y monitoreables. Aprenderás a validar el estado de tu API con pruebas de integración, a responder en JSON con status code 200 y a configurar rutas y controladores de forma clara y mantenible.

¿Qué es un health check endpoint y para qué sirve?

Un health check es un endpoint convencional como /health o /health_check que responde con 200 cuando el servicio está operativo. Es una buena práctica porque permite el monitoreo continuo por herramientas como Pingdom o Runscope mediante un request periódico. Además, se relaciona con páginas de estado públicas como las de Heroku, GitHub o Twitter, usadas para verificar si una aplicación está en buen estado.

  • Verificar disponibilidad del servicio con un request simple.
  • Integración con Pingdom y Runscope a través de /health.
  • Responder con 200 cuando todo está ok.
  • Alertar al equipo si hay error o no hay respuesta.

¿Cómo escribir pruebas de integración con RSpec para el health endpoint?

La estrategia es TDD: primero se escriben las pruebas, luego la funcionalidad. Crea el directorio spec/requests para pruebas de integración y un archivo health_spec.rb. Incluye rails_helper y declara el tipo request para disponer de helpers como response y have_http_status.

# spec/requests/health_spec.rb
require 'rails_helper'

RSpec.describe 'Health Endpoint', type: :request do
  describe 'GET /health' do
    before { get '/health' }

    it 'should return ok' do
      payload = JSON.parse(response.body)
      expect(payload).not_to be_empty
      expect(payload['api']).to eq('ok')
    end

    it 'should return status code 200' do
      expect(response).to have_http_status(:ok)
    end
  end
end
  • Pruebas de integración con type: :request para validar de extremo a extremo.
  • before ejecuta el request get '/health' antes de cada ejemplo.
  • response.body y JSON.parse para obtener el payload.
  • have_http_status(:ok) valida el status code 200 de forma expresiva.
  • Pruebas autodescriptivas con it 'should return ok' para claridad.

¿Qué errores comunes se observaron al correr RSpec?

Al ejecutar las pruebas primero fallan, lo esperado en TDD. Se mencionan errores típicos y su solución directa:

  • "Db schema rb doesn't exist yet": ejecutar rails db:migrate.
  • "La constante RSpec no está inicializada": usar RSpec con la S en mayúscula.
  • "No existe una ruta para /health": agregar la ruta y el controlador.

¿Cómo implementar el controlador y la ruta en Rails?

Crea health_controller.rb heredando de ApplicationController. Define la acción que responde con un payload mínimo y status 200 usando la constante de Rails :ok.

# app/controllers/health_controller.rb
class HealthController < ApplicationController
  def health
    render json: { api: 'ok' }, status: :ok
  end
end

Agrega la ruta para el endpoint /health apuntando a la acción health.

# config/routes.rb
Rails.application.routes.draw do
  get 'health', to: 'health#health'
end
  • render json: define el payload en JSON.
  • status: :ok traduce a 200 automáticamente.
  • Ruta GET /health conectada a health#health.

¿Qué incluye el payload del health check?

La idea es reflejar el estado de componentes clave. Se parte por el API: api: 'ok'. Este payload puede ampliarse para reportar otros servicios, por ejemplo, base de datos, manteniendo el formato legible y validable por pruebas de integración.

¿Tienes una variación de health check que uses en producción o más checks que te funcionen bien? Compártelo en los comentarios.

      Implementación de un Health Check Endpoint en API con RSpec