Monitoring Open Source avec Prometheus

Dans ce billet je présente une courte procédure afin de déployer une solution de monitoring open source avec Prometheus et Pushgateway. On pourra générer des graphiques avec Grafana accessible via une interface web. Le billet présente le déploiement et pas une configuration poussée de grafana qui fera l’objet d’un autre billet. A la fin de ce billet vous aurez un aperçu et une suite fonctionnel pour un labo.

Vue d’ensemble de l’architecture de Prometheus

Pour résumer le fonctionnement de ce billet nous aurons

  • Script Bash : Il va s’occuper d’envoyer toutes les 1 seconde les mesures vers Pushgateway
  • Pushgateway : Va permettre de mettre en cache les mesures envoyé par le script bash
  • Prometheus : Qui déploie une base de donnée et va récupérer la data sur Pushgateway
  • Grafana : Qui va nous permettre de créer un frontend avec graphiques des données stocké dans Prometheus

On débute par l’installation de Pushgateway, puis sa mise en service, pensez à adapter les téléchargements suivant votre distribution et les éventuelles nouvelles versions

wget https://github.com/prometheus/pushgateway/releases/download/v1.0.1/pushgateway-1.0.1.linux-amd64.tar.gz && \
tar -xvzf pushgateway-1.0.1.linux-amd64.tar.gz && \
cd pushgateway-1.0.1.linux-amd64 && \
./pushgateway

A cette étape pushgateway passe en écoute sur le port 9091

On peut à présent installer Prometheus

wget https://github.com/prometheus/prometheus/releases/download/v2.15.2/prometheus-2.15.2.linux-amd64.tar.gz && \
tar -xvzf prometheus-2.15.2.linux-amd64.tar.gz && \
cd prometheus-2.15.2.linux-amd64

Avant de démarrer prometheus on doit lui indiquer ou récupérer la data, on va donc éditer le fichier de configuration prometheus.yml

nano prometheus.yml

On passe scrape_interval sur 1s et on ajoute dans le static configs localhost:9091(pushgateway)

# my global config
global:
  scrape_interval:     1s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090', 'localhost:9091']

Tout est prêt on peut executer prometheus, une fois en fonctionnement vous devriez pouvoir accéder au frontend sur : http://192.168.1.42:9090/targets afin de vérifier la bonne prise en compte de la pushgateway

./prometheus

On passe à la dernière partie d’installation et execution de Grafana, une fois le serveur en route vous devriez pouvoir accéder au frontend sur : http://127.0.0.1:3000, le couple identifiant/mot de passe est admin/admin

wget https://dl.grafana.com/oss/release/grafana-6.5.3.linux-amd64.tar.gz && \
tar -xvzf grafana-6.5.3.linux-amd64.tar.gz && \
cd grafana-6.5.3/bin && \
./grafana-server

Pour rendre le tout fonctionnel on doit indiquer à grafana que Prometheus est une source de données

Add data source
Prometheus
Scrape interval: 1s
HTTP Method: GET

Lors de la validation vous devriez avoir : Data source is working

Tout est en place, on peut commencer à envoyer la data de notre serveur vers la pushgateway qui sera elle même interrogé par prometheus. Pour que tout cela fonctionne ensemble il faut transmettre à pushgateway des données sous la forme clé-valeur. (Pushgateway et Prometheus fonctionne ainsi)

Exemple :

cpu_usage 16.04 #Le processeur(clé) est utilisé a 16.04%(valeur)
cpu_usage{process="apache2", pid="21"}(clé) 2.21(valeur)

Exemple de script pour le CPU Usage source

#!/bin/bash
# Parsing ps aux lines, formats them and sends them to pushgateway.
while sleep 1
do
z=$(ps aux)
var=""
while read -r z
do
   var=$var$(awk '{print "cpu_usage{process=""$11"", pid=""$2""}", $3z}');
done <<< "$z"
echo "$var"
curl -X POST -H  "Content-Type: text/plain" --data "$var
"
http://localhost:9091/metrics/job/top/instance/machine
done

Exemple de script pour Memory Usage source

#!/bin/bash
# Parsing ps aux lines, formats them and sends them to pushgateway.
while sleep 1
do
z=$(ps aux)
var=""
while read -r z
do
   var=$var$(awk '{print "memory_usage{process=""$11"", pid=""$2""}", $4z}');
done <<< "$z"
echo "$var"
curl -X POST -H  "Content-Type: text/plain" --data "$var
"
http://localhost:9091/metrics/job/top/instance/machine
done

On exécute le script, et la data doit commencer à arriver dans prometheus. On peut effectuer une recherche avec « cpu_usage » ou memory_usage sur : http://127.0.0.1:9090/graph (sur Prometheus)

Pour visualiser rapidement votre data dans grafana faite un nouveau dashboard, choississez le type de graphique puis dans « Metrics » recherchez la data à visualiser
ex : cpu_usage
Ici un exemple de rendue très rapide, tout tourne sur le même serveur donc c’est assez brouillon, l’bojectif du billet étant le déploiement votre ensemble est fonctionnel.

Laisser un commentaire