Requêtes en base

Healthcheck

1) Connexion à la BDD

Connexion en ligne de commande :

# mongo canopsis -u cpsmongo -p MOT_DE_PASSE --host XXXX
MongoDB shell version v3.4.13
MongoDB server version: 3.4.13
rs0:PRIMARY> 

Ou sinon, avec Robo3T (anciennement RoboMongo). Dans Robo3T, les requêtes doivent être validées avec Ctrl + Entrée afin d'être exécutées.

Attention : MongoDB, et plus particulièrement Robo3T, sont sensibles à la véritable casse du hostname des nœuds MongoDB.

2) Identifier un évènement suivant le nom de son composant, sa ressource et son statut.

Rappels

Pour comprendre le fonctionnement interne de Canopsis, il est important de comprendre le modèle de données associé.
Pour rappel, les entités sont stockées dans la collection default_entities tandis que les alarmes sont stockées dans periodical_alarm.

Prenons l'exemple de l'entité suivante :

  • component : NOM_MACHINE
  • resource : Traffic - eth0
  • connector : centreon
  • connector_name : NOM_CONN

Pour rechercher cette entité en base de données, vous pouvez exécuter la requête suivante :

db.default_entities.find({"_id": "Traffic - eth0/NOM_MACHINE"}).pretty()
{
        "_id" : "Traffic - eth0/NOM_MACHINE",
        "name" : "Traffic - eth0",
        "impact" : [
                "NOM_MACHINE"
        ],
        "depends" : [
                "centreon/NOM_CONN"
        ],
        "enable_history" : [
                NumberLong(1527085105)
        ],
        "measurements" : null,
        "enabled" : true,
        "infos" : {
                "hostgroups" : {
                        "name" : "hostgroups",
                        "description" : "",
                        "value" : "XXXX"
                },
                "component_alias" : {
                        "name" : "component_alias",
                        "description" : "",
                        "value" : "XXXX"
                }
        },
        "type" : "resource"
}

Recherche

Si vous souhaitez rechercher les alarmes associées à cette entité, il faut requêter la collection periodical_alarm.

db.periodical_alarm.find({"v.component" : "NOM_MACHINE", "v.resource" : "Traffic - eth0"}).pretty()
{
        "_id" : "XXXX",
        "t" : NumberLong(1524667917),
        "d" : "Traffic - eth0/NOM_MACHINE",
        "v" : {
                "state" : {
                        "_t" : "stateinc",
                        "t" : NumberLong(1524667892),
                        "a" : "NOM_CONN",
                        "m" : "ERROR: Interface Status Request : No response from remote host \"IP_MACHINE\"",
                        "val" : NumberLong(1)
                },
                "status" : {
                        "_t" : "statusinc",
                        "t" : NumberLong(1524667892),
                        "a" : "NOM_CONN",
                        "m" : "ERROR: Interface Status Request : No response from remote host \"IP_MACHINE\"",
                        "val" : NumberLong(1)
                },
                "steps" : [
                        {
                                "_t" : "stateinc",
                                "t" : NumberLong(1524667892),
                                "a" : "NOM_CONN",
                                "m" : "ERROR: Interface Status Request : No response from remote host \"IP_MACHINE\"",
                                "val" : NumberLong(1)
                        },
                        {
                                "_t" : "statusinc",
                                "t" : NumberLong(1524667892),
                                "a" : "NOM_CONN",
                                "m" : "ERROR: Interface Status Request : No response from remote host \"IP_MACHINE\"",
                                "val" : NumberLong(1)
                        }
                ],
                "component" : "NOM_MACHINE",
                "connector" : "centreon",
                "connector_name" : "NOM_CONN",
                "creation_date" : NumberLong(1524667917),
                "display_name" : "XXXX",
                "extra" : {

                },
                "initial_output" : "",
                "last_update_date" : NumberLong(1524667917),
                "last_event_date" : NumberLong(1524667917),
                "resource" : "Traffic - eth0",
                "tags" : [ ]
        }
}

Pour « mesurer » l'état courant de l'alarme, il faut vous référer à l'attribut v.state

"state" : {
    "_t" : "stateinc",
        "t" : NumberLong(1524667892),
        "a" : "centreon.NOM_CONN",
        "m" : "ERROR: Interface Status Request : No response from remote host \"IP_MACHINE\"",
        "val" : NumberLong(1)
}
  • _t : type d'état (stateinc, statedec) : en croissance ou en décroissance
  • t : timestamp associé
  • a : auteur
  • m : message de l'alarme
  • val (0, 1, 2, 3) : état de l'alarme : Info, Mineure, Majeure, Critique.

Notez que l'attribut step conserve l'historique des changements sur l'alarme.

En parallèle, il existe également un attribut status sous forme de step qui permet de savoir si une alarme est en cours, en bagot, annulée, etc.
Voici sa description :

"status" : {
    "_t" : "statusinc",
    "t" : NumberLong(1529046262),
    "a" : "AUTEUR",
    "m" : "MESSAGE",
    "val" : NumberLong(1)
},
  • _t : type de statut (statusinc, statusdec) : en croissance ou en décroissance
  • t : timestamp associé
  • a : auteur
  • m : message de l'alarme
  • val (0, 1, 2, 3, 4) : état de l'alarme : Off, En cours, Furtif, Bagot, Annulé.

Suppression

Pour supprimer une alarme en base, 2 étapes sont nécessaires.

Supprimer l'élément de la base MongoDB :

db.periodical_alarm.remove({"v.component" : "NOM_MACHINE", "v.resource" : "Traffic - eth0"})

Supprimer une alarme qui a été annulée

db.periodical_alarm.remove({"v.component" : "XXXX", "v.resource" : "Ping", "v.resolved" : null, "v.status.val" : 4})

Redémarrer le cache :

# systemctl restart redis-server

Status de service

Rendez-vous ici