Le monitoring d’un environnement SolrCloud en production est essentiel afin d’anticiper les problèmes de performances et le cas échéant en comprendre l’origine. Cet article décrit comment mettre en place un monitoring de SolrCloud au moyen de Prometheus et Grafana.
Principe et architecture de Prometheus
Prometheus est un logiciel open source (https://prometheus.io/). Il collecte des métriques auprès de tous logiciels pouvant les fournir via des exporters (et la liste est longue https://prometheus.io/docs/instrumenting/exporters/), afin de surveiller le fonctionnement des applications et mettre en place une gestion d’alerte selon des seuils.
Les tâches principales de Prometheus sont:
- Collecter des métriques fournis par des exporter (PULL)
- Stocker les métriques dans base de données TSDB (Time Series DataBase)
- Fournir les métriques à des outils d’affichage tels que Grafana au travers de requêtes HTTP PromQL
Les trois étapes de la mise en place d’un système de monitoring sont:
- Installer sur chaque serveurs à monitorer des « exporter » (systèmes, JMX, applicatif, …)
- Installer Prometheus et configurer la collecte des métriques
- Installer Grafana et configurer des dashboard d’affichage des métriques
Pour le monitoring d’un environnement Solrcloud, nous utilisons les « exporters » suivants:
- Node exporter sur tous les serveurs pour les métriques systèmes (CPU, I/O, mémoire, espace disques, …)
- JMX exporter sur tous les serveurs pour les JVM de Zookeeper et de Solr
- 4LW exporter sur les serveurs Zookeeper pour les métriques applicatifs de Zookeeper
- Solr exporter sur les serveurs Solr pour les métriques applicatifs de Solr
Le schéma suivant synthétise l’architecture et le fonctionnement du monitoring de SolrCloud avec de Prometheus et Grafana.
Installation des exporter sur les serveurs à monitorer
J’indique ici très synthétiquement comment procéder aux installations sur des serveurs Centos 8.0. Si ces procédures ne fonctionnent pas pour votre environnement, il faudra lire les documentations.
Node exporter
L’exporter est disponible dans le repository github suivant : https://github.com/prometheus/node_exporter
A installer sur les serveurs Zookeeper et Solr.
- Création d’un utilisateur « prometheus »
# useradd -d /home/prometheus prometheus
- Installation dans un répertoire « /opt/prometheus »
# mkdir /opt/prometheus # cd /opt/prometheus # wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz # tar xzf node_exporter-0.18.1.linux-amd64.tar.gz # ln -s node_exporter-0.18.1.linux-amd64 node_exporter # rm node_exporter-0.18.1.linux-amd64.tar.gz # chown -R prometheus: /opt/prometheus
- Mise en place du script de démarrage « /etc/systemd/system/node-exporter.service »
[Unit] Description=Prometheus Node Exporter After=network-online.target [Service] User=prometheus Restart=on-failure ExecStart=/opt/prometheus/node_exporter/node_exporter [Install] WantedBy=multi-user.target
- Activation et démarrage du service
# systemctl daemon-reload # systemctl start node-exporter # systemctl enable node-exporter
JMX exporter
L’exporter est disponible dans le repository github suivant : https://github.com/prometheus/jmx_exporter
A installer sur les serveurs Zookeeper et Solr. L’exporter est exécuté dans le contexte des JVM de Solr et Zookeeper. Il est invoqué dans les paramètres de Solr (fichier solr.in.sh) et Zookeeper (fichier zookeeper-env.sh).
Serveur Zookeeper
- Installation
# mkdir /opt/zookeeper/jmx-exporter # wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.9/jmx_prometheus_javaagent-0.9.jar # mv /jmx_prometheus_javaagent-0.9.jar /opt/zookeeper/jmx-exporter/. # touch /opt/zookeeper/conf/zookeeper-jmx-exporter.yml
- Configuration dans /opt/zookeeper/conf/zookeeper-env.sh
SERVER_JVMFLAGS="-Xmx512m -javaagent:/opt/zookeeper/jmx-exporter/jmx_prometheus_javaagent-0.12.0.jar=7070:/opt/zookeeper/conf/zookeeper-jmx-exporter.yml"
- Redémarrer Zookeeper
Serveur Solr
- Installation
# mkdir /opt/solr/jmx-exporter # wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.12.0/jmx_prometheus_javaagent-0.12.0.jar # mv jmx_prometheus_javaagent-0.12.0.jar /opt/solr/jmx-exporter/. # touch /opt/solr/jmx-exporter/solr-jmx-exporter.yml
- Configuration dans /etc/default/solr.in.sh. Ajouter à la fin du script la ligne suivante
SOLR_OPTS="$SOLR_OPTS -javaagent:/opt/solr/jmx-exporter/jmx_prometheus_javaagent-0.12.0.jar=7070:/opt/solr/jmx-exporter/solr-jmx-exporter.yml"
- Redémarrer Solr
Solr exporter
A installer sur les serveurs Solr uniquement.
L’exporter est fourni avec Solr. On suppose que Solr est installé dans le répertoire « /opt/solr/ » et qu’un utilisateur « solr » existe.
- Mise en place du script de démarrage « /etc/systemd/system/solr-exporter.service »
[Unit] Description=Prometheus Solr Exporter After=network-online.target [Service] User=solr Restart=on-failure ExecStart=/opt/solr/contrib/prometheus-exporter/bin/solr-exporter -p 9854 -z zk1:2181,zk2:2181,zk3:2181 -f /opt/solr/contrib/prometheus-exporter/conf/solr-exporter-config.xml -n 16 [Install] WantedBy=multi-user.target
- Activation et démarrage du service
# chmod +x /opt/solr/contrib/prometheus-exporter/bin/solr-exporter # systemctl daemon-reload # systemctl start solr-exporter # systemctl enable solr-exporter
Zookeeper exporter
A installer sur les serveurs Zookeeper uniquement.
L’exporter est disponible dans le repository github suivant : https://github.com/lucianjon/zk-exporter
L’installation se fait au moyen de go et git qu’il faut donc installer au préalable
- Installation de git et go
# yum install git.x86_64 # wget https://dl.google.com/go/go1.14.linux-amd64.tar.gz # tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz # echo "PATH=$PATH:$HOME/bin:/usr/local/go/bin" >> /root/.bash_profile # source ~/.bash_profile # rm go1.13.linux-amd64.tar.gz
- Installation de zk-exporter
# go get -u github.com/lucianjon/zk-exporter # mkdir /opt/zookeeper/zk-exporter # mv /root/go/bin/zk-exporter /opt/zookeeper/zk-exporter/.
- Mise en place du script de démarrage « /etc/systemd/system/zk-exporter.service »
[Unit] Description=Prometheus Zookeeper Exporter After=network-online.target [Service] User=zk Restart=on-failure ExecStart=/opt/zookeeper/zk-exporter/zk-exporter -port 7080 -servers localhost:2181 -pollinterval 15s [Install] WantedBy=multi-user.target
- Activation et démarrage du service
# systemctl daemon-reload # systemctl enable zk-exporter # systemctl start zk-exporter
Installation du serveur de monitoring
Cette installation a été faite sur un serveur Centos 8.0. La procédure décrite ici est au plus simple. Pour plus de détails de configuration, il faut se référer à la documentation de chaque produit.
Installation de Prometheus
Site : https://prometheus.io/
- Création d’un utilisateur « prometheus »
# useradd -d /home/prometheus prometheus
- Installation dans un répertoire « /opt/prometheus »
# mkdir /opt/prometheus # cd /opt/prometheus # wget https://github.com/prometheus/prometheus/releases/download/v2.13.0/prometheus-2.13.0.linux-amd64.tar.gz # tar xzf prometheus-2.13.0.linux-amd64.tar.gz # ln -s prometheus-2.13.0.linux-amd64 prometheus # mv prometheus/prometheus.yml /etc/default/. # rm prometheus-2.13.0.linux-amd64.tar.gz # chown -R prometheus: /opt/prometheus
- Mise en place du script de démarrage « /etc/systemd/system/prometheus.service »
[Unit] Description=Prometheus Server Documentation=https://prometheus.io/docs/introduction/overview/ After=network-online.target [Service] User=prometheus Restart=on-failure ExecStart=/opt/prometheus/prometheus/prometheus --config.file=/etc/default/prometheus.yml --storage.tsdb.path=/opt/prometheus/data [Install] WantedBy=multi-user.target
- Activation et démarrage du service
# systemctl daemon-reload # systemctl enable prometheus # systemctl start prometheus
Après démarrage, Prometheus est accessible à l’adresse http://<serveur_de_monitoring>:9090/
- Connexion de prometheus aux exporters
Dans /etc/default/prometheus.yml, ajouter pour chaque serveur Zookeeper et Solr les sections job_name.
Le paramètre targets indique les noms des serveurs et les ports pour les exporters
Les ports par défaut des exporters sont :
- node-exporter : 9100
- solr-exporter : 9854
- jmx-exporter : 7070
- zk-exporter : 7080
Pour notre environnement Solrcloud constitué de 3 serveurs Zookeeper (zk1, zk2, zk3) et 5 serveurs Solr (solr1, solr2, solr3, solr4 et solr5), nous avons ceci :
- job_name: 'solr_1' static_configs: - targets: ['solr1:9100', 'solr1:9854', 'solr2:7070'] - job_name: 'solr_2' static_configs: - targets: ['solr2:9100', 'solr2:9854', 'solr2:7070'] - job_name: 'solr_3' static_configs: - targets: ['solr3:9100', 'solr3:9854', 'solr2:7070'] - job_name: 'solr_4' static_configs: - targets: ['solr4:9100', 'solr4:9854', 'solr2:7070'] - job_name: 'solr_5' static_configs: - targets: ['solr5:9100', 'solr5:9854', 'solr2:7070'] - job_name: 'zk_1' static_configs: - targets: ['zk1:9100', 'zk1:7070', 'zk1:7080'] - job_name: 'zk_2' static_configs: - targets: ['zk2:9100', 'zk2:7070', 'zk2:7080'] - job_name: 'zk_3' static_configs: - targets: ['zk3:9100', 'zk3:7070', 'zk3:7080']
Installation de Grafana
Site : https://grafana.com/
- Installation par yum
# wget https://dl.grafana.com/oss/release/grafana-6.4.2-1.x86_64.rpm # yum install initscripts urw-fonts # yum localinstall grafana-6.4.2-1.x86_64.rpm # rm grafana-6.4.2-1.x86_64.rpm
- Activation et démarrage du service
# systemctl enable grafana-server # systemctl start grafana-server
Après démarrage, Grafana est accessible à l’adresse http://<serveur_de_monitoring>:3000/ (login admin / admin par défaut)
- Connexion de Grafana au serveur prometheus
Dans le menu « Configuration », sélectionner « Data Sources »
Cliquer sur « Add dada source »
Sélectionner un data source Prometheus
Configurer le datasource pour se connecter au serveur Prometheus localisé sur le même serveur (localhost).
Pour visualiser les différents métriques, il faut créer et configurer des dashboards. Il existe des dashboard pré-configurés comme point de départ à la création de dashboards sur mesure. Ils sont disponibles ici https://grafana.com/grafana/dashboards. Le plus simple est de chercher directement dans Google, afin d’en trouver l’identifiant, par exemple « grafana dashboard jmx zookeeper ».
Les identifiants des dashboards que j’ai sélectionné sont :
- Node Exporter Full : 1860
- Zookeeper Prometheus Dashboard : 9969
- JMX Overview : 3457
Pour Solr, un dashboard est fourni sous la forme d’un fichier json dans le répertoire « contrib/prometheus-exporter/conf/grafana-solr-dashboard.json »
Pour ajouter les dashboards dans Grafana
Puis cliquer sur « New dashboard »
Une fois les dashboards en place, il convient de les personnaliser à vos propres besoins. Cette étape est plutôt fastidieuse et il faut prendre en main la syntaxe des requêtes PromQL de Prometheus.
Voici un exemple basique de dashboard où sont monitorés principalement le load CPU de Zookeeper, le load et la charge CPU, les I/O disque et les GC de Solr.
Pour tester les requêtes PromQL lors de la configuration dans Grafana, Prometheus fournie une interface Web simpliste.
Et l’équivalent dans la configuration de Grafana
Conclusion
Dans cet article est décrit l’installation d’un environnement de monitoring Prometheus / Grafana dans le cadre de SolrCloud. L’installation en elle même est simple et rapide, par contre la configuration de Grafana peut être longue et cet aspect pourra faire l’objet d’un article séparé.
Vous souhaitez bénéficier d’une expertise Solr ou intégrer une ressource ponctuelle à vos projets ? Rendez vous sur la page Contact |