Passer au contenu

Surveiller MongoDB

Vérifiez le port, puis faites demander par l’agent au serveur lui-même s’il répond et si son jeu de réplicas a un primaire.

Vérifications que vous ajouterez
Port TCP Port TCP (agent) Script (agent)
L’agent
Agent facultatif
Écrit pour
Linux

Ce que vous saurez

  • MongoDB accepte les connexions. Une vérification de port, envoyée depuis l’intérieur de votre réseau par l’agent, ou depuis l’extérieur si le port est ouvert sur Internet.
  • Le serveur répond, et son replica set a un primaire. Un script interroge MongoDB lui-même. Sans primaire, les écritures échouent, et c’est un problème. Un membre qui n’est ni primaire ni secondaire, par exemple parce qu’il est encore en récupération, est un avertissement.

Le script utilise la commande hello de MongoDB, à laquelle tout serveur répond avant toute authentification. Il ne faut donc ni utilisateur MongoDB ni mot de passe, même avec le contrôle d’accès activé.

Ce que cette configuration ne peut pas vous dire : le retard d’un secondaire, ni la lenteur des requêtes. Il faudrait pour cela un utilisateur ayant le rôle clusterMonitor, ce qui dépasse ce que ce guide met en place. Pour les sauvegardes, voyez S’assurer que la sauvegarde de la nuit dernière a bien eu lieu. Cela fonctionne de la même façon avec mongodump.

Avant de commencer

  • La machine MongoDB ajoutée comme hôte dans Gryphon, et l’agent Gryphon installé dessus.
  • mongosh, le shell de MongoDB, sur la même machine. Il est fourni avec les paquets de MongoDB, ou séparément sous le nom mongodb-mongosh.

L’exemple suppose que MongoDB écoute sur 127.0.0.1:27017.

Étapes

1Vérifier le port

Ouvrez l’hôte, allez dans Services, choisissez Ajouter le service et sélectionnez Port TCP (agent).

Ajouter : Port TCP (agent) Services → Ajouter le service
Nom
MongoDB
Hôte
127.0.0.1
Port
27017
Intervalle de vérification
Fréquence 1 Minutes

Port TCP fait la même chose depuis l’extérieur, sans agent, mais seulement si le port 27017 est ouvert sur Internet. Il ne devrait presque jamais l’être.

2Activer les vérifications par script

L’agent n’exécute que les programmes d’un dossier que vous désignez, et ce dossier doit appartenir à root sans que personne d’autre puisse y écrire :

Dans un terminal
sudo install -d -o root -g root -m 0755 /etc/gryphon/scripts
/etc/gryphon/agent.env
GWC_SCRIPTS_DIR=/etc/gryphon/scripts
Ensuite
sudo systemctl restart gryphon-agent

3Ajouter le script

Enregistrez ceci sous /etc/gryphon/scripts/mongodb-state et rendez-le exécutable avec sudo chmod 755 /etc/gryphon/scripts/mongodb-state.

/etc/gryphon/scripts/mongodb-state
#!/bin/sh
# Whether MongoDB answers, and whether its replica set has a primary.
# Asks with "hello", which every MongoDB answers before anyone signs in.
export MONGO_URI="mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=4000"
export HOME=/tmp    # mongosh keeps a log in the home directory; the agent has none

exec mongosh --nodb --quiet --norc --eval '
try {
    const h = connect(process.env.MONGO_URI).hello();
    if (!h.setName) {
        print("OK: MongoDB answers (standalone)");
        quit(0);
    }
    const role = h.isWritablePrimary ? "primary" : h.secondary ? "secondary" : "neither primary nor secondary";
    if (!h.primary) {
        print("CRITICAL: replica set " + h.setName + " has no primary; this member is " + role);
        quit(2);
    }
    if (!h.isWritablePrimary && !h.secondary) {
        print("WARNING: this member of " + h.setName + " is " + role + "; the primary is " + h.primary);
        quit(1);
    }
    print("OK: " + h.setName + " primary is " + h.primary + "; this member is " + role);
    quit(0);
} catch (e) {
    print("CRITICAL: MongoDB did not answer: " + e.message);
    quit(2);
}'

Le code de sortie donne l’état : 0 en bon état, 1 avertissement, 2 problème. La première ligne affichée est le message que vous verrez dans Gryphon et dans l’alerte. L’agent exécute les scripts sous son propre utilisateur, sans dossier personnel. Sans la ligne HOME, la plainte de mongosh à ce sujet deviendrait le message.

Exécutez-le comme le fait l’agent, pour le voir fonctionner :

Dans un terminal
sudo systemd-run --pipe --wait -q -p DynamicUser=yes -p PrivateTmp=yes /etc/gryphon/scripts/mongodb-state

4Ajouter la vérification par script

Ajouter : Script (agent) Services → Ajouter le service
Nom
Replica set MongoDB
Script
mongodb-state
Intervalle de vérification
Fréquence 1 Minutes

Dans un replica set, installez l’agent et le script sur chaque membre, et ajoutez les deux vérifications à l’hôte de chaque membre. Chaque membre rapporte son propre point de vue : s’il répond, son propre rôle, et s’il voit un primaire.

Faire un essai

  1. Utilisez Vérifier maintenant sur la vérification par script. Dans un replica set, le message nomme le replica set, son primaire et le rôle de ce membre.
  2. Sur une machine de test, arrêtez MongoDB avec sudo systemctl stop mongod. Les deux vérifications passent en problème en quelques minutes, et l’alerte part. Le message du script indique que MongoDB n’a pas répondu.
  3. Redémarrez-le. Les deux vérifications se rétablissent, et le rétablissement est annoncé comme pour toute autre vérification.

Variantes

Un serveur qui exige TLS

Ajoutez les options TLS de MongoDB à l’adresse dans le script, par exemple &tls=true&tlsCAFile=/etc/gryphon/mongodb-ca.pem, avec une copie de l’autorité de certification que l’agent peut lire. La commande hello n’a toujours besoin d’aucun utilisateur.

Une autre adresse ou un autre port

Modifiez 127.0.0.1:27017 dans MONGO_URI. Gardez directConnection=true : le script ne parle ainsi qu’à ce membre, et la réponse reflète le point de vue de ce membre.

Dans Docker

Si MongoDB est un conteneur sur la machine de l’agent, ajoutez aussi une vérification Docker : conteneur. Elle repère un conteneur qui a planté ou qui redémarre sans cesse. Le script s’exécute tout de même sur la machine elle-même, pointé vers le port que le conteneur publie : mongosh doit donc y être installé.

Ce n’est pas ce que vous exploitez ? Parcourez tous les guides, ou dites-nous ce que vous devez surveiller et nous rédigerons le guide.

Quatorze jours gratuits. Puis à partir de $4.99 par mois.

L’agent, le tableau de bord, les applications et toutes les vérifications sauf les cinq pour Kubernetes font partie de chaque forfait. Les forfaits diffèrent par la quantité que vous surveillez, la fréquence, la provenance des vérifications, et le nombre de personnes et de pages d’état qu’ils comprennent. Comparer les forfaits. Annulez quand vous voulez.