Enviando notificações do Zabbix via API do Google Chat
Aviso de Atualização — Agosto de 2023
O Zabbix e o Hangouts Chat evoluíram… O Hangouts Chat agora é o Google Chat — parte da assinatura do Google Workspace — e o Zabbix passou a suportar o tipo de mídia “webhook”, eliminando a necessidade de utilizar scripts externos.
Se você utiliza Zabbix versão 5.0 ou superior, vá direto para o novo repositório:
https://github.com/thiagomdiniz/zabbix-google-chat-webhook
Neste artigo vou mostrar uma forma de o Zabbix enviar notificações para o Hangouts Chat através da API Google.
O Hangouts Chat está disponível apenas para usuários/empresas que são clientes G Suite.
Hangouts Chat é uma plataforma que ajuda equipes a colaborar de modo fácill e eficiente usando mensagens diretas e conversas em grupo. Neste artigo criaremos uma sala virtual dedicada para enviar notificações dos alarmes detectados pela ferramenta Zabbix. Além das conversas, o Chat simplifica o acompanhamento das tarefas/incidentes.
A API do Hangouts Chat permite a criação de bots e o uso de mensagens síncronas e assíncronas. Caso tenha interesse em conhecer o seu funcionamento e recursos, acesse a documentação.
Utilizaremos a forma mais simples de enviar mensagens através desta API: webhooks.
Criando a sala no Hangouts Chat
Clique no campo de busca para que o Chat exiba as opções e clique em “Criar sala”:
Dê um nome para a sala:
Com a sala criada, clique no nome da mesma e depois em “Configurar webhooks”:
Forneça um nome para o bot e, caso queira, a URL de uma imagem para o bot:
Ao clicar em salvar a API fornecerá o endereço do webhook criado. Copie e salve este endereço, pois é com ele que o Zabbix saberá para qual sala do Chat enviar as notificações:
Configurando os scripts de notificação
Antes que você pergunte: SIM! Os scripts estão no GitHub: https://github.com/thiagomdiniz/zabbix-google-chat
O ambiente que utilizei para montar este artigo foi um Raspberry Pi com Zabbix 4.0.0 compilado manualmente.
Primeiro é necessário identificar o diretório utilizado pelo seu Zabbix para executar os scripts de alerta (AlertScriptsPath). Você pode consultar o arquivo de configuração:
Ou, como foi meu caso, pegar o diretório padrão através da saída do comando “zabbix_server -h”:
Acesse o diretório “alertscripts” e faça o download dos arquivos necessários:
wget https://raw.githubusercontent.com/thiagomdiniz/zabbix-google-chat/master/google_chat.ini
wget https://raw.githubusercontent.com/thiagomdiniz/zabbix-google-chat/master/eventsthreads.json
wget https://raw.githubusercontent.com/thiagomdiniz/zabbix-google-chat/master/google_chat.py
chmod +x google_chat.py
chown zabbix google_chat.py google_chat.ini eventsthreads.json
Vamos entender pra que serve cada arquivo:
“google_chat.py”: é o script Python que será executado pelo Zabbix para realizar a notificação. Neste script você deve alterar a variável “INI_FILE” para o caminho correto do arquivo “google_chat.ini”. As outras três variáveis — “PROBLEM_IMG”, “ACK_IMG” e “RESOLVED_IMG” — são endereços de ícones para exibição no cabeçalho das mensagens enviadas (incidente, reconhecimento e resolução, respectivamente):
Observe nos comentários no início do script quais são as dependências, que podem ser instaladas via pip.
“google_chat.ini”: é o arquivo de configuração do script Python. Nele você deve colocar o endereço do seu Zabbix (host), o caminho completo do arquivo “eventsthreads.json” (datafile), que veremos a seguir e, na seção “[chat]”, colar o endereço do webhook gerado durante a criação da sala no Hangouts Chat:
“eventsthreads.json”: este arquivo inicialmente está vazio, pois será utilizado pelo script Python para relacionar o ID da trigger do Zabbix com a respectiva conversa no Hangouts Chat, agrupando numa mesma conversa as notificaçes de uma mesma trigger.
Como exemplo, o meu arquivo “google_chat.ini” ficou conforme imagem abaixo. Atente-se para o nome “TestRoom” no qual atribuí o endereço do webhook, pois este nome será utilizado no Zabbix para saber em qual webhook enviar as notificações (você pode adicionar quantos webhooks forem necessários):
Configurando o Zabbix
O primeiro passo é criar uma nova mídia do tipo script:
O segundo passo é criar um usuário para atrelarmos à sala criada no Chat. Digite uma senha forte para o usuário e o coloque no grupo sem acesso ao frontend:
O usuário deverá ser do tipo super admin:
Por fim adicione uma mídia do tipo “Google Chat Room”, criada anteriormente, definindo no campo “Send to” o nome dado ao webhook no arquivo “google_chat.ini”:
O terceiro passo é criar uma ação de triggers, que será responsável por disparar as notificações. Pode-se observar na imagem abaixo que adicionei uma condição para disparar a ação sempre que uma trigger de severidade igual ou maior que “warning” for acionada:
Na aba “Operations” você deve mudar o conteúdo do campo “Default message” para que possa ser interpretado pelo script Python:
0#{EVENT.TIME}#{EVENT.DATE}#{TRIGGER.NAME}#{HOST.NAME}#{TRIGGER.SEVERITY}#{EVENT.ID}#{TRIGGER.URL}#{TRIGGER.ID}#- {HOST.DESCRIPTION}
Também adicionei a operação para enviar mensagem para o usuário “google.chat.test” através da mídia “Google Chat Room”:
Na aba “Recovery operations” você deve mudar o conteúdo do campo “Default message” para que possa ser interpretado pelo script Python:
1#{EVENT.RECOVERY.TIME}#{EVENT.RECOVERY.DATE}#{TRIGGER.NAME}#{HOST.NAME}#{TRIGGER.SEVERITY}#{EVENT.ID}#{TRIGGER.URL}#{TRIGGER.ID}#- {HOST.DESCRIPTION}
Também adicionei a operação para notificar todos os envolvidos na ação, ou seja, o usuário “google.chat.test”:
Na aba “Update operations” você deve mudar o conteúdo do campo “Default message” para que possa ser interpretado pelo script Python:
2#{ACK.TIME}#{ACK.DATE}#{USER.FULLNAME}#{ACK.MESSAGE}#{EVENT.STATUS}#{EVENT.ID}#{TRIGGER.ID}
Também adicionei a operação para notificar todos os envolvidos na ação, ou seja, o usuário “google.chat.test”:
Validando o funcionamento
Podemos testar o script diretamente via linha de comando, executando o script “google_chat.py” com dois parâmetros: o nome da sala e a mensagem:
E ao verificar a sala no Chat podemos confirmar o recebimento da mensagem:
Agora vamos validar se o Zabbix está de fato conseguindo enviar as notificações. Para o teste forcei um problema de comunicação (ICMP) com o meu roteador. Podemos ver na coluna “Actions” que a ação foi disparada:
Confirmando no Chat o envio da notificação (imagem abaixo). Perceba que a mensagem é apresentada em formato de “card” e possue um botão para abrir o evento em questão no Zabbix:
Caso alguém reconheça o incidente no Zabbix, a ação enviará uma nova notificação na mesma conversa iniciada pela primeira notificação:
E quando o incidente for resolvido a ação enviará nova notificação agrupada na mesma conversa, informando a resolução do incidente no Zabbix. Perceba que, logo após a mensagem de reconhecimento, eu digitei um “OK” na conversa e a última mensagem foi inserida ne mesma conversa (logo abaixo da minha mensagem):
Ufa! Terminamos por aqui. Meu objetivo foi compartilhar um exemplo funcional de uso da API do Hangouts Chat e mostrar o nível de customização que o Zabbix permite. E foi só o começo, pois quem sabe no futuro eu consiga criar um bot que permita maior interação com os usuários, como agendar períodos de manutenção, etc.