Table des matières

Monitoring

Monitoring Containerized Application Health with Docker

Niveaux de monitoring

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

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:

Exporters:

Applications .NET Framework:

NodeJS

Exposer des métriques de Docker

Docker Metrics:

Activer les metrics dans Docker:

Documentation officielle

  1. 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:

Commit:

$ docker container commit 11sha vps/grafana:0.0.1