Monitorando Webhooks do WhatsApp com Grafana e Baileys

11 min de leitura Monitoramento
Monitorando Webhooks do WhatsApp com Grafana e Baileys

Implementar uma solução de automação WhatsApp self-hosted é um dos desafios mais populares entre desenvolvedores e administradores de sistemas que buscam controle total sobre seus dados e custos operacionais. No entanto, a complexidade não reside apenas na conexão com a API do WhatsApp, mas sim em garantir que o fluxo de dados seja estável, rastreável e monitorável. Este tutorial demonstra como configurar um pipeline de monitoramento robusto utilizando **Grafana**, integrando logs e métricas de bibliotecas populares como **Baileys**, plataformas no-code como **Typebot** ou **Chatwoot**, e focando na integridade dos seus **webhooks whatsapp**.

A ideia central não é apenas "ver" se o bot está online, mas entender a latência das mensagens, identificar falhas de conexão em tempo real e correlacionar eventos do sistema com as interações dos usuários finais. Vamos construir uma arquitetura onde o Grafana atua como a única fonte da verdade para sua infraestrutura de chatbots IA.

1. Arquitetura do Monitoramento

Antes de tocar em qualquer configuração, é crucial entender como os dados fluirão. Em ambientes self-hosted, a maioria das bibliotecas Node.js (como Baileys) ou servidores web (Nginx/Apache rodando Typebot/Chatwoot) gera logs textuais brutos ou métricas expostas via endpoints HTTP. O Grafana precisa consumir esses dados.

Nossa stack será composta por:

  • Fonte de Dados: Logs do aplicativo (Baileys/Node.js) e métricas de saúde do servidor.
  • Ingestor: Promtail ou Filebeat para coletar logs, ou Node Exporter para métricas de sistema.
  • Storage: Loki (para logs) e Prometheus (para métricas numéricas).
  • Visualização: Grafana Dashboards personalizados.

Para este tutorial, focaremos na integração mais crítica: o monitoramento de webhooks whatsapp através dos logs gerados pelo seu serviço de automação. Isso permite que você veja exatamente quando uma mensagem chega, é processada e enviada para o seu sistema de destino (como Typebot ou um endpoint customizado).

2. Preparando o Ambiente e Coletando Logs

A maioria das aplicações Node.js usadas em automação de WhatsApp imprime logs no stdout (console). Para que o Grafana leia esses logs, precisamos estruturá-los ou usar um parser eficiente. Se você estiver usando Docker, o ideal é redirecionar os logs para arquivos rotativos ou utilizar o driver de log json-file do Docker, que é facilmente consumido pelo Promtail.

Supondo que seu serviço de automação (seja ele um script Baileys customizado ou um container Typebot) esteja rodando em um servidor Linux, vamos instalar e configurar o Promtail, o agente do Grafana Labs projetado para enviar logs ao Loki.

Crie um diretório para a configuração:

sudo mkdir -p /etc/promtail/config
cd /etc/promtail/config

Agora, crie o arquivo promtail.yaml. Este arquivo define onde estão os logs e como eles devem ser interpretados. Para monitorar webhooks, precisamos capturar as requisições POST que chegam ao seu servidor.

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://localhost:3100/loki/api/v1/push

scrape_configs:
  - job_name: whatsapp-webhooks
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          __path__: /var/log/whatsapp-bot/*.log
          env: production

Neste exemplo, assumimos que seus logs de automação estão sendo escritos em /var/log/whatsapp-bot/. Ajuste o caminho conforme sua estrutura de diretórios. Se estiver usando Docker, você pode apontar para os logs do container:

__path__: /var/lib/docker/containers/*/*.log

Inicie o serviço Promtail e verifique se ele consegue ler os arquivos. Você pode testar a conexão com o Loki usando curl:

curl -X POST http://localhost:3100/loki/api/v1/push -d '{
  "streams": [{
    "stream": {
      "job": "test"
    },
    "entries": [{
      "ts": "2023-10-27T10:00:00.000Z",
      "line": "Test message from Promtail"
    }]
  }]
}'

3. Configuração do Grafana e Adição de Fontes

