Como Monitorar o Status do Nó RabbitMQ e Conexões Usando `rabbitmqctl`

Este artigo fornece um guia abrangente para monitorar o status do nó RabbitMQ e conexões ativas usando o utilitário de linha de comando `rabbitmqctl`. Aprenda comandos essenciais para verificar a saúde do nó, inspecionar conexões, canais e consumidores, e interpretar suas saídas para garantir que seu sistema de mensageria RabbitMQ opere de forma otimizada e eficiente.

Como Monitorar o Status do Nó RabbitMQ e Conexões Usando rabbitmqctl

O RabbitMQ geralmente recebe atenção apenas depois que uma fila fica sobrecarregada, um consumidor para de reconhecer mensagens ou uma implantação cria centenas de conexões extras. O rabbitmqctl ainda é uma das maneiras mais rápidas de verificar o que o broker vê de dentro do nó. Ele não substituirá o Prometheus, a interface de gerenciamento ou a revisão de logs, mas fornece uma visão confiável da linha de comando quando você está em um servidor e precisa de respostas rapidamente.

Entendendo o rabbitmqctl

O script rabbitmqctl é a principal interface de linha de comando para interagir com um nó RabbitMQ. Ele permite que administradores realizem uma ampla gama de tarefas, desde iniciar e parar o broker até gerenciar usuários, permissões, exchanges, filas e, crucialmente para este artigo, monitorar o status operacional do nó e sua atividade de rede.

Verificando o Status do Nó RabbitMQ

Antes de mergulhar nas conexões, é essencial verificar se o seu nó RabbitMQ está ativo e funcionando. O comando status fornece uma visão geral abrangente do estado atual do nó.

O Comando rabbitmqctl status

Este comando gera uma riqueza de informações, incluindo:

  • Nome do Nó: O nome do nó RabbitMQ.
  • Aplicações em Execução: Lista as aplicações Erlang que estão em execução, sendo o próprio RabbitMQ um indicador chave.
  • Uso de Memória: Detalhes sobre alocação e uso de memória, vitais para ajuste de desempenho.
  • Espaço em Disco: Informações sobre o espaço em disco disponível, que pode impactar a persistência de mensagens.
  • Descritores de Arquivo: O número de descritores de arquivo abertos, um recurso importante do sistema.
  • Informações de Rede: Detalhes sobre interfaces de rede e portas.
  • Status do Cluster: Informações sobre se o nó faz parte de um cluster e sua conectividade.
  • Listeners: Portas nas quais o RabbitMQ está ouvindo para vários protocolos (AMQP, interface de gerenciamento, etc.).

Exemplo de Uso:

rabbitmqctl status

Interpretando a Saída: Procure por sinais de exaustão de recursos (alta memória, baixo espaço em disco, alto uso de descritores de arquivo) e confirme que aplicações essenciais como rabbit estão em execução. A seção listeners é crucial para garantir que o RabbitMQ esteja acessível nas portas esperadas.

Monitorando Conexões, Canais e Consumidores

Entender como os clientes estão interagindo com seu nó RabbitMQ é fundamental para solução de problemas e análise de desempenho. O rabbitmqctl fornece comandos para listar e inspecionar essas entidades.

Listando Conexões (rabbitmqctl list_connections)

Este comando exibe todas as conexões de clientes ativas com o nó RabbitMQ. Cada conexão representa uma aplicação cliente (produtor ou consumidor) que se conectou com sucesso.

Comando:

rabbitmqctl list_connections

Colunas de Saída (Comuns):

  • pid: O identificador do processo Erlang para a conexão.
  • node: O nó no qual a conexão está estabelecida.
  • name: O nome da conexão (muitas vezes reflete as propriedades do cliente).
  • port: A porta à qual o cliente se conectou.
  • host: O host do qual o cliente se conectou.
  • user: O nome de usuário usado para autenticação.
  • vhost: O host virtual ao qual a conexão está associada.
  • ssl: Indica se a conexão está usando SSL/TLS.
  • protocol: O protocolo usado (por exemplo, amqp0-9-1).

Exemplo:

rabbitmqctl list_connections name host port user vhost protocol

Isso permite que você veja quais usuários estão conectados, de onde e quais hosts virtuais estão usando.

Listando Canais (rabbitmqctl list_channels)

Cada conexão pode ter vários canais. Canais são conexões leves e multiplexadas sobre uma única conexão TCP, usadas para operações AMQP.

Comando:

rabbitmqctl list_channels

Colunas de Saída (Comuns):

  • connection: O pid da conexão pai.
  • node: O nó no qual o canal está.
  • channel_pid: O identificador do processo Erlang para o canal.
  • vhost: O host virtual ao qual o canal está associado.
  • name: O nome do canal (se definido pelo cliente).
  • consumer_count: O número de consumidores ativos neste canal.
  • messages_unacknowledged: O número de mensagens não reconhecidas neste canal.
  • messages_ready: O número de mensagens prontas para serem entregues neste canal.

Exemplo:

rabbitmqctl list_channels connection vhost consumer_count messages_ready messages_unacknowledged

