7.1 Configuration de la surveillance avec Prometheus
À cette étape, on va voir comment configurer la surveillance et la journalisation pour notre application multi-conteneurs. Ça permettra de suivre l'état et la performance des services, ainsi que de collecter et analyser les logs pour diagnostiquer des problèmes.
Objectif: collecter des métriques des services et les visualiser pour surveiller la performance et l'état de l'application.
Installation et configuration de Prometheus
Dans cet exemple, Prometheus est lancé avec Docker. Ça offre une compatibilité multiplateforme et permet de déployer efficacement la surveillance sur n'importe quel système d'exploitation prenant en charge Docker.
1. Création d'un répertoire pour la configuration de Prometheus :
mkdir prometheus
cd prometheus
2. Création d'un fichier de configuration prometheus.yml
:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'flask-app'
static_configs:
- targets: ['backend:5000']
- job_name: 'node-app'
static_configs:
- targets: ['frontend:3000']
3. Création d'un Dockerfile pour Prometheus :
FROM prom/prometheus
COPY prometheus.yml /etc/prometheus/prometheus.yml
4. Ajout de Prometheus dans compose.yaml
:
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
nginx:
build: ./nginx
ports:
- "80:80"
depends_on:
- frontend
- backend
networks:
- task-network
prometheus:
build: ./prometheus
ports:
- "9090:9090"
networks:
- task-network
networks:
task-network:
driver: bridge
volumes:
db-data:
7.2 Installation et configuration de Grafana
1. Création d'un répertoire pour la configuration de Grafana :
mkdir grafana
cd grafana
2. Création du Dockerfile pour Grafana :
FROM grafana/grafana
3. Ajout de Grafana dans docker-compose.yml
:
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
4. Configuration de Grafana pour fonctionner avec Prometheus :
- Lancez les conteneurs avec
docker compose up
. - Rendez-vous sur l'interface web de Grafana à l'adresse
http://localhost:3033
. - Connectez-vous avec les identifiants par défaut (admin/admin).
- Accédez à
"Configuration"
->"Data Sources"
et ajoutez une nouvelle source de données. - Choisissez
"Prometheus"
et spécifiezURL http://prometheus:9090
. - Sauvegardez la configuration.
Création de tableaux de bord dans Grafana
- Création d'un nouveau tableau de bord :
- Allez dans
"Create"
->"Dashboard"
. - Cliquez sur
"Add new panel"
. - Dans la section
"Query"
, sélectionnez la source de donnéesPrometheus
. - Entrez une requête
PromQL
pour obtenir les métriques. Par exemple, pour surveiller l'utilisation duCPU
:
- Allez dans
- Configuration du panneau (Panel) :
- Sélectionnez le type de graphique (par exemple, "Graph").
- Configurez le panneau (par exemple, nom, légende, axes, etc.).
- Cliquez sur
"Apply"
pour sauvegarder le panneau.
- Création de panneaux supplémentaires :
- Répétez les étapes pour créer des panneaux supplémentaires pour d'autres métriques comme la mémoire, le réseau et le disque.
rate(container_cpu_usage_seconds_total[1m])
7.3 Configuration du ELK Stack
Configuration de la journalisation avec ELK Stack (Elasticsearch, Logstash, Kibana)
.
Objectif : collecter, stocker et analyser les logs de nos services.
Installation et configuration de Elasticsearch
Ajout de Elasticsearch
dans compose.yaml
:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
Installation et configuration de Logstash
Étape 1. Création du répertoire pour la configuration de Logstash :
mkdir logstash
cd logstash
Étape 2. Création du fichier de configuration logstash.conf
:
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "docker-logs-%{+YYYY.MM.dd}"
}
}
Étape 3. Création du Dockerfile pour Logstash
:
FROM docker.elastic.co/logstash/logstash:8.15.0
COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf
Étape 4. Ajout de Logstash dans compose.yaml
:
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
Installation et configuration de Kibana
Ajout de Kibana dans compose.yaml
:
kibana:
image: docker.elastic.co/kibana/kibana:8.15.0
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
Installation de Filebeat pour collecter les logs
Étape 1. Création du répertoire pour la configuration de Filebeat :
mkdir filebeat
cd filebeat
Étape 2. Création du fichier de configuration filebeat.yml
:
filebeat.inputs:
- type: docker
containers.ids:
- '*'
processors:
- add_docker_metadata: ~
output.logstash:
hosts: ["logstash:5044"]
Étape 3. Création du Dockerfile pour Filebeat :
FROM docker.elastic.co/beats/filebeat:8.15.0
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
Étape 4. Ajout de Filebeat dans compose.yaml
:
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
7.4 Fichier complet
Fichier complet compose.yaml
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
nginx:
build: ./nginx
ports:
- "80:80"
depends_on:
- frontend
- backend
networks:
- task-network
prometheus:
build: ./prometheus
ports:
- "9090:9090"
networks:
- task-network
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
kibana:
image: docker.elastic.co/kibana/kibana:7.9.2
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
networks:
task-network:
driver: bridge
volumes:
db-data:
GO TO FULL VERSION