De Nagios vers Grafana sous Ubuntu 18.04

Sommaire

Cet article se base sur l’article 802 de la documentation de la base de connaissance Nagios intitulé : " Nagios Core - Performance Graphs Using InfluxDB + Nagflux + Grafana + Histou "

Les services de supervision propose de plus en plus nativement d’obtenir des graphes par rapport aux données de supervision collectées.
Malheureusement, Nagios n’enregistre pas ces données dans le temps (il ne permet donc ne permet pas d’avoir ces informations) et par conséquent, il ne permet pas de visualisé ces données.
Mon but (et donc celui de ce tutoriel), est donc d’enregistrer les données de performances de Nagios dans une base de données et de les afficher sous forme de graphe.

Pour cela, on va stocker les données Nagios dans une base de données InfluxDB (avec Nagflux). Ensuite, on va retranscrire ces données en forme de graphe sur Grafana (avec Histou).

Pour résumer, voici donc les éléments qu’on va installé :

  • InfluxDB : Base de données optimisée pour le stockage de données horodatées (TSDB)
  • Nagflux : Connecteur qui stocke les données Nagios dans une base de données (ici InfluxDB)
  • Grafana : Outil de visualisation des données (métriques) sous forme de graphe (courbe, jauge,…)
  • Histou : Outil de création dynamique de graphe pour Grafana

Installation des services

Prérequis

On met à jour notre dépôt et on installe les utilitaires nécessaire à la poursuite du tutoriel :

1
2
sudo apt-get update
sudo apt-get install -y curl apt-transport-https golang golang-github-influxdb-usage-client-dev git 

InfluxDB

On ajoute le dépôt et on installe le programme :

1
2
3
4
5
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

sudo apt-get update && sudo apt-get install influxdb

Une fois installé, on active le service au démarrage du serveur et on le lance :

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable influxdb.service
sudo systemctl start influxdb.service

Nagflux

Nagflux s’installe manuellement en téléchargeant les éléments et en les copiant dans le dossier /opt (selon la hiérarchie du système de fichiers Linux).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
echo "export GOPATH=$HOME/gorepo" >> ~/.bashrc
source ~/.bashrc
mkdir $GOPATH

go get -v -u github.com/griesbacher/nagflux
go build github.com/griesbacher/nagflux

sudo mkdir -p /opt/nagflux
sudo cp $GOPATH/bin/nagflux /opt/nagflux/
sudo mkdir -p /usr/local/nagios/var/spool/nagfluxperfdata
sudo chown nagios:nagios /usr/local/nagios/var/spool/nagfluxperfdata

On créer donc le service et on active le lancement au démarrage :

1
2
3
4
sudo cp $GOPATH/src/github.com/griesbacher/nagflux/nagflux.service /lib/systemd/system/
sudo chmod +x /lib/systemd/system/nagflux.service
sudo systemctl daemon-reload
sudo systemctl enable nagflux.service

On ne lance pas tous de suite le service car il demande une configuration, on verra cela après (soyez patient !).

Grafana

1
2
3
curl https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo apt-get update && sudo apt-get install grafana

Une fois installé, on active le service au démarrage du serveur et on le lance (oui, je me répète) :

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable grafana-server.service
sudo systemctl start grafana-server.service

Histou

On télécharge l’archive et on décompresse dans notre dossier d’application Web :

1
2
3
4
5
6
7
8
9
cd /tmp
wget -O histou.tar.gz https://github.com/Griesbacher/histou/archive/v0.4.3.tar.gz

mkdir -p /srv/http/histou
cd /srv/http/histou
tar xzf /tmp/histou.tar.gz --strip-components 1

cp histou.ini.example histou.ini
cp histou.js /usr/share/grafana/public/dashboards/

Si vous lisez un peu (au lieu de faire des copier-coller !), vous remarquerez que j’effectue une configuration d’Histou. Celle-ci étant simple (on prend les éléments par défaut), je l’a met dans la partie d’installation.

Configuration

Maintenant que tout est installé, on va pouvoir passez à la partie inintéressante du tutoriel : la configuration.

Nagflux

