Table des matières
Monitoring
Monitoring Containerized Application Health with Docker
Niveaux de monitoring
- Server
- App
- Hardware
Les applications nécessaires
Architecture
Prometheus
Utiliser un container pour rouler Prometheus.
L,avantage de rouler Promethus dans un container c'est d'utiliser le management de Docker, d'utiliser sa sécurité, sa containabilité et sa portabilité. De plus, les containers peuvent être privés (accessible que du réseau de Docker et non de l'extérieur) et seul Graphana par la suite sera public pour pouvoir le consulter.
Image officielle: prom/prometheus.
docker container run \ --detach --publish-all \ prom/prometheus:v2.29.2
Changer la version 2.29.2 par la version actuelle.
Prometheus Configuration
global: scrape_interval: 10s external_labels: monitor: 'local-monitor'
Scrape configs:
scrape_configs: - job_name: 'netfx-app' metrics_path: /metrics/ static_configs: - targets: ['netfx:50506']
Pour Docker Servers:
- job_name: 'docker-managers' scrape_interval: 15s metrics_path: /metrics static_configs: - targets: ['host.docker.internal:50501'] - job_name: 'docker-workers' scrape_interval: 15s metrics_path: /metrics static_configs: - targets: ['host.docker.internal:50501']
Le host.docker.internal
est résolvé par Docker comme étant le IP de la machine hôte.
Copie de la configuration avec un Dockerfile:
FROM prom/prometheus:v2.29.2 COPY prometheus.yml /etc/prometheus/prometheus.yml
Service discovery
Dynamic discovery of services (in context of swarm and production):
- job_name: 'netfx-app' metrics_path: /metrics/ dns_sd_configs: - names: - tasks.netfx type: A port: 50506
Data Types
- Counter
- Simple number
- Always increases
- Gauge
- Simple number
- Increase or decrease
- Histograms and Summaries
- Groups of samples
- Record count of sample …….
docker container ls --all --filter status=exited --format "{{ .ID }}" docker container rm $(docker container ls --all --filter status=exited --format "{{ .ID }}")
Queries
Utilise PromQL
Exemples de queries dans Prometheus:
engine_daemon_container_states_containers{job="docker-managers", state="running"}
Ici, les requêtes HTTP des services commençant par docker-
depuis les 30 dernières secondes:
http_requests_total{job=~"docker-.*"}[30s]
Avec le bouton Add Graph, on peut ajouter une expression:
sum(irate(http_request_total[5m]))
Exposer des metrics d'exécution
Exposer des métriques:
- Utiliser un utilitaire exportateur de métrique
- Exporter dans le format de Prometheus
Exporters:
- Blackbox Exporter (HTTP, SSL, DNS, etc)
Applications .NET Framework:
NodeJS
Exposer des métriques de Docker
Docker Metrics:
- Engine: CPU Count, Memory size, CPU Architecture, Operating system, Docker Version
- Builds: Triggered count, Cancelled count, Failure count (Syntax error, Empty dockerfile, Command Error)
- Containers: Container count (by state), Action duration (Create and start), Healthchecks (Fired and failed)
Activer les metrics dans Docker:
- Créer (voir Configure the Docker Daemon) ou éditer le fichier
/etc/docker/daemon.json
{ "metrics-addr" : "0.0.0.0:50501", "experimental" : true }
Restart Docker:
$ sudo systemctl restart docker
Vérifier que le endpoint fonctionne:
$ sudo lsof -Pi TCP -a -c dockerd
et / ou
$ wget localhost:9323/metrics
Faire en sorte que le host accepte les connections du container:
$ sudo iptables -A INPUT -i docker0 -j ACCEPT
Dans le fichier prometheus.yml
, configuration minimale pour le scrape_config
de Docker:
- job_name: 'docker' static_configs: - targets: ['172.17.0.1:50501']
Dockerfile:
FROM prom/prometheus:v2.29.2 COPY prometheus.yml /etc/prometheus/prometheus.yml
$ docker build -t prometheus-vps:0.4.2 . $ docker container run --detach --publish published=49155,target=9090,protocol=tcp --add-host=host.docker.internal:host-gateway --name prometheus-vps prometheus-vps:0.4.2
Version non publiée:
$ docker container run -d --add-host=host.docker.internal:host-gateway --name prometheus-vps prometheus-vps:0.5.1
$ docker container run -d -p 49155:9090 --add-host=host.docker.internal:host-gateway --name prometheus prometheus-vps:0.5.2
Commandes de gestion du container prometheus:
$ docker logs prometheus-vps $ docker container rm -f prometheus-vps
Metrics de la machine
Utiliser Node Explorer
$ docker container run -d -p 9100:9100 --net="host" --name node-exporter prom/node-exporter $ docker container run -d --net="host" --name node-exporter prom/node-exporter
Config:
- job_name: 'machine' static_configs: - targets: ['172.17.0.1:9100']
Autres
Prometheus Config Examples
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'docker' tls_config: insecure_skip_verify: true static_configs: - targets: ['host.docker.internal:9323']
Grafana
Construire des dashboards avec Grafana.
Image officielle sur Docker Hub: grafana/grafana et Grafana Dashboards.
$ docker container run -d -p 13000:3000 --network bridge grafana/grafana:8.1.3
Default image config for user:pass : admin:admin
Dashboards:
- Prometheus 2.0 Stats (suggéré à même Grafana dans l'onglet Dashboards)
- Node Exporter ID: 1860
- Blackbox ID: 7587
Commit:
$ docker container commit 11sha vps/grafana:0.0.1