Monitoring SolrCloud avec Prometheus et Grafana

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.

Architecture Prometheus

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.9.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.9/jmx_prometheus_javaagent-0.9.jar
# mv /jmx_prometheus_javaagent-0.9.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.9.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 »

Grafana Configuration

Cliquer sur « Add dada source »

Grafana Configuration Datasource

Sélectionner un data source Prometheus

Grafana sélection datasource

Configurer le datasource pour se connecter au serveur Prometheus localisé sur le même serveur (localhost).

Grafana Configuration datasource

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

Grafana Configuration dashboard

Puis cliquer sur « New dashboard »

Grafana Configuration 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.

Grafana dashboard cpu load
Grafana dashboard jvm gc

Pour tester les requêtes PromQL lors de la configuration dans Grafana, Prometheus fournie une interface Web simpliste.

Prometheus graphe

Et l’équivalent dans la configuration de Grafana

Grafana graphe

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