Enviando notificações do Zabbix via API do Google Chat

Thiago Diniz
monitoracaodeti
Published in
7 min readJan 13, 2019

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.

O Hangouts Chat pode ser acessado através do endereço https://chat.google.com ou através do botão Google Apps no seu Gmail

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.

--

--