Acesse sua instância do Grafana via navegador (geralmente na porta 3000). Vá em Connections > Data Sources e adicione duas fontes principais:

  1. Loki: Use a URL http://localhost:3100. Isso permitirá consultar seus logs de webhook.
  2. Prometheus: Use a URL http://localhost:9090. Essencial para métricas de infraestrutura (CPU, Memória) e contadores de requisições HTTP se você estiver usando bibliotecas que expõem métricas nativas.

Com as fontes conectadas, podemos começar a construir a visualização. O segredo para monitorar webhooks whatsapp eficientemente é extrair informações estruturadas dos logs textuais.

4. Criando Queries com LogQL para Webhooks

O Grafana usa LogQL para buscar logs, uma linguagem poderosa similar ao PromQL. Vamos criar um painel simples para visualizar o tráfego de mensagens em tempo real.

Crie um novo Dashboard e adicione um painel do tipo Logs. Na barra de query, insira:

{job="varlogs"}

Isso mostrará todos os logs. Para filtrar apenas eventos relevantes à automação, podemos usar expressões regulares. Suponha que seu script Baileys ou Typebot registre uma mensagem recebida assim:

[INFO] 2023-10-27T10:05:00Z Received message from +5511999999999: Hello Bot

Filtre por essa estrutura usando a função |~:

{job="varlogs"} |~ "Received message from"

Para melhorar a legibilidade, extraia o número do telefone e o tempo de resposta. Use a função | json se seus logs estiverem em formato JSON, ou | regexp para logs estruturados manualmente.

{job="varlogs"} |~ "Received message from" | line_format "{{.line}}"

Agora, vamos adicionar um painel de Stat ou Time Series para contar quantas mensagens foram processadas. Para isso, precisamos transformar logs em métricas. Isso pode ser feito no lado do Promtail usando pipelines de transformação.

5. Transformando Logs em Métricas com Promtail Pipelines

Para ter gráficos precisos de "Mensagens Recebidas por Minuto" ou "Erros de Webhook", precisamos que o Promtail conte esses eventos e os envie para o Prometheus (ou use o recurso de métricas do Loki, se disponível na sua versão). A maneira mais robusta é usar um pipeline no Promtail para extrair contadores.

Edite o promtail.yaml e adicione uma etapa de pipeline:

