Grafana est une plateforme permettant de créer des tableaux de bord de visualisation pour les métriques. Dans ces tableaux de bord, la création de différents types de widget et de nombreuses options sont disponibles pour la visualisation des métriques.
Plus de détails sont disponibles sur le site officiel : https://grafana.com/
Les versions suivantes comportent des failles de sécurité critique ( CVE-2021-43798 ). Shinken déconseille de les installer :
|
L'installation de Grafana sous RedHat et ses dérivés se fait via un paquet RPM. La version de Grafana testée avec Shinken Entreprise est la v8.3.2-1.
Pour l'installer, utiliser la commande suivante :
yum install --nogpgcheck https://dl.grafana.com/enterprise/release/grafana-enterprise-8.3.2-1.x86_64.rpm |
L'installation de Grafana sous Debian se fait via un paquet DEB. La version de Grafana testée avec Shinken Entreprise est la v8.3.2.
Pour l'installer, utiliser les commandes suivantes :
apt install -y musl wget wget -P /tmp/ https://dl.grafana.com/enterprise/release/grafana-enterprise_8.3.2_amd64.deb apt install -y /tmp/grafana-enterprise_8.3.2_amd64.deb rm -f /tmp/grafana-enterprise_8.3.2_amd64.deb |
Une fois l'installation terminée, lancer Grafana et configurer son lancement automatique au démarrage du système avec les commandes suivantes :
systemctl enable grafana-server systemctl start grafana-server |
Après avoir installé puis lancé Grafana, l'interface sera accessible sur le port 3000. Les identifiants par défaut sont admin/admin
Pour pouvoir récupérer les métriques générées par Shinken et enregistrées dans Graphite. Grafana doit avoir accès à Graphite. Pour cela, il faut ajouter dans Grafana une source de données Graphite.
Dans l'interface, allez dans la catégorie Data Sources , puis ajoutez une nouvelle source de type Graphite, qui sera paramétrée comme ci-dessous:
URL: adresse du serveur hébergeant Graphite, sur le port 80. Par exemple:
http://localhost:80 |
HTTPS: si Graphite est configuré en HTTPS, alors il faut adapter l'URL
https://localhost:443 |
Avant la version V02.08.02-RC012, il faut choisir 0.9.x
|
Après la version V02.08.02-RC012, il faut choisir 1.1.x
|
Si Grafana est installé sur un serveur différent du serveur Graphite, il faudra effectuer une étape de configuration supplémentaire. Par défaut, Graphite autorise seulement les connexions locales.
Pour permettre à des serveurs distants d'accéder à ses données, il faut modifier le fichier de configuration Apache de Graphite /etc/httpd/conf.d/graphite.conf :
Changer la ligne :
<VirtualHost 127.0.0.1:80> |
En :
<VirtualHost 0.0.0.0:80> |
Cette ligne permet de spécifier les interfaces réseau de la machine sur lesquelles effectuer l'écoute. Spécifier 0.0.0.0 ou * permettent d'écouter sur toutes les interfaces réseau. On peut mettre une seule interface à la place en spécifiant l'IP de l'interface réseau concernée.
Redémarrer Apache pour prendre en compte les modifications
systemctl restart httpd |
Pour permettre à des serveurs distants d'accéder à ses données, il faut modifier le fichier de configuration Apache de Graphite /etc/apache2/sites-available/graphite.conf :
Changer la ligne :
<VirtualHost 127.0.0.1:80> |
En :
<VirtualHost 0.0.0.0:80> |
Cette ligne permet de spécifier les interfaces réseau de la machine sur lesquelles effectuer l'écoute. Spécifier 0.0.0.0 ou * permettent d'écouter sur toutes les interfaces réseau. On peut mettre une seule interface à la place en spécifiant l'IP de l'interface réseau concernée.
Redémarrer Apache pour prendre en compte les modification
systemctl restart apache2 |
Pour connecter Grafana à une source de données Graphite en HTTPS, il peut être nécessaire d'analyser le certificat de cette dernière. La commande suivante permet de récupérer les informations du certificat :
|
Si l'adresse IP ou le nom de domaine (DNS) de l'URL de la source de données n'est pas inclus dans la liste des machines certifiées par le certificat ( par exemple si l'URL de la source de données est localhost alors que le certificat a été émis pour le nom ou l'adresse IP de la machine ) Grafana refusera alors la connexion. Dans ce cas, Grafana enregistrera l'erreur suivante dans le fichier journal /var/log/grafana/grafana.log : "proxy error: x509: certificate is valid for XXXX, not XXXX".
Pour résoudre ce problème, il est nécessaire de modifier l'URL de la source Graphite dans Grafana pour qu'elle corresponde aux adresses utilisées par le certificat
Ajouter le certificat de Graphite ou celui de l'autorité de certification à la liste des certificats de confiance du système. Pour ce faire, on peut ajouter le certificat dans la chaîne de confiance du système, puis redémarrer Grafana.
cp your_certificate.crt /etc/pki/ca-trust/source/anchors/ update-ca-trust systemctl restart grafana-server |
cp your_certificate.crt /etc/pki/ca-trust/source/anchors/ update-ca-trust systemctl restart grafana-server |
cp your_certificate.crt /usr/local/share/ca-certificates/ update-ca-certificates systemctl restart grafana-server |
On peut également ajouter le certificat de la source de données Graphite directement depuis l'interface de Grafana. Cette méthode peut être plus pratique si on ne souhaite pas modifier les fichiers de configuration du système.
|
L'installation et la connexion de Grafana avec Graphite sont maintenant terminées.
On peut désormais créer des tableaux de bord, ajouter des utilisateurs et permettre la visualisation des métriques de Shinken.
Par défaut, cette version n'accepte pas d'être intégrée dans un widget page web ( pour plus de détail sur la configuration du widget voir la page : Widget Page web ).
Si l'authentification est activée dans Grafana et pour l'intégrer dans un widget web, il faut que Grafana soit accessible depuis la même adresse IP ou même le nom de domaine ( exemple : shinken-solutions.com est un nom de domaine ). Sans quoi le blocage CORS des navigateurs bloquera la connexion à Grafana. |
Pour l'activer, il faut éditer le fichier de configuration Grafana /etc/grafana/grafana.ini dans la section "[security]":
allow_embedding = true |
Puis redémarrer Grafana
systemctl restart grafana-server |
Pour créer un tableau de bord,
Cliquer sur le "+", "Create", puis "Add new panel".
![]() |
Définir un nom dans le menu de droite.
Dans la partie basse de l'écran, il y a la composition de la requête.
Pour générer un graphe, il faut cliquer sur "select metric", puis ajouter la métrique souhaitée.
![]() |
Il faut sélectionner l’intervalle de visualisation.
![]() |
Une fois terminé, le bouton "Save" en haut à droite, va sauvegarde le panneau dans le tableau de bord. Le nom inscrit sera le nom du tableau de bord qui peut être composé de plusieurs panneaux.
Pour centraliser la visualisation des éléments supervisés par Shinken, il est possible d'intégrer les tableaux de bord Grafana dans un tableau de bord Shinken en utilisant le widget page web ( voir la page Widget Page web ).
Par exemple :
|
Allez sur le panneau et cliquer sur share :
![]() |
Dans l'onglet "Embed", sélectionner le line comme ci-dessous :
![]() |
Pour obtenir un graphique évolutif en temps réel, soit :
Remplacer dans le lien toute la partie "from=XXXX&to=XXXX" par "from=now-6h&to=now" pour avoir un intervalle de 6h de visualisation par exemple. En faisant cela, l'intervalle est configuré au niveau du lien et non du tableau de bord.
Copier ce lien dans le widget Page web.
Exemple :
![]() |
http://adresse_serveur:3000/d-solo/sLWNXIsMk/synchronizer?orgId=1&from=now-6h&to=now&panelId=2 |
Décomposition de l'adresse :
| Paramètre | Définition |
| adresse_serveur | Adresse IP / Nom DNS du serveur |
| 3000 | Port par défaut de Grafana |
| d-solo | Permet de cacher les barres de navigation de Grafana pour n'afficher que les éléments visualisés |
| synchronizer | Nom du tableau de bord |
| from=now-6h | Intervalle d'affichage du graphes sur 6h |
| to=now | Intervalle jusqu'à maintenant |
| panelId=2 | Numéro du panneau dans le tableau de bord |
Dans le fichier de configuration de Grafana ( /etc/grafana/grafana.ini ),
Ajoutez :
protocol = https cert_file = /chemin/vers/server.cert cert_key = /chemin/vers/server.key |
Puis redémarrer Grafana :
systemctl restart grafana-server |
Les métriques stockées dans Graphite utilisent l'UUID des éléments comme clé.
![]() |
| Lors de l'utilisation d'un cluster graphite, la configuration pour gérer la correspondance UUID ↔ nom doit être faite sur tous les serveurs faisant tourner un Carbon-Cache ( nœud de stockage des métriques ) |
Les logs de chargement de la table de correspondance UUID ↔ nom sont disponibles dans le fichier /opt/graphite/storage/log/webapp/info.log
Pour suivre la mise à jour du mapping nom → uuid et les requêtes pour un hôte particulier, il suffit de remplir le fichier /opt/graphite/storage/whisper/.apache_graphite_host_filter_log avec le nom de l'hôte. Les mises à jour dans la table de correspondance le concernant, ainsi que les requêtes de recherches de métriques seront toutes disponibles dans le fichier de log.
|
Après tous changements du fichier de configuration, penser à redémarrer Apache pour que Graphite prenne les modifications en compte :
|
Si le serveur Graphite et les Brokers avec les modules de métrologie Graphite sont sur des machines différentes, il faut configurer le serveur d'inventaire des modules de métrologie Graphite pour
Pour cela, sur le serveur de l'Arbiter, éditer les fichiers de configuration des modules Graphite et décommenter la ligne du paramètre
broker__module_graphite_perfdata__inventory_server__address 0.0.0.0 |
( pour passer sa valeur de 127.0.0.1 à 0.0.0.0 )
broker__module_graphite_perfdata__inventory_push__url http://IP_GRAPHITE/migrate |
Redémarrer l'Arbiter pour appliquer le changement de configuration |
Si le serveur d'un Broker qui fait tourner le module de métrologie Graphite dispose d'un firewall ( firewalld par défaut sur les systèmes Redhat et dérivés ), la commande suivante permet d'obtenir la liste des ports autorisés
firewall-cmd --list-ports |
80/tcp 7763/tcp 7765/tcp 7766/tcp 7767/tcp 7768/tcp 7769/tcp 7770/tcp 7771/tcp 7772/tcp 7773/tcp 7777/tcp 7780/tcp 50000/tcp |
Dans cet exemple, le port 52000/tcp ( port par défaut du serveur d'inventaire du module de métrologie Graphite ) n'est pas listé, il est donc bloqué par défaut
Les commandes suivantes, à lancer sur le serveur du Broker, permettent d'autoriser les connexions :
firewall-cmd --add-port=52000/tcp firewall-cmd --runtime-to-permanent |
Mode de fonctionnement avant la version de Shinken :
En cas d'impossibilité d'accès au serveur d'inventaire des modules de métrologie ( ports bloqués, paramètres par défaut incompatibles avec la configuration, la version installé est la version V02.08.02-RC012,... ), Graphite peut utiliser l'ancienne méthode que Shinken avait déployé pour fournir ces informations avec MongoDB.
L'accès via MongoDB est déprécié et est voué à disparaître.
En effet, Graphite ne peut consulter qu'une seule base MongoDB pour obtenir les correspondances de noms, il est ainsi obligé d'utiliser la base centrale, qui est souvent aussi la plus chargée.
Pour se connecter à un cluster MongoDB, il faut configurer un démon mongos ( voir page Haute disponibilité de la base MongoDB (mise en place d'un cluster) ) sur les serveurs stockant les métriques, et s'y connecter pour accéder au cluster.
Pour se connecter au serveur MongoDB, deux méthodes sont disponibles:
Par défaut, Graphite se connecte de manière directe au serveur MongoDB pour y lire et écrire sa table de correspondance.
Dans la configuration de Graphite, on sait que la connexion se fait de manière directe lorsque le paramètre "USE_SSH_TUNNEL" est à 0.
Cette méthode de connexion a pour avantage d'être facile à configurer au niveau de Shinken. Par contre, elle oblige à permettre l'accès à la base MongoDB au monde extérieur, et donc s'exposer à des problèmes de sécurité.
Graphite peut également se connecter au serveur MongoDB par tunnel SSH ( pour des raisons de sécurité ).
bind_ip= 127.0.0.1Comme toutes les connexions vers MongoDB, il est possible, et même recommandé, de sécuriser la communication via un tunnel chiffré SSH.
Le paramétrage de la connexion à MongoDB depuis Graphite, se fait en éditant les options suivantes ( dans /opt/graphite/conf/mongodb.conf ):
|
Après tous changements du fichier de configuration, penser à redémarrer Apache pour que Graphite prenne les modifications en compte :
|
Graphite étant hébergé par le service apache, il n'a pas accès au répertoire /var/lib/shinken et il n'a donc pas accès à la clé SSH /var/lib/shinken/.ssh/id_rsa. C'est pour cette raison que la clé SSH utilisée pour le tunnel est situé dans /opt/graphite/conf/id_rsa.
Deux solutions sont disponibles :
Il faut copier la clé privée et changer les droits pour l'utiliser et la maintenir à jour en cas de changement.
cp /var/lib/shinken/.ssh/id_rsa* /opt/graphite/conf/ chown apache:apache /opt/graphite/conf/id_rsa |
| Attention : un lien symbolique entre les deux fichiers ne fonctionnera pas, car l'utilisateur apache n'a pas les droits suffisants pour lire le fichier originel, et SSH refusera d'utiliser une clé dont les droits d'accès sont trop permissifs. |
yum update https://dl.grafana.com/enterprise/release/grafana-enterprise-X.X.X.x86_64.rpm |
apt install -y musl wget wget -P /tmp/ https://dl.grafana.com/enterprise/release/grafana-enterprise_X.X.X_amd64.deb apt install -y /tmp/grafana-enterprise_X.X.X_amd64.deb rm -f /tmp/grafana-enterprise_X.X.X_amd64.deb |
Pour la partie intégration avec le widget web de Shinken, si le paramètre "allow_embedding" ne se trouve pas dans le fichier /etc/grafana/grafana.ini, on peut l'ajouter dans la section "[security]" de ce fichier :
[security] allow_embedding = true |
Redémarrer grafana :
systemctl restart grafana-server |
Une fois Grafana mis à jour, il suffit de rafraîchir la page et de s'authentifier
Pour fonctionner avec le widget Page web, Grafana va nécessiter un paramétrage spécifique ( voir la page Widget Page web ).
Pour palier à ce problème, on peut utiliser HAProxy pour récupérer le flux de ce site et simuler sa présence sur le serveur où est installé la WebUI.
Pour afficher les graphes d'un Grafana qui n'est pas installé sur le serveur où se trouve la WebUI Shinken. Il faut installer HAProxy sur chacun des serveurs où ces graphes doivent être affiché dans le widget Page Web.
yum install haproxy |
apt install haproxy |
Ajouter une exception dans SELinux pour HAProxy:
|
Modifier le fichier de configuration /etc/haproxy/haproxy.cfg et ajouter à la fin du fichier la configuration de la redirection vers Grafana :
listen grafana bind SERVEUR_WEBUI:3000 server SERVEUR_GRAFANA SERVEUR_GRAFANA:3000 |
Il faut remplacer SERVEUR_WEBUI par 0.0.0.0 ou alors l'adresse IP de la machine et SERVEUR_GRAFANA par le nom ou l'adresse IP du serveur |
Démarrer HAProxy
systemctl enable haproxy systemctl restart haproxy |
On peut ajouter l'URL suivante dans le widget Page Web : http://SERVEUR_WEBUI:3000/XXXXXXX mais pas http://SERVEUR_GRAFANA:3000/XXXXXXX. La première authentification est nécessaire.
Par défaut HAProxy n'a pas de fichier de log. Pour en générer un il faut :
Éditer le fichier /etc/rsyslog.conf et dé-commenter les lignes suivantes :
$ModLoad imudp $UDPServerRun 514 |
Créer et ajouter dans le fichier /etc/rsyslog.d/haproxy.conf :
local2.* /var/log/haproxy.log |
Redémarrer rsyslog et haproxy :
systemctl restart rsyslog systemctl restart haproxy |
Le fichier de log devrait être en place :
tail /var/log/haproxy.log |
Installer le paquet rsyslog
apt install -y rsyslog |
Éditer le fichier /etc/rsyslog.conf et dé-commenter les lignes suivantes :
module(load="imudp") input(type="imudp" port="514") |
HAProxy fournit par défaut un fichier de configuration pour rsyslog dans /etc/rsyslog.d. Vérifier qu'il est bel et bien présent :
ls -l /etc/rsyslog.d/ |
Si ce n'est pas le cas, créer le fichier /etc/rsyslog.d/49-haproxy.conf et ajouter ce contenu :
# Create an additional socket in haproxy's chroot in order to allow logging via
# /dev/log to chroot'ed HAProxy processes
$AddUnixListenSocket /var/lib/haproxy/dev/log
# Send HAProxy messages to a dedicated logfile
:programname, startswith, "haproxy" {
/var/log/haproxy.log
stop
} |
Redémarrer rsyslog et haproxy :
systemctl restart rsyslog systemctl restart haproxy |
Le fichier de log devrait ête en place
tail /var/log/haproxy.log |