Rails

Notificar excepciones de Rails en Slack

Cómo enterarte al instante cuando una app Rails falla en producción usando exception_notification y un Incoming WebHook de Slack.

BinniCloud Team

Sep 15, 2020 · 8 min read

Notificar excepciones de Rails en Slack

Tu equipo desarrolló una gran aplicación web en Rails. El release está listo, las pruebas pasaron y DevOps ya hizo el deploy. La app está online… y de pronto falla. “¡Pero todo funcionaba correctamente! Todas las pruebas pasaron sin inconvenientes.”

format_quote

¡Y debe ser para ya!

Project Manager, el día del incidente

Tarde o temprano hay que hacer debug en producción. Si tienes acceso al log, puedes ver qué pasó. Si no tienes acceso al servidor, el error tiene que llegar a ti. Aquí integramos las gemas exception_notification y slack-notifier para recibir el fallo en Slack.

Para este ejemplo se asume que ya tienes un workspace en Slack y un canal que recibirá las notificaciones de la app.

Crear un Incoming WebHook en Slack

  1. Entra a Incoming WebHooks.
  2. Selecciona tu workspace y pulsa “Add configuration”.
  3. Elige el canal donde quieres las notificaciones.
  4. Copia la Webhook URL: la vamos a pegar en Rails.

Añade las gemas

Edita el Gemfile y deja que Bundler instale las dependencias:

GemfileNode_ID: app-01
gem 'exception_notification'
gem 'slack-notifier'
terminalNode_ID: local-01
bundle install

Configurar production.rb

En config/environments/production.rb registra el middleware y sustituye la URL por la de tu WebHook:

config/environments/production.rbNode_ID: prod-01
Rails.application.config.middleware.use ExceptionNotification::Rack,
  slack: {
    webhook_url: ENV.fetch('SLACK_WEBHOOK_URL')
  }

Cuando ocurra una excepción, Slack recibirá la ruta, el controlador, la acción, el nombre de la excepción y el fragmento del log. Suficiente para apuntar al equipo hacia la solución sin entrar al servidor.

Hay herramientas más completas (monitoreo, APM). Para un aviso rápido e informal, esta pareja de gemas se configura en minutos y ya da señal cuando algo se rompe.