Ce que vous saurez
- RabbitMQ lui-même répond sur le port AMQP. Pas seulement qu’un programme écoute sur le port 5672 : Gryphon entame la poignée de main du protocole, et RabbitMQ répond en se nommant. Il ne faut ni utilisateur ni mot de passe, et cela fonctionne depuis l’extérieur ou par l’agent.
- Une file d’attente ne s’engorge pas. Un script demande à l’API de gestion combien de messages attendent. Au-delà d’un seuil, c’est un avertissement ; au-delà d’un autre, un problème.
- En option, qu’aucune alarme de mémoire ou de disque ne bloque les éditeurs. Voyez Variantes.
Ce que cette configuration ne peut pas vous dire : si les consommateurs traitent correctement les messages. Un consommateur qui accuse réception de chaque message puis le jette laisse la file vide et les chiffres en bon état.
Avant de commencer
- La machine RabbitMQ ajoutée comme hôte dans Gryphon.
- Pour la vérification de la file d’attente, l’agent Gryphon sur cette machine, le plugiciel de gestion activé (
rabbitmq-plugins enable rabbitmq_management) etcurl.
L’exemple surveille une file d’attente appelée orders dans l’hôte virtuel par défaut, /.
Étapes
1Vérifier que RabbitMQ répond
Ouvrez l’hôte, allez dans Services, choisissez Ajouter le service et sélectionnez TCP envoi/attente (agent). Si le port 5672 est ouvert sur Internet, TCP envoi/attente fait la même chose depuis l’extérieur, sans agent et sans le champ Hôte. Le fonctionnement d’envoi/attente explique le principe, si c’est nouveau pour vous.
- Nom
- RabbitMQ AMQP
- Hôte
- 127.0.0.1
- Port
- 5672
- TLS
- none
- Envoyer (facultatif)
- AMQP\x00\x00\x09\x01
- Attendre
- RabbitMQ
- Intervalle de vérification
- Fréquence 1 Minutes
Tapez la valeur Envoyer exactement comme elle est affichée, barres obliques inverses comprises. C’est l’en-tête de huit octets par lequel commence tout client AMQP 0-9-1. RabbitMQ répond par son propre message d’ouverture, qui nomme le serveur RabbitMQ. Un port qui accepte la connexion sans jamais donner cette réponse est un problème : cela repère un nœud encore en cours de démarrage ou figé, et tout autre programme qui aurait pris le port.
Gryphon raccroche dès qu’il a la réponse : chaque vérification laisse donc une ligne comme client unexpectedly closed TCP connection dans le journal de RabbitMQ, au niveau avertissement. C’est sans danger. Augmentez l’intervalle si ce bruit vous dérange.
2Créer un utilisateur qui peut seulement consulter
La vérification de la file d’attente lit l’API de gestion, qui exige un utilisateur. Donnez-lui l’étiquette monitoring et aucune permission de configurer, d’écrire ou de lire des messages. Il voit tout de même les chiffres de chaque file. add_user demande le mot de passe.
sudo rabbitmqctl add_user gryphon
sudo rabbitmqctl set_user_tags gryphon monitoring
sudo rabbitmqctl set_permissions -p / gryphon '^$' '^$' '^$'
3Donner le mot de passe à l’agent, et rien d’autre
Écrivez l’utilisateur et le mot de passe dans un fichier que seul root peut lire, au format de configuration de curl. systemd remet ensuite une copie à l’agent à chaque démarrage : le mot de passe n’apparaît ainsi jamais dans un script ni sur une ligne de commande.
user = "gryphon:the-password"
sudo chmod 600 /etc/gryphon/rabbitmq.curl
sudo install -d -o root -g root -m 0755 /etc/gryphon/scripts
[Service]
LoadCredential=rabbitmq:/etc/gryphon/rabbitmq.curl
GWC_SCRIPTS_DIR=/etc/gryphon/scripts
sudo systemctl restart gryphon-agent
4Ajouter le script de file d’attente
Enregistrez ceci sous /etc/gryphon/scripts/rabbitmq-queue et rendez-le exécutable avec sudo chmod 755 /etc/gryphon/scripts/rabbitmq-queue. Réglez la file et les deux seuils au début du fichier. Pour un autre hôte virtuel, écrivez son nom sous forme d’URL : / devient %2F.
#!/bin/sh
# How many messages are waiting in one RabbitMQ queue.
QUEUE=orders
VHOST=%2F # the vhost, written for a URL: %2F is the default, "/"
WARN=1000
CRIT=10000
body=$(curl -fsS -m 5 -K "$CREDENTIALS_DIRECTORY/rabbitmq" \
"http://127.0.0.1:15672/api/queues/$VHOST/$QUEUE?columns=messages" 2>&1) || {
echo "UNKNOWN: could not ask RabbitMQ about $QUEUE: $body"
exit 3
}
n=$(printf '%s' "$body" | sed -n 's/.*"messages":\([0-9]*\).*/\1/p')
if [ -z "$n" ]; then
echo "UNKNOWN: RabbitMQ has no message count for $QUEUE yet"
exit 3
fi
if [ "$n" -ge "$CRIT" ]; then
echo "CRITICAL: $n messages waiting in $QUEUE"
exit 2
fi
if [ "$n" -ge "$WARN" ]; then
echo "WARNING: $n messages waiting in $QUEUE"
exit 1
fi
echo "OK: $n messages waiting in $QUEUE"
Le code de sortie donne l’état : 0 en bon état, 1 avertissement, 2 problème, 3 inconnu. La première ligne affichée est le message. Une file qui n’existe pas, ou un mot de passe erroné, donne « inconnu » avec la raison fournie par curl. Si RabbitMQ est en panne, c’est la vérification de l’étape 1 qui le signale.
5Ajouter la vérification par script
- Nom
- file orders
- Script
- rabbitmq-queue
- Intervalle de vérification
- Fréquence 3 Minutes
Pour une autre file, copiez le script sous un autre nom, comme rabbitmq-queue-emails, et ajoutez une vérification pour celui-ci. Les scripts s’exécutent sans arguments : chaque file a donc son propre fichier.
Faire un essai
- Utilisez Vérifier maintenant sur les deux vérifications. Celle de la poignée de main indique que RabbitMQ a répondu. Celle du script indique combien de messages attendent.
- Mettez
WARN=0dans le script et vérifiez de nouveau. La vérification passe en avertissement. Remettez ensuite la valeur d’origine. - Sur une machine de test,
sudo rabbitmqctl stop_apparrête le broker et ferme le port, tandis que le nœud Erlang continue de tourner. En quelques minutes, la vérification de la poignée de main passe en problème et l’alerte part.sudo rabbitmqctl start_apple relance.
Variantes
Alarmes de mémoire et de disque
Quand RabbitMQ manque de mémoire ou d’espace disque, il déclenche une alarme et bloque tous les éditeurs. Le port répond toujours, et les files semblent calmes. L’API de gestion a une vérification de santé exactement pour ce cas : elle répond 200 normalement et 503 tant qu’une alarme est active. Enregistrez ceci sous rabbitmq-alarms à côté du script de file d’attente, et ajoutez une deuxième vérification Script (agent) pour celui-ci :
#!/bin/sh
# Whether RabbitMQ has raised a memory or disk alarm, which blocks publishers.
code=$(curl -sS -m 5 -K "$CREDENTIALS_DIRECTORY/rabbitmq" -o /dev/null -w '%{http_code}' \
http://127.0.0.1:15672/api/health/checks/alarms 2>&1)
case "$code" in
200) echo "OK: no alarms in effect"; exit 0 ;;
503) echo "CRITICAL: a memory or disk alarm is in effect, and publishers are blocked"; exit 2 ;;
esac
echo "UNKNOWN: the alarm check answered $code"
exit 3
TLS sur le port 5671
Pour un écouteur qui parle TLS dès le premier octet, réglez Port sur 5671 et TLS sur tls, ou sur tls-no-verify pour un certificat que vous avez créé vous-même. Les champs Envoyer et Attendre restent les mêmes. Surveillez l’expiration du certificat avec une vérification Certificat SSL sur le port 5671.
Une grappe
Donnez à chaque nœud sa propre vérification de poignée de main. Les chiffres des files viennent de toute la grappe, peu importe le nœud interrogé : un seul script de file d’attente suffit.