Monitoring Containerized Application Health with Docker
Niveaux de monitoring
Les applications nécessaires
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.
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
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
docker container ls --all --filter status=exited --format "{{ .ID }}" docker container rm $(docker container ls --all --filter status=exited --format "{{ .ID }}")
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 métriques:
Exporters:
Applications .NET Framework:
NodeJS
Docker Metrics:
Activer les metrics dans Docker:
/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
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']
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']
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:
Commit:
$ docker container commit 11sha vps/grafana:0.0.1