RousselTMLEARNING

Observabilité

Prometheus : visualiser ses métriques (UI, Grafana et dashboards)

Visualiser les données Prometheus : interface web, graphes PromQL, connexion à Grafana, dashboards RED et USE, variables, import de dashboards et alertes Grafana.

1. L'interface native de Prometheus #

Un outil d'exploration.

Que permet l'UI Prometheus ? #

L'interface web de Prometheus (port 9090) est conçue pour explorer : tester une requête PromQL, vérifier l'état des cibles (Status > Targets), consulter les règles et les alertes. Elle n'est pas faite pour construire des tableaux de bord durables : pour cela on utilise Grafana.

# Vérifications rapides en ligne de commande
curl -s http://localhost:9090/-/healthy
curl -s 'http://localhost:9090/api/v1/targets' | jq '.data.activeTargets[] | {job: .labels.job, health: .health}'
curl -s 'http://localhost:9090/api/v1/query?query=up' | jq '.data.result[] | {instance: .metric.instance, up: .value[1]}'
curl -s 'http://localhost:9090/api/v1/query_range?query=rate(node_cpu_seconds_total[5m])&start=2026-10-18T08:00:00Z&end=2026-10-18T09:00:00Z&step=60'

2. Connecter Grafana à Prometheus #

Une stack complète en 2 minutes.

Docker Compose et provisioning #

Prometheus et Grafana
Grafana ne stocke aucune métrique : il interroge la source de données.
# docker-compose.yml
services:
  prometheus:
    image: prom/prometheus:latest
    ports: ["9090:9090"]
    volumes: ["./prometheus.yml:/etc/prometheus/prometheus.yml"]
  node-exporter:
    image: prom/node-exporter:latest
    ports: ["9100:9100"]
  grafana:
    image: grafana/grafana:latest
    ports: ["3000:3000"]
    volumes: ["./provisioning:/etc/grafana/provisioning"]
# provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    url: http://prometheus:9090
    isDefault: true
    jsonData: { timeInterval: 15s }
docker compose up -d
# Grafana : http://localhost:3000 (admin / admin)  ->  Explore -> Prometheus

3. Construire de bons tableaux de bord #

Les méthodes RED et USE.

La méthode USE pour les ressources #

Utilisation, Saturation, Erreurs : à appliquer à chaque ressource (CPU, mémoire, disque, réseau).

# Utilisation CPU (%)
100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[$__rate_interval])) * 100

# Saturation CPU (charge par cœur)
node_load1 / count by (instance) (node_cpu_seconds_total{mode="idle"})

# Mémoire utilisée (%)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# Utilisation disque (%)
100 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes * 100)

# Débit réseau (octets/s)
sum by (instance) (rate(node_network_receive_bytes_total{device!="lo"}[$__rate_interval]))

La méthode RED pour les services #

Rate (requêtes/s), Errors (taux d'erreur), Duration (latence) : à appliquer à chaque service.

# Rate
sum by (service) (rate(http_requests_total[$__rate_interval]))

# Errors (%)
100 * sum by (service) (rate(http_requests_total{status=~"5.."}[$__rate_interval]))
    / sum by (service) (rate(http_requests_total[$__rate_interval]))

# Duration p95
histogram_quantile(0.95, sum by (le, service) (rate(http_request_duration_seconds_bucket[$__rate_interval])))

Variables et import de dashboards #

# Variable "instance" (Dashboard settings > Variables > Query)
label_values(node_uname_info, nodename)
# Utilisation dans un panneau : node_load1{instance=~"$instance"}

# Importer le dashboard communautaire "Node Exporter Full" (ID 1860)
# Dashboards > New > Import > 1860 > choisir la source Prometheus
Bonne Pratique : Utilisez $__rate_interval plutôt qu'une fenêtre fixe comme [5m] : Grafana l'adapte à la résolution du graphe et à l'intervalle de scrape.
Erreur Courante : Éviter les panneaux qui agrègent des centaines de séries à haute cardinalité : le navigateur et Prometheus saturent. Filtrez par variable et utilisez topk(10, ...).

Pour aller plus loin