Monitorar messages_unacknowledged e messages_ready é crucial para identificar gargalos potenciais onde os consumidores podem estar com dificuldades para acompanhar.

Listando Consumidores (rabbitmqctl list_consumers)

Consumidores são processos que se inscrevem em filas para receber e processar mensagens.

Comando:

rabbitmqctl list_consumers

Colunas de Saída (Comuns):

  • vhost: O host virtual no qual o consumidor está.
  • queue: O nome da fila à qual o consumidor está anexado.
  • consumer_tag: Um identificador único para o consumidor (definido pelo cliente).
  • delivery_tag: A tag de entrega da mensagem atual sendo processada.
  • redelivered: Se a mensagem foi reentregue.
  • message_count: O número de mensagens aguardando para serem entregues a este consumidor.
  • ack_required: Indica se os reconhecimentos são necessários para mensagens entregues a este consumidor.

Exemplo:

rabbitmqctl list_consumers vhost queue consumer_tag message_count ack_required

Este comando ajuda a entender quais filas têm consumidores ativos, quantas mensagens estão pendentes de entrega para eles e se os reconhecimentos estão configurados corretamente.

Inspecionando Componentes Específicos (Argumentos Opcionais)

A maioria dos comandos list_* aceita argumentos para especificar quais campos exibir, tornando a saída mais gerenciável. Você também pode filtrar e ordenar a saída usando utilitários de shell padrão como grep e sort.

Exemplo: Encontrando conexões de um usuário específico:

rabbitmqctl list_connections | grep 'my_user'

Exemplo: Mostrando apenas as filas com mensagens não reconhecidas:

rabbitmqctl list_channels | awk '$4 > 0 { print }'

Melhores Práticas para Monitoramento

  • Verificações Regulares: Implemente verificações regulares de rabbitmqctl status para identificar possíveis problemas antes que eles impactem a produção.
  • Automação: Considere automatizar essas verificações usando scripts e integrá-las com sistemas de monitoramento (por exemplo, Prometheus, Nagios) para alertas proativos.
  • Contexto é Fundamental: Entenda os valores típicos para o seu ambiente. Um pico repentino em mensagens não reconhecidas ou uma nova conexão inesperada merece investigação.
  • Combine com a Interface de Gerenciamento: Embora o rabbitmqctl seja poderoso para scripts e acesso direto, a Interface de Gerenciamento do RabbitMQ fornece uma maneira visual e interativa de monitorar as mesmas informações.
  • Monitoramento de Recursos: Sempre correlacione a saída do rabbitmqctl com o monitoramento de recursos em nível de sistema (CPU, RAM, I/O de Disco) para uma imagem completa.

Um Fluxo de Triagem Útil Quando as Filas Ficam Sobrecarregadas

Quando uma fila começa a crescer, não comece reiniciando o RabbitMQ. Uma reinicialização pode tornar a recuperação mais lenta e pode esconder as evidências de que você precisa. Comece respondendo a quatro perguntas.

Primeiro, o nó está saudável o suficiente para atender aos clientes?

rabbitmqctl status

Observe os alarmes de memória, alarmes de disco, uso de descritores de arquivo e listeners. O RabbitMQ possui mecanismos de segurança de espaço livre em disco e memória. Se um nó entrar em estado de alarme, os publicadores podem ser bloqueados. Isso pode parecer um problema de aplicação do lado de fora, mesmo que o broker esteja se protegendo.

Segundo, os consumidores estão conectados?

rabbitmqctl list_consumers vhost queue consumer_tag ack_required active

Se uma fila não tem consumidores, a profundidade da fila não é um problema de desempenho do RabbitMQ. A aplicação que deveria consumir da fila está inativa, mal configurada, conectada ao host virtual errado ou consumindo de um nome de fila diferente do que o publicador usa.

Terceiro, os consumidores estão recebendo mensagens, mas não as reconhecendo?

rabbitmqctl list_queues name messages_ready messages_unacknowledged consumers

messages_ready significa que as mensagens estão esperando na fila. messages_unacknowledged significa que as mensagens foram entregues aos consumidores, mas ainda não foram confirmadas. Uma alta contagem de não reconhecidas geralmente aponta para handlers lentos, chamadas longas de banco de dados dentro dos consumidores, um valor de prefetch muito alto ou consumidores que falharam após receber mensagens.

Quarto, há muitas conexões ou canais?

rabbitmqctl list_connections name user host state channels send_pend recv_cnt send_cnt
rabbitmqctl list_channels connection number consumer_count messages_unacknowledged prefetch_count

Clientes saudáveis geralmente reutilizam conexões e abrem um número controlado de canais. Se cada requisição abre uma nova conexão, o broker pode gastar muito tempo com a rotatividade de conexões. Se uma única conexão tem um número muito grande de canais, inspecione o comportamento da biblioteca do cliente e o tamanho da implantação.

Interpretando Estados de Conexão

list_connections é mais útil quando você solicita colunas específicas. Um comando compacto é mais fácil de escanear durante um incidente:

rabbitmqctl list_connections name user host state channels protocol ssl