scrape_configs:
  - job_name: whatsapp-webhooks
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          __path__: /var/log/whatsapp-bot/*.log
    pipeline_stages:
      - match:
          selector: '{job="varlogs"}'
          filter:
            logfmt:
              level: "level"
      - metrics:
          prometheus_statistics: false
          counters:
            - name: whatsapp_messages_total
              help: "Total messages received via WhatsApp webhook"
              action: increment
              match_inc:
                regexp:
                  source: "message_status"
                  target: "status"
                  regex: '^(Received|Sent)$'

Este exemplo é conceitual. A prática mais comum em ambientes Node.js é usar a biblioteca prom-client diretamente na aplicação para expor métricas no endpoint /metrics, e deixar o Promtail apenas coletar logs de erro.

Recomendação Técnica: Se você está desenvolvendo seu próprio bot com Baileys, integre a biblioteca prom-client. Isso permite que o Grafana puxe métricas nativas (como tempo de resposta do hook) diretamente do Prometheus, sem a sobrecarga de parsing de logs.

// Exemplo simples em Node.js
import promClient from 'prom-client';

const httpRequestDurationMicroseconds = new promClient.Histogram({
  name: 'http_request_duration_seconds',
  help: 'Duration of HTTP requests in seconds',
  labelNames: ['method', 'route', 'status_code'],
});

app.use((req, res, next) => {
  const start = Date.now();
  res.on('finish', () => {
    const duration = (Date.now() - start) / 1000;
    httpRequestDurationMicroseconds.labels({
      method: req.method,
      route: req.route?.path || req.url,
      status_code: res.statusCode,
    }).observe(duration);
  });
  next();
});

Com isso, no Grafana, você pode criar um gráfico usando a query Prometheus:

rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])

6. Monitorando Integrações com Typebot e Chatwoot

Quando seu WhatsApp se integra ao Typebot ou Chatwoot, a complexidade aumenta porque há dois endpoints envolvidos: o recebimento do webhook pelo seu servidor e o envio para a plataforma de IA.

Monitorando Latência entre Sistemas

Um problema comum é a latência introduzida pela cadeia de chamadas. Se o usuário envia uma mensagem e o bot responde após 10 segundos, mas o processamento no Typebot leva apenas 2 segundos, o gargalo está na sua camada de integração.

No Grafana, crie um painel com dois gráficos sobrepostos:

  1. Latência do Endpoint WhatsApp: Query Prometheus para http_request_duration_seconds filtrando pela rota do seu webhook local.
  2. Status de Saúde do Typebot/Chatwoot: Se sua plataforma de destino oferece API de status ou healthcheck, monitore a resposta HTTP 200 vs 500.

Use alertas no Grafana. Configure uma regra de alerta que dispare se o p95 (percentil 95) da latência do seu webhook exceder 3 segundos por mais de 5 minutos. Isso garante que problemas na integração com IA sejam detectados antes que impactem a experiência do usuário final.

7. Dashboards Essenciais para Automação

Para manter sua operação organizada, foque em três visões principais no seu Grafana:

A. Visão de Saúde da Conexão (Baileys/Socket)

Monitore os logs do estado do WebSocket. Procure por strings como connectionClose, reconnecting ou open.

{job="varlogs"} |~ "connectionStatus"

Crie um painel de Logs com cores condicionais: vermelho para falhas, verde para conexão estável. Isso permite identificar rapidamente se o serviço do WhatsApp caiu.

B. Visão de Volume e Erros

Um gráfico de barras mostrando a contagem de mensagens enviadas vs. recebidas por hora. Utilize contadores do Prometheus ou agregações no Loki:

count_over_time({job="varlogs"} |= "Sent message" [1h])

Sobreponha isso com logs de erro:

{job="varlogs"} |= "error"

C. Visão de Infraestrutura (System)

Não esqueça o servidor que hospeda tudo. Use o Node Exporter com o Prometheus para monitorar uso de CPU e Memória RAM. Scripts de automação em Node.js podem vazar memória se não gerenciados corretamente, especialmente ao lidar com mídia (imagens/áudios) via Baileys.

Crie um alerta se o uso de memória superar 80% por 10 minutos. Isso pode indicar a necessidade de reiniciar o container ou otimizar o código de processamento de mídia.

8. Boas Práticas e Otimizações

Ao implementar esse monitoramento, considere as seguintes práticas para manter a eficácia:

  • Rotacione Logs Adequadamente: Use logrotate no Linux para garantir que os arquivos de log não ocupem todo o disco. O Promtail lida bem com arquivos rotacionados, mas o sistema operacional precisa gerenciar o espaço.
  • Separe Ambientes: Use labels diferentes no Promtail para env: staging e env: production. Isso evita que testes no Typebot ou desenvolvimento local poluam seus dashboards de produção.
  • Correlação de IDs: Se possível, adicione um campo message_id único em seus logs. Isso permite rastrear uma mensagem específica desde a chegada no WhatsApp até o processamento final na IA, facilitando debugging de erros complexos.

Conclusão

Monitorar webhooks do WhatsApp com Grafana transforma uma caixa preta em um sistema observável e confiável. Ao combinar logs estruturados do seu serviço de automação (seja ele Baileys, Typebot ou Chatwoot) com métricas de infraestrutura, você ganha a visibilidade necessária para escalar suas integrações.

Lembre-se: a automação não é apenas sobre enviar mensagens; é sobre garantir que o canal esteja sempre aberto e responsivo. Com a configuração acima, sua equipe de TI terá os dados necessários para agir proativamente, reduzindo o tempo de inatividade e melhorando a qualidade dos chatbots IA implantados.

Implemente passo a passo, valide as queries no painel de explore do Grafana antes de salvar os dashboards, e ajuste os alertas conforme a carga real do seu tráfego. A infraestrutura está pronta para receber o próximo nível de automação.

Compartilhar: Link copiado!
Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000