7.1 Configurazione del monitoraggio con Prometheus
In questo step vedremo come configurare il monitoraggio e il logging per la nostra applicazione multi-contenitore. Questo ci permetterà di tenere traccia dello stato e delle performance dei servizi, oltre a raccogliere e analizzare i log per diagnosticare i problemi.
Obiettivo: raccogliere metriche dai servizi e visualizzarle per monitorare le performance e lo stato dell'applicazione.
Installazione e configurazione di Prometheus
In questo esempio, Prometheus viene avviato usando Docker. Questo assicura la portabilità tra piattaforme e permette di implementare il monitoraggio in modo efficiente su qualsiasi sistema operativo che supporti Docker.
1. Creazione di una directory per la configurazione di Prometheus:
mkdir prometheus
cd prometheus
2. Creazione del file di configurazione 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. Creazione del Dockerfile per Prometheus:
FROM prom/prometheus
COPY prometheus.yml /etc/prometheus/prometheus.yml
4. Aggiunta di Prometheus in 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 Installazione e configurazione di Grafana
1. Creazione di una directory per la configurazione di Grafana:
mkdir grafana
cd grafana
2. Creazione di un Dockerfile per Grafana:
FROM grafana/grafana
3. Aggiunta di Grafana in docker-compose.yml
:
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
4. Configurazione di Grafana per lavorare con Prometheus:
- Avvia i container con il comando
docker compose up
. - Vai all'interfaccia web di Grafana all'indirizzo
http://localhost:3033
. - Effettua il login usando le credenziali standard (admin/admin).
- Vai a
"Configuration"
->"Data Sources"
e aggiungi una nuova fonte dati. - Seleziona
"Prometheus"
e specifica l'URLhttp://prometheus:9090
. - Salva le impostazioni.
Creazione di dashboard in Grafana
- Creazione di un nuovo dashboard:
- Vai a
"Create"
->"Dashboard"
. - Clicca su
"Add new panel"
. - Nella sezione
"Query"
seleziona la fonte datiPrometheus
. - Inserisci una query
PromQL
per ottenere le metriche. Per esempio, per monitorare l'utilizzo delCPU
:
- Vai a
- Configurazione del pannello (Panel):
- Seleziona il tipo di grafico (per esempio, "Graph").
- Configura il pannello (per esempio, nome, leggenda, assi, ecc.).
- Clicca su
"Apply"
per salvare il pannello.
- Creazione di pannelli aggiuntivi:
- Ripeti i passaggi per creare pannelli aggiuntivi per altre metriche come memoria, rete e disco.
rate(container_cpu_usage_seconds_total[1m])
7.3 Configurazione ELK Stack
Configurazione della registrazione con ELK Stack (Elasticsearch, Logstash, Kibana)
.
Obiettivo: raccogliere, conservare e analizzare i log dai nostri servizi.
Installazione e configurazione di Elasticsearch
Aggiunta di Elasticsearch
in compose.yaml
:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
Installazione e configurazione di Logstash
Passo 1. Creazione di una directory per la configurazione di Logstash:
mkdir logstash
cd logstash
Passo 2. Creazione del file di configurazione logstash.conf
:
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "docker-logs-%{+YYYY.MM.dd}"
}
}
Passo 3. Creazione di un Dockerfile per Logstash
:
FROM docker.elastic.co/logstash/logstash:8.15.0
COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf
Passo 4. Aggiunta di Logstash in compose.yaml
:
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
Installazione e configurazione di Kibana
Aggiunta di Kibana in compose.yaml
:
kibana:
image: docker.elastic.co/kibana/kibana:8.15.0
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
Installazione di Filebeat per la raccolta dei log
Passo 1. Creazione di una directory per la configurazione di Filebeat:
mkdir filebeat
cd filebeat
Passo 2. Creazione del file di configurazione filebeat.yml
:
filebeat.inputs:
- type: docker
containers.ids:
- '*'
processors:
- add_docker_metadata: ~
output.logstash:
hosts: ["logstash:5044"]
Passo 3. Creazione di un Dockerfile per Filebeat:
FROM docker.elastic.co/beats/filebeat:8.15.0
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
Passo 4. Aggiunta di Filebeat in compose.yaml
:
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
7.4 File completo
File completo 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