A coluna state ajuda a separar o tráfego normal do comportamento suspeito. Uma conexão no estado running está ativa. Um grande número de conexões presas em controle de fluxo ou estados bloqueados merece atenção. Se ssl for falso onde você espera TLS, você pode ter clientes usando o listener errado ou configuração antiga.

Nomes de clientes também valem a pena serem definidos no código da aplicação. Muitas bibliotecas de cliente RabbitMQ permitem que você defina um nome de conexão. Sem isso, você pode ver apenas detalhes de host e porta, o que dificulta a identificação do serviço que está causando a carga. Um nome como billing-worker-prod-3 é muito mais útil do que uma conexão TCP anônima.

Problemas de Canal e Prefetch

Canais são baratos em comparação com conexões TCP, mas não são gratuitos. Um problema comum de produção é um processo worker que cria canais e nunca os fecha. Outro é um consumidor com um valor de prefetch alto que recebe muitas mensagens, as processa lentamente e deixa outros consumidores ociosos.

Use:

rabbitmqctl list_channels connection number consumer_count messages_unacknowledged prefetch_count

Se um canal tem uma grande contagem de messages_unacknowledged, inspecione esse consumidor. Talvez ele esteja fazendo chamadas HTTP lentas, esperando em um bloqueio de banco de dados ou processando mensagens uma de cada vez enquanto o prefetch permite que ele reserve muito mais. Reduzir o prefetch pode melhorar a justiça, mas não é uma correção mágica de desempenho. Se os handlers são lentos, você ainda precisa corrigir o handler.

Verificações de Fila Que Pertencem ao Lado das Verificações de Conexão

Embora este artigo se concentre no status do nó e nas conexões, o estado da fila completa o quadro:

rabbitmqctl list_queues name durable auto_delete messages messages_ready messages_unacknowledged consumers memory state

Uma fila durável com mensagens persistentes pode pressionar o disco. Uma fila com consumers definido como 0 precisa de uma verificação de aplicação. Uma fila com muitas mensagens prontas e consumidores ativos aponta para uma incompatibilidade de throughput. Uma fila com muitas mensagens não reconhecidas aponta para processamento ou comportamento de reconhecimento do lado do consumidor.

Ao usar filtros de shell, tome cuidado com as posições das colunas. Se você alterar os campos solicitados, snippets antigos de awk podem filtrar silenciosamente a coluna errada. Para verificações repetíveis, prefira scripts que solicitem campos fixos e rotulem sua saída.

Notas sobre Cluster

Em um cluster, execute comandos contra o nó que você se importa ou especifique o nó onde suportado:

rabbitmqctl -n rabbit@node1 status

Verifique a associação ao cluster e partições:

rabbitmqctl cluster_status

Partições de rede e desacordo entre nós podem criar sintomas confusos: clientes se conectam com sucesso a um nó enquanto filas ou metadados estão não saudáveis em outro lugar. Se um problema afeta apenas uma zona de disponibilidade ou um host broker, compare status, list_connections e list_queues entre os nós antes de alterar as configurações de todo o cluster.

O Que Automatizar

Para um ambiente pequeno, algumas verificações com script podem capturar os problemas óbvios: nó inativo, alarme de disco, alarme de memória, nenhum consumidor em filas importantes, mensagens prontas acima de um limite normal, mensagens não reconhecidas que continuam subindo e contagem de conexão muito acima da linha de base.

Para sistemas maiores, use o plugin Prometheus do RabbitMQ ou outro pipeline de métricas e mantenha o rabbitmqctl para investigação direta. Os alertas devem estar vinculados ao comportamento que os usuários se importam. Uma fila subindo brevemente durante um trabalho em lote pode ser normal. Uma fila subindo por quinze minutos enquanto os consumidores estão conectados e as mensagens não reconhecidas também estão subindo é um alerta melhor.

Hábitos Operacionais Que Economizam Tempo

Execute o rabbitmqctl como o usuário correto do SO ou através da conta de serviço que sua instalação espera. Problemas de permissão podem parecer problemas de broker quando você está com pressa. Se o comando não conseguir contatar o nó, verifique o nome do nó, o cookie Erlang e se o serviço RabbitMQ está realmente em execução naquele host.

Mantenha uma pequena lista de filas importantes e seus consumidores esperados. Durante um incidente, "fila tem zero consumidores" só é útil se você sabe se essa fila deve sempre ter consumidores. Algumas filas de atraso, dead-letter ou lote são esperadas para ficar ociosas por longos períodos.

Finalmente, não limpe filas apenas para deixar os painéis verdes. Purgar uma fila é perda de dados, a menos que as mensagens sejam descartáveis por design. Se as mensagens estão presas, primeiro descubra se elas estão esperando, não reconhecidas, rejeitadas, dead-lettered ou bloqueadas por um consumidor ausente.

rabbitmqctl status, list_connections, list_channels, list_consumers e list_queues fornecem um caminho prático de linha de comando de "mensagens estão atrasadas" para uma causa provável. O truque é lê-los juntos: recursos do nó, conexões de clientes, comportamento de canal, presença de consumidor e profundidade da fila contam diferentes partes da mesma história.