On va créer le fichier de configuration “config.gcfg”.
Pour cela, copier-coller le code suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
cd /opt/nagflux
sudo sh -c "printf '[main]\n' > config.gcfg"
sudo sh -c "printf '\tNagiosSpoolfileFolder = \"/usr/local/nagios/var/spool/nagfluxperfdata\"\n' >> config.gcfg"
sudo sh -c "printf '\tNagiosSpoolfileWorker = 1\n' >> config.gcfg"
sudo sh -c "printf '\tInfluxWorker = 2\n' >> config.gcfg"
sudo sh -c "printf '\tMaxInfluxWorker = 5\n' >> config.gcfg"
sudo sh -c "printf '\tDumpFile = \"nagflux.dump\"\n' >> config.gcfg"
sudo sh -c "printf '\tNagfluxSpoolfileFolder = \"/usr/local/nagios/var/nagflux\"\n' >> config.gcfg"
sudo sh -c "printf '\tFieldSeparator = \"&\"\n' >> config.gcfg"
sudo sh -c "printf '\tBufferSize = 10000\n' >> config.gcfg"
sudo sh -c "printf '\tFileBufferSize = 65536\n' >> config.gcfg"
sudo sh -c "printf '\tDefaultTarget = \"all\"\n' >> config.gcfg"
sudo sh -c "printf '\n' >> config.gcfg"
sudo sh -c "printf '[Log]\n' >> config.gcfg"
sudo sh -c "printf '\tLogFile = \"\"\n' >> config.gcfg"
sudo sh -c "printf '\tMinSeverity = \"INFO\"\n' >> config.gcfg"
sudo sh -c "printf '\n' >> config.gcfg"
sudo sh -c "printf '[InfluxDBGlobal]\n' >> config.gcfg"
sudo sh -c "printf '\tCreateDatabaseIfNotExists = true\n' >> config.gcfg"
sudo sh -c "printf '\tNastyString = \"\"\n' >> config.gcfg"
sudo sh -c "printf '\tNastyStringToReplace = \"\"\n' >> config.gcfg"
sudo sh -c "printf '\tHostcheckAlias = \"hostcheck\"\n' >> config.gcfg"
sudo sh -c "printf '\n' >> config.gcfg"
sudo sh -c "printf '[InfluxDB \"nagflux\"]\n' >> config.gcfg"
sudo sh -c "printf '\tEnabled = true\n' >> config.gcfg"
sudo sh -c "printf '\tVersion = 1.0\n' >> config.gcfg"
sudo sh -c "printf '\tAddress = \"http://127.0.0.1:8086\"\n' >> config.gcfg"
sudo sh -c "printf '\tArguments = \"precision=ms&u=root&p=root&db=nagflux\"\n' >> config.gcfg"
sudo sh -c "printf '\tStopPullingDataIfDown = true\n' >> config.gcfg"
sudo sh -c "printf '\n' >> config.gcfg"
sudo sh -c "printf '[InfluxDB \"fast\"]\n' >> config.gcfg"
sudo sh -c "printf '\tEnabled = false\n' >> config.gcfg"
sudo sh -c "printf '\tVersion = 1.0\n' >> config.gcfg"
sudo sh -c "printf '\tAddress = \"http://127.0.0.1:8086\"\n' >> config.gcfg"
sudo sh -c "printf '\tArguments = \"precision=ms&u=root&p=root&db=fast\"\n' >> config.gcfg"
sudo sh -c "printf '\tStopPullingDataIfDown = false\n' >> config.gcfg"

On démarre ensuite le service :

1
sudo systemctl start nagflux.service

On vérifie que notre connecteur s’est bien interfacé avec InfluxDB avec une commande cURL :

1
curl -G "http://localhost:8086/query?pretty=true" --data-urlencode "q=show databases"

Le résultat devrait-être de la forme suivante :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
      "results": [
          {
              "statement_id": 0,
              "series": [
                  {
                      "name": "databases",
                      "columns": [
                          "name"
                      ],
                      "values": [
                          [
                              "_internal"
                          ],
                          [
                              "nagflux"
                          ]
                      ]
                  }
              ]
          }
      ]
  }

Nagios

