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
- Bases de données : Consul, CouchDB, Elasticsearch, MongoDB (et exportateur de requêtes MongoDB), MySQL, OpenTSDB, PostgreSQL, ProxySQL, Graphite, InfluxDB et Hadoop
Message brokers/fQueues : Redis, Kafka, RabbitMQ (et RabbitMQ Management Plugin exporter), Nagios / Naemon - Espaces de travail : Confluence et JIRA
- Serveurs : Apache, HAProxy et Nginx (bibliothèque de mesures et exportateur VTS)
- Cloud provideurs et leurs API : AWS ECS, AWS Health, AWS SQS, AWS CloudWatch, Azure Health, Azure Monitor, Google Stackdriver, DigitalOcean, Alibaba Cloudmonitor, Akamai Cloudmonitor
- Exportateurs pertinents pour la journalisation : Fluentd, Grok, exportateur JSON et Kibana
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