segunda-feira, 20 de fevereiro de 2012

Notificações do log4j através do Amazon SNS

Como desenvolvedores e devops muitas vezes precisamos ser notificados de erros que ocorrem nas aplicações para podermos resolvê-los com o mínimo de downtime e transtorno possível aos nosso clientes e usuários.

Estes "erros" (condições anormais de uso) são registrados no sistema através de loggers. Se você desenvolve software e não utiliza logging, então o problema é mais embaixo. Imagino que o seu código simplesmente deixa o stacktrace das exceções "estourar" na cara do usuário. Perdoe-me, mas você não é profissional. Você finge que programa, e o pior: há quem acredite.

A mais popular implementação de logging em Java é o log4j. Normalmente além do logging para arquivo ou console do log4j, alguns desenvolvedores utilizando o SMTPAppender para enviar e-mails de notificação quando algum WARN é registrado na aplicação.

Utilizar o SNS, serviço de notificações da Amazon, é uma alternativa mais eficiente do que enviar e-mails pois:
  • Permite o baixo acoplamento entre o emissor das notificações (o logger) e seus assinantes (possivelmente os e-mails dos desenvolvedores e devops).
  • Num ambiente com vários servidores rodando a mesma aplicação seria uma situação comum em caso de erro todas estas instâncias enviarem o mesmo e-mail, lotando a caixa de e-mail dos assinantes das notificações.

Pensando nisso resolvi criar uma biblioteca (enorme: 3 classes por enquanto) que permite utilizar o SNS como Appender do log4j: https://github.com/insula/log4j-sns

Entre outras benesses está o fato dele implementar um "quiet period" padrão de 15 minutos, evitando que você receba mais de uma notificação com o mesmo stacktrace dentro do intervalo de 15 minutos.

Num ambiente de cloud computing com múltiplas instâncias de uma mesma aplicação provavelmente você desejará implementar uma assinatura HTTP para lidar com notificações repetidas ao invés de ficar recebendo o mesmo e-mail de várias instâncias diferentes. Quem sabe não vale a pena criar um serviço e disponibilizá-lo online? Já vejo múltiplas situações em que isso seria útil.