Par défaut, Nagios ne traite pas les données de performances. Il faut donc lui dire de le faire et adapter sa configuration dans ce sens.
Pour cela, on procède à gros coup de sed :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sudo sh -c "sed -i 's/^process_performance_data=0/process_performance_data=1/g' /usr/local/nagios/etc/nagios.cfg"
sudo sh -c "sed -i 's/^#host_perfdata_file=/host_perfdata_file=/g' /usr/local/nagios/etc/nagios.cfg"
sudo sh -c "sed -i 's/^#host_perfdata_file_template=.*/host_perfdata_file_template=DATATYPE::HOSTPERFDATA\\\\tTIMET::\$TIMET\$\\\\tHOSTNAME::\$HOSTNAME\$\\\\tHOSTPERFDATA::\$HOSTPERFDATA\$\\\\tHOSTCHECKCOMMAND::\$HOSTCHECKCOMMAND\$/g' /usr/local/nagios/etc/nagios.cfg"
sudo sh -c "sed -i 's/^#host_perfdata_file_mode=/host_perfdata_file_mode=/g' /usr/local/nagios/etc/nagios.cfg"
sudo sh -c "sed -i 's/^#host_perfdata_file_processing_interval=.*/host_perfdata_file_processing_interval=15/g' /usr/local/nagios/etc/nagios.cfg"
sudo sh -c "sed -i 's/^#host_perfdata_file_processing_command=.*/host_perfdata_file_processing_command=process-host-perfdata-file-nagflux/g' /usr/local/nagios/etc/nagios.cfg"
sudo sh -c "sed -i 's/^#service_perfdata_file=/service_perfdata_file=/g' /usr/local/nagios/etc/nagios.cfg"
sudo sh -c "sed -i 's/^#service_perfdata_file_template=.*/service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\\\\tTIMET::\$TIMET\$\\\\tHOSTNAME::\$HOSTNAME\$\\\\tSERVICEDESC::\$SERVICEDESC\$\\\\tSERVICEPERFDATA::\$SERVICEPERFDATA\$\\\\tSERVICECHECKCOMMAND::\$SERVICECHECKCOMMAND\$/g' /usr/local/nagios/etc/nagios.cfg"
sudo sh -c "sed -i 's/^#service_perfdata_file_mode=/service_perfdata_file_mode=/g' /usr/local/nagios/etc/nagios.cfg"
sudo sh -c "sed -i 's/^#service_perfdata_file_processing_interval=.*/service_perfdata_file_processing_interval=15/g' /usr/local/nagios/etc/nagios.cfg"
sudo sh -c "sed -i 's/^#service_perfdata_file_processing_command=.*/service_perfdata_file_processing_command=process-service-perfdata-file-nagflux/g' /usr/local/nagios/etc/nagios.cfg"

Ensuite, on va inscrire les commandes de données de performance dans le fichiers de commande /usr/local/nagios/etc/objects/commands.cfg :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
################################################################################
#
# DONNEES DE PERFOMANCE NAGFLUX
#
################################################################################


define command {
    command_name    process-host-perfdata-file-nagflux
    command_line    /bin/mv /usr/local/nagios/var/host-perfdata /usr/local/nagios/var/spool/nagfluxperfdata/$TIMET$.perfdata.host
}

define command {
    command_name    process-service-perfdata-file-nagflux
    command_line    /bin/mv /usr/local/nagios/var/service-perfdata /usr/local/nagios/var/spool/nagfluxperfdata/$TIMET$.perfdata.service
}

J’en ai profité pour virer les anciennes commandes “process-host-perfdata” et “process-service-perfdata” du fichier vu que je ne m’en sert pas.

Comme à chaque changement de configuration de Nagios, on teste cette dernière et on relance Nagios.

1
2
sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
sudo systemctl restart nagios.service

On va alors vérifié que Nagflux récupère bien des données (toujours avec cURL). Il faut attendre que Nagios fasse quelques “check” pour avoir un résultat. C’est un bon moment pour prendre un café ou un chocolat chaud si vous êtes nocturne.

1
curl -G "http://localhost:8086/query?db=nagflux&pretty=true" --data-urlencode "q=show series"

Après quelques minutes et avec la configuration Nagios de base, j’ai le résultat suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
w series"
{
    "results": [
        {
            "statement_id": 0,
            "series": [
                {
                    "columns": [
                        "key"
                    ],
                    "values": [
                        [
                            "metrics,command=check-host-alive,crit-fill=none,host=localhost,performanceLabel=pl,service=hostcheck,unit=%,warn-fill=none"
                        ],
                        [
                            "metrics,command=check-host-alive,crit-fill=none,host=localhost,performanceLabel=rta,service=hostcheck,unit=ms,warn-fill=none"
                        ],
                        [
                            "metrics,command=check_http,host=localhost,performanceLabel=size,service=HTTP,unit=B"
                        ],
                        [
                            "metrics,command=check_http,host=localhost,performanceLabel=time,service=HTTP,unit=s"
                        ],
                        [
                            "metrics,command=check_local_disk,crit-fill=none,host=localhost,performanceLabel=/,service=Root\\ Partition,unit=MB,warn-fill=none"
                        ],
                        [
                            "metrics,command=check_local_load,crit-fill=none,host=localhost,performanceLabel=load1,service=Current\\ Load,warn-fill=none"
                        ],
                        [
                            "metrics,command=check_local_load,crit-fill=none,host=localhost,performanceLabel=load15,service=Current\\ Load,warn-fill=none"
                        ],
                        [
                            "metrics,command=check_local_load,crit-fill=none,host=localhost,performanceLabel=load5,service=Current\\ Load,warn-fill=none"
                        ],
                        [
                            "metrics,command=check_local_procs,crit-fill=none,host=localhost,performanceLabel=procs,service=Total\\ Processes,warn-fill=none"
                        ],
                        [
                            "metrics,command=check_local_swap,crit-fill=none,host=localhost,performanceLabel=swap,service=Swap\\ Usage,unit=MB,warn-fill=none"
                        ],
                        [
                            "metrics,command=check_local_users,crit-fill=none,host=localhost,performanceLabel=users,service=Current\\ Users,warn-fill=none"
                        ],
                        [
                            "metrics,command=check_ping,crit-fill=none,host=localhost,performanceLabel=pl,service=PING,unit=%,warn-fill=none"
                        ],
                        [
                            "metrics,command=check_ping,crit-fill=none,host=localhost,performanceLabel=rta,service=PING,unit=ms,warn-fill=none"
                        ],
                        [
                            "metrics,command=check_ssh,host=localhost,performanceLabel=time,service=SSH,unit=s"
                        ]
                    ]
                }
            ]
        }
    ]
}

