Le monitoring avec PROMETHEUS

Prometheus est un outil essentiel pour un DevOps. Il possède l’une des plus grandes communautés de contributeurs dans le monde open source et est la base de données préférée pour les métriques de type time séries. Il est actuellement le favori pour la surveillance des systèmes et des conteneurs. Ce court didacticiel vous montrera comment Prometheus fonctionne avec Docker et votre machine locale.

Prometheus surveille de nombreux types de systèmes, y compris celui sur lequel il s’execute. L’installation et la configuration peuvent donc varier d’un environnement à l’autre. Ce didacticiel est censé être une introduction de base à la configuration sur votre environnement local, sur Docker, sur Kubernetes.

Qu’est ce que PROMETHEUS ?

Prometheus est un système de surveillance de systèmes via l’exploitation de données times séries. Prometheus collecte, organise et stocke les métriques à l’aide d’identifiants et d’horodatages uniques. Les équipes DevOps et les développeurs interrogent ces données à l’aide d’un language qui lui est propre: PromQL, puis les visualisent dans une interface utilisateur telle que Grafana.

Prometheus est réputé pour de nombreuses raisons, mais l’une des plus importantes est sa longue liste d’intégrations faciles avec d’autres outils. Afin de faciliter ces connexions, Prometheus utilise des exportateurs au lieu d’agents pour communiquer.

Les exportateurs Prometheus

Aujourd’hui pour chaque outil DevOps majeur sur le marché de l’Open Source, il existe un exportateur spécifique lui permettant de déplacer ses métriques dans Prometheus. Le plus important d’entre eux est le Node_Exporter, pour exporter les métriques du système. La liste complète des exportateurs Prometheus est longue, mais quelques exemples critiques incluent :

Exportateurs disponibles

Les développeurs peuvent également choisir d’instrumenter le code pour les types de métriques Prometheus. Prometheus gère quatre bibliothèques clientes officielles pour les langages suivants : Go, Java/Scala, Python et Ruby. Mais en plus, les utilisateurs de Prometheus ont créé des bibliothèques pour les langages suivants : Bash, C, C++, Common Lisp, Dart, Elixir, Erlang, Haskell, Lua pour Nginx et Lua pour Tarantool, .NET / C#, Node.js, Perl, PHP, R, Rust

Installation de Prometheus (avec un node exportateur)

Télecharger le bon package du site officiel de prometheus.

wget https://github.com/prometheus/prometheus/releases/download/v*/prometheus-*.*-amd64.tar.gz
tar xvf prometheus-*.*-amd64.tar.gz
cd prometheus-*.*

Ensuite rajouté à votre path. Si par contre vous êtes sur Mac, l’installation se fera comme ceci:

brew install prometheus

Pour exécuter prometheus:

./prometheus --config.file=your_config.yml

Ensuite, vous devrez créer un utilisateur Prometheus (si vous n’en avez pas déjà un). À partir de là, créez un nouveau répertoire, un fichier de configuration et quelques autres éléments. Tout d’abord, commencez par le nouveau répertoire :

sudo mkdir -p $GOPATH/src/github.com/prometheus
cd $GOPATH/src/github.com/prometheus
sudo git clone https://github.com/prometheus/prometheus.git
cd prometheus
make build

Ensuite, créer un nouveau fichier de config prometheus via la commande touch ou vim:

sudo vim prometheus.yml

Configuration sur Docker

Une fois que vous avez docker de configurer su votre machine, vous pouvez recupérer l’image de prometheus sur le repository officiel de prom.

docker pull prom/prometheus

Ensuite vous pouvez demarrer le container en spécifiant via un bind mount votre fichier de config externe prometheus.yml. De cette façon le container utilisera votre config à vous.

$ docker run \
     -p 9090:9090 \
     -v /PATH/TO/prometheus.yml:/etc/prometheus/prometheus.yml \
     prom/prometheus

Maintenant, pour que Prometheus recupère les métrics de votre docker engine, modifiez le fichier daemon.json. Sous Linux, dirigez-vous vers /etc/docker/daemon.json. Dans Docker Desktop sur Mac ou Windows, suivez cette séquence : Docker Icon → Preferences → Docker Engine

Ensuite rajouter cette config dans le fichier.

{
  "metrics-addr" : "127.0.0.1:9323",
  "experimental" : true
}

Puis mettre à jour votre fichier prometheus.yml

#global config
global:
  scrape_interval:     15s
  evaluation_interval: 5s
  scrape_timeout:     1m
  #query_log_file: <string>
  external_labels:
    monitor: 'codelab-monitor'
# Scrape configs only contain one scrape target
scrape_configs:
  - job_name: 'prometheus'
    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']
    static_configs:
      - targets: [docker.for.mac:9323']

Installation des exportateurs des métrics de vos VMs et container docker

Node exporter

wget https://github.com/prometheus/node_exporter/releases/download/v*/node_exporter-*.*-amd64.tar.gz
tar xvfz node_exporter-*.*-amd64.tar.gz
cd node_exporter-*.*-amd64
./node_exporter

Si vous êtes sur Mac

brew install node_exporter
brew services start node_exporter

Ensuite de nouveau rajouter dans le fichier de config prometheus.yml

scrape_configs:
- job_name: node
  static_configs:
  - targets: ['localhost:9100']

L’exportateur ou encore node exporter permet d’exporter les métriques de vos machines dans leurs globalité(VMs)

brew install docker-compose

Une fois de plus, rajouter dans le fichier prometheus.yml la config suivante

scrape_configs:
- job_name: cadvisor
  scrape_interval: 5s
  static_configs:
  - targets:
    - cadvisor:8080

Ensuite, vous devrez modifier ou créer le fichier de configuration docker-compose.yml :

version: '3.2'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
    - 9090:9090
    command:
    - --config.file=/etc/prometheus/prometheus.yml
    volumes:
    - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
    depends_on:
    - cadvisor
  cadvisor:
    image: gcr.io/google-containers/cadvisor:latest
    container_name: cadvisor
    ports:
    - 8080:8080
    volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
    depends_on:
    - redis
  redis:
    image: redis:latest
    container_name: redis
    ports:
    - 6379:6379

Remarque : Une erreur courante avec les applications dont les ports par défaut sont 8080 (cAdvisor, Jenkins, JIRA, Apache Tomcat et en tant qu’alt pour HTTP) est que les tentatives d’activation d’un conteneur utilisant ce port renverront un message comme celui-ci :

Error response from daemon: Ports are not available: listen tcp 0.0.0.0:8080: bind: address already in use

Vous pouvez contourner ce problème en redirigeant vers un autre port. Arrêtez le conteneur actuel pour cAdvisor, puis lancez une nouvelle version :

docker container create -p 8081:8080 --name cadvisor-container google/cadvisor

À ce stade, vous pouvez vérifier que Node Exporter est en cours d’exécution en accédant à localhost:9100/metrics, ou en verifiant directement le terminal avec la commande suivante :

curl localhost:9100/metrics

Les métrics sur ce endpoint seront les même que prometheus extrait

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.