Vous avez été nombreux à me demander des informations sur mon Grafana et Prometheus, donc voici le tuto !
Vous pouvez voir un exemple sur sup.ataxya.net
Ce tuto est fait sur Debian 10
Partie 1: Installation de Prometheus
Préparation de l’environnement
On va commencer par créer un utilisateur pour Prometheus et pour Node exporter. Le paramètre --no-create-home
permet de ne pas créer de dossier /home, et on désactive le dossier avec --shell /usr/sbin/nologin
.
sudo useradd --no-create-home --shell /usr/sbin/nologin prometheus
sudo useradd --no-create-home --shell /bin/false node_exporter
On crée les dossier pour Prometheus
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
On donne les droits à l'utilisateur prometheus
pour être sûr que l'utilisateur ait bien accès aux dossiers
sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus
Installation de Node_Exporter
Node_Exporter permet de collecter les métriques de la VM et de les renvoyer vers le Prometheus
On télécharge Node_Exporter
wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz
On dézippe le tar.gz
tar xvf node_exporter-0.16.0.linux-amd64.tar.gz
On copie le fichier binaire /usr/local/bin
et on donne les droits à l'utilisateur créé précédemment
sudo cp node_exporter-0.16.0.linux-amd64/node_exporter /usr/local/bin
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
On supprime les fichiers dont nous n'avons plus besoin
rm -rf node_exporter-0.16.0.linux-amd64.tar.gz node_exporter-0.16.0.linux-amd64
Pour démarrer Node_Exporter à chaque boot, nous allons créer un fichier systemd.
nano /etc/systemd/system/node_exporter.service
Copier les lignes suivantes dans le fichier et sauvegarder
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
On recharge systemd pour prendre en compte le nouveau service
sudo systemctl daemon-reload
On démarre node_exporter avec la commande suivante
sudo systemctl start node_exporter
On vérifie que le service a bien démarré
sudo systemctl status node_exporter
Vous devriez voir quelque chose comme ceci, avec active (running)
● node_exporter.service - Node Exporter
Loaded: loaded (/etc/systemd/system/node_exporter.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2018-06-25 11:47:06 UTC; 4s ago
Main PID: 1719 (node_exporter)
CGroup: /system.slice/node_exporter.service
└─1719 /usr/local/bin/node_exporter
Si tout fonctionne, on active Node_Exporter pour le démarrer à chaque boot
sudo systemctl enable node_exporter
Installation de Prometheus
On télécharge la dernière version de Prometheus . A titre d'exemple, la version est 2.2.1:
sudo apt-get update && apt-get upgrade
wget https://github.com/prometheus/prometheus/releases/download/v2.2.1/prometheus-2.2.1.linux-amd64.tar.gz
tar xfz prometheus-*.tar.gz
cd prometheus-*
On copie les fichiers vers le dossier /usr/local/bin/
:
sudo cp ./prometheus /usr/local/bin/
sudo cp ./promtool /usr/local/bin/
On donne les droits à l'utilisateur prometheus
précédemment créé
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
On copie les dossiers consoles
et console_libraries
vers /etc/prometheus
:
sudo cp -r ./consoles /etc/prometheus
sudo cp -r ./console_libraries /etc/prometheus
On donne les droits à l'utilisateur prometheus
précédemment crée
sudo chown -R prometheus:prometheus /etc/prometheus/consoles
sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
On supprime les fichiers dont nous n'avons plus besoin
cd .. && rm -rf prometheus-*
Configuration de Prometheus
Avant d'utiliser Prometheus, nous avons besoin de créer une configuration. Nous allons donc créer le fichier de configuration prometheus.yml
Note: Le ficher de configuration de Prometheus est écrit en YAML, qui interdit l'utilisation de tabulations. Si le fichier est mal formaté, Prometheus ne démarrera pas.
On édite le fichier prometheus.yml
sudo nano /etc/prometheus/prometheus.yml
Le fichier devrait ressembler à l'exemple suivant
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
Dans la partie scrape_configs
nous avons défini notre premier exporter, celui de Prometheus lui-même. Les paramètres static_configs
et targets
détermine où l'exporter tourne. Le Prometheus tournant en local, on défini localhost
et le port 9090
.
Comme Prometheus exporte seulement ce qui est défini dans la partie scrape_configs
, il faut ajouter Node_Exporter, comme nous avons fait pour Prometheus.
On ajoute la partie suivante en dessous du job Prometheus (attention aux espaces!)
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
Comme l'exporter est sur le même serveur que Prometheus, on utilise localhost
avec le port par défaut de Node_Exporter: 9100
.
On donne les droits à l'utilisateur prometheus
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
Le serveur Prometheus est prêt à démarrer !
Démarrer Prometheus
Pour tester, on démarre Prometheus directement en ligne de commande avec la commande suivante:
sudo -u prometheus /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries
Le serveur va vous afficher plusieurs message de status et comme quoi le serveur a bien démarré
level=info ts=2018-04-12T11:56:53.084000977Z caller=main.go:220 msg="Starting Prometheus" version="(version=2.2.1, branch=HEAD, revision=bc6058c81272a8d938c05e75607371284236aadc)"
level=info ts=2018-04-12T11:56:53.084463975Z caller=main.go:221 build_context="(go=go1.10, user=root@149e5b3f0829, date=20180314-14:15:45)"
level=info ts=2018-04-12T11:56:53.084632256Z caller=main.go:222 host_details="(Linux 4.4.127-mainline-rev1 #1 SMP Sun Apr 8 10:38:32 UTC 2018 x86_64 scw-041406 (none))"
level=info ts=2018-04-12T11:56:53.084797692Z caller=main.go:223 fd_limits="(soft=1024, hard=65536)"
level=info ts=2018-04-12T11:56:53.09190775Z caller=web.go:382 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2018-04-12T11:56:53.091908126Z caller=main.go:504 msg="Starting TSDB ..."
level=info ts=2018-04-12T11:56:53.102833743Z caller=main.go:514 msg="TSDB started"
level=info ts=2018-04-12T11:56:53.103343144Z caller=main.go:588 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
level=info ts=2018-04-12T11:56:53.104047346Z caller=main.go:491 msg="Server is ready to receive web requests."
On ouvre le navigateur et on entre http://<ip>:9090
pour accéder à l'interface Web de Prometheus. Si tout fonctionne, on termine la tâche en pressant CTRL + C
sur le serveur
Note: Si vous obtenez une erreur lors du démarrage du serveur, vérifiez votre fichier de configuration. Le message vous dira ou est l'erreur (généralement, c'est le fichier qui est mal formaté)
Comme pour Node_Exporter, on crée un fichier systemd
pour démarrer automatiquement Prometheus au boot
sudo nano /etc/systemd/system/prometheus.service
On copie les informations suivantes dans le fichier et on sauvegarde
[Unit]
Description=Prometheus Monitoring
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
On recharge systemd pour prendre en compte le nouveau service
sudo systemctl daemon-reload
On active Node_Exporter pour le démarrer à chaque boot
sudo systemctl enable prometheus
Et on démarre Prometheus !
sudo systemctl start prometheus
Le serveur Prometheus est prêt à être utilisé, et à récupérer toutes nos informations!
Partie 2: Installation de Grafana
Pour pouvoir afficher proprement les informations récupérées par Prometheus, on va installer Grafana
1 . On installe Grafana sur le même serveur que le Prometheus
sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/oss/release/grafana_6.7.3_amd64.deb
sudo dpkg -i grafana_6.7.3_amd64.deb
2 . On active le démarrage automatique de Grafana via systemd
:
sudo systemctl daemon-reload && sudo systemctl enable grafana-server && sudo systemctl start grafana-server
Grafana est désormais lancé, nous pouvons y accéder via http://<ip>:3000
. L'utilisateur et le mot de passe par défaut est admin
/ admin
(Pensez à le changer!).
Nous allons donc créer la source de données Prometheus:
- Cliquez sur le logo de Grafana pour ouvrir le menu
- Cliquez sur "Data Source"
- Choisissez “Add New”.
- Sélectionnez “Prometheus” en source de données.
- Mettez l'ip de la source Prometheus (dans notre cas http://localhost:9090/)
- Cliquez sur“Add” pour tester la connexion et ajouter la source de données
Le Grafana est désormais fonctionnel ! Nous allons voir comment exporter les informations de Proxmox et de Mikrotik
Partie 3: Pve_Exporter
Pour exporter les informations de notre Proxmox, nous allons utiliser Pve_Exporter, disponible ici
On installe l’exporter directement sur le Proxmox
On crée d'abord un utilisateur dédié au monitoring
pveum usermod pve_exporter@pve -group monitoring
pveum passwd pve_exporter@pve
On installe l'exporter avec pip
pip install prometheus-pve-exporter
Note: Si pip n'est pas installé sur votre Proxmox, vous pouvez l'installer avec apt-get install python-pip
On crée le dossier Pve_Exporter et on crée le fichier de configuration
mkdir -p /usr/share/pve_exporter/
nano /usr/share/pve_exporter/pve_exporter.yml
Le fichier devrait ressembler à ceci:
default:
user: <user>@pve
password: <password>
verify_ssl: false
On peut tester le fonctionnement de la configuration avec la commande suivante
/usr/local/bin/pve_exporter /usr/share/pve_exporter/pve_exporter.yml
Si tout va bien, le serveur nous affiche ceci:
root@pve1:~# /usr/local/bin/pve_exporter /usr/share/pve_exporter/pve_exporter.yml
* Running on http://localhost:9221/ (Press CTRL+C to quit)
On peut vérifier le fonctionnement via le navigateur, à l'ip suivante http://<ip-proxmox>:9221/pve?target=<ip-proxmox>
Une longue liste d'information va s'afficher, comme ceci:
Comme avec les autres exporter, nous allons créer un service systemd pour lancer l'exporter au boot
nano /etc/systemd/system/pve_exporter.service
La configuration ressemble à ceci:
[Unit]
Description=Proxmox VE Prometheus Exporter
After=network.target
Wants=network.target
[Service]
Restart=on-failure
WorkingDirectory=/usr/share/pve_exporter
ExecStart=/usr/local/bin/pve_exporter /usr/share/pve_exporter/pve_exporter.yml 9221 <ip-proxmox>
[Install]
WantedBy=multi-user.target
On active et on démarre le service:
systemctl enable pve_exporter
systemctl start pve_exporter
Ensuite, on configure le Prometheus pour récupérer les données. On ajoute donc un job à la configuration:
- job_name: 'pve'
scrape_interval: 5s
static_configs:
- targets: ['10.10.1.10:9221']
metrics_path: /pve
On reload systemd et on restart Prometheus
systemctl daemon-reload
systemctl restart prometheus
Pour afficher les données sur Grafana, vous pouvez utiliser ce dashboard
Partie 4: Mikrotik Exporter
Pour exporter les informations de notre Proxmox, nous allons utiliser mikrotik-exporter, disponible ici
On installe l'exporter sur le même serveur que le Prometheus
Côté Mikrotik
On crée d'abord un groupe sur le mikrotik
/user group add name=prometheus policy=api,read,winbox
On crée l'utilisateur qui va accéder à l'API
/user add name=prometheus group=prometheus password=changeme
Côté serveur
Pour pouvoir builder l'exporter, nous avons besoin du paquet build-essential et de go
apt install build-essential
wget https://dl.google.com/go/go1.13.3.linux-amd64.tar.gz
tar -xvf go1.13.3.linux-amd64.tar.gz
sudo mv go /usr/local
export GOROOT=/usr/local/go
export GOPATH=/usr/local/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
go version
On clone le repository
git clone https://github.com/nshttpd/mikrotik-exporter.git
mv /mikrotik-exporter/ /etc/mikrotik-exporter
cd /etc/mikrotik-exporter
make
On crée le fichier de configuration
nano /etc/mikrotik-exporter/config.yml
devices:
- name: my_router
address: <IP-Mikrotik>
user: prometheus
password: <password>
features:
bgp: true
dhcp: true
dhcpv6: true
dhcpl: true
routes: false
pools: true
optics: true
On test le fichier de configuration:
./mikrotik-exporter -config-file config.yml
root@Prometheus:/etc/mikrotik-exporter# ./mikrotik-exporter -config-file config.yml
{"level":"info","msg":"setting up collector for devices","numDevices":1,"time":"2020-05-05T18:17:29+02:00"}
{"level":"info","msg":"Listening on :9436","time":"2020-05-05T18:17:29+02:00"}
Une fois que tout fonctionne; on crée le service mikrotik
nano /etc/systemd/system/mikrotik.service
[Unit]
Description=Prometheus exporter for Mikrotik
Documentation=https://github.com/nshttpd/mikrotik-exporter
[Service]
Restart=always
User=root
ExecStart=/etc/mikrotik-exporter/mikrotik-exporter --config-file=/etc/mikrotik-exporter/config.yml
[Install]
WantedBy=multi-user.target
On reload systemd, on active et on démarre le service mikrotik
systemctl daemon-reload
systemctl enable mikrotik.service
systemctl start mikrotik.service
On ajout maintenant le job dans la config Prometheus
- job_name: 'mikrotik'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9436']
On reload systemd et on redémarre Prometheus
systemctl daemon-reload
systemctl restart prometheus
Pour afficher les données sur Grafana, vous pouvez utiliser ce dashboard
Voilà pour ce tuto ! N'hésitez pas à me faire un retour et à me contacter en cas de problème !