Grafana

Pour la configuration de Grafana, on quitte le CLI pour aller sur son interface Web sur le port 3000 .

Si cela ne fonctionne pas (pour ma part, cela a fonctionné), c’est surement a cause de votre pare-feux. Voici les commandes ufw (désolé, je n’ai jamais été expert iptables) :

1
2
sudo ufw allow 3000/tcp
sudo ufw reload

On se connecte avec le nom d’utilisateur “admin” et la même chose pour le mot de passe. On est alors inviter à le changer (faite le s’il vous plait).

On va donc maintenant ajouté notre base de données InfluxDB en sélectionnant “Add data source”. Vous l’aurez compris, il faut ensuite cliqué sur “InfluxDB”. On remplace le nom par “nagflux”, on remplis le champs “URL” par ce qui est proposé et le champs “Database” par “naglfux”. On valide ensuite notre ajout via le bouton “Save & Test”.

Ajout de la base de données à Grafana
Ajout de la base de données à Grafana

Histou

Histou doit-être configuré avec l’adresse IP ou le nom de domaine de votre serveur. On remplace donc “localhost” de la variable “var url” du fichier /usr/share/grafana/public/dashboards/histou.js en adaptant la commande d’exemple suivante :

1
sudo sh -c "sed -i 's/localhost/trucbidule.scrample.xyz/g' /usr/share/grafana/public/dashboards/histou.js"

Tester Histou avec la commande suivante (en admettant que vous avez toujours le service “PING” en check sur le localhost) :

1
curl -G "http://localhost/histou/?host=localhost&service=PING"

Si votre écran est remplit de données, c’est qu’Histou fonctionne. Reste à voir maintenant si Histou fonctionne bien sur Grafana. Pour cela, on va consulté directement un graphe de données.

Aller donc à l’adresse suivante sur votre navigateur en remplaçant bien sur le nom de domaine par le votre (ou adresse IP de votre serveur) :
http://trucbidule.scrample.xyz:3000/dashboard/script/histou.js?orgId=1&host=localhost&service=PING

Aperçu d’un graphe sous Grafana
Aperçu d’un graphe sous Grafana

Voila ! Grafana est bien installé est fonctionnel ! Cependant, modifier manuellement l’URL pour voir les données de chaque service de chaque hôte est vraiment pas pratique. On va donc voir dans la partie suivante comment intégré les URL pour chaque hôte et service.

Intégration dans Nagios

Pour cela, on va créer deux templates que l’on va incorporer dans nos définitions d’hôtes et services.

On adapte et on ajoute donc les templates suivante dans le fichier /usr/local/nagios/etc/objects/templates.cfg :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
################################################################################
#
# TEMPLATES GRAFANA
#
################################################################################

define host {
    name       host-grafana
    action_url http://trucbidule.scrample.xyz:3000/dashboard/script/histou.js?host=$HOSTNAME$
    register   0
}

define service {
    name       service-grafana
    action_url http://trucbidule.scrample.xyz:3000/dashboard/script/histou.js?host=$HOSTNAME$&service=$SERVICEDESC$
    register   0
}

Ainsi en ajoutant “use host-grafana” ou “use service-grafana” dans la définition d’un template, on obtient un lien cliquable vers Grafana pour l’hôte ou le service.
On peut aussi ajouter simplement la ligne action_url individuellement à chaque hôtes et/ou services.

Pour ma part, j’ai intégré la template “host-grafana” à la template “generic-host” qui est à l’origine de toutes mes définitions d’hôtes.
Pour les services, j’ai ajouté une template “generic-service-with-perf” qui hérite de “generic-service”. J’utilise donc l’une ou l’autre en fonction de mes besoins.

1
2
3
4
5
6
7
define service {
    name                            generic-service-with-perf
    use                             generic-service
    use                             service-grafana
    process_perf_data               1
    register                        0
}

Maintenant que cela est fait, je peux aller dormir… Bonne nuit à moi !