Skip to main content

Toujours et encore des problèmes de zinzin

Problèmes rencontrés et solutions

Problème 1 : Port 9090 déjà utilisé

Erreur :

Error: unable to start container: rootlessport listen tcp 0.0.0.0:9090: bind: address already in use

Cause : Le port 9090 était utilisé par systemd (service websm).

Solution :

# Vérifier qui utilise le port
sudo lsof -i :9090

# Changer le port de Prometheus dans docker-compose.yml
ports:
  - "9091:9090"  # Port hôte 9091, conteneur 9090

Problème 2 : Erreur .containerenv manquant

Le problème qu'il y avait avec cadvisor (au début je voulais l'utiliser à la place de l'image prometheus-podman-exporter)

Erreur :

crun: open `/home/almalinux/.local/share/containers/storage/overlay/.../merged/run/.containerenv`: 
No such file or directory

Cause : Problème avec le storage overlay de Podman après des suppressions brutales de conteneurs.

Solutions testées :

  1. Ajout de tmpfs (non retenu - contournement) :
   tmpfs:
     - /run
  1. Reset du storage Podman :
   podman system prune -a --volumes
  1. Reboot du serveur (solution finale) :serveur:
   sudo reboot

  1. ExplicationJ'ai dégagé cadvisor pour autre chose (solution finale) :

Le reboot nettoie les mounts overlay résiduels et recrée un état propre.


Problème 3 : Prometheus ne trouve pas sa config

Erreur :

Error loading config: open /etc/prometheus/prometheus.yml: no such file or directory

Cause : 

  1. Fichier créé avec extension .yaml au lieu de .yml
  2. Le volume mount ne fonctionnait pas correctement

Solutions :

# Vérifier que le fichier existe
ls -lah ~/monitoring/prometheus/config/prometheus.yaml

# Fix SELinux
sudo chcon -R -t container_file_t ~/monitoring/prometheus/

# Utiliser chemin absolu dans docker-compose.yml si nécessaire
volumes:
  - /home/almalinux/monitoring/prometheus/config:/etc/prometheus:Z

# Ou renommer en .yml
mv prometheus.yaml prometheus.yml

Problème 4 : Podman Exporter - Permission denied sur socket

Erreur :

unable to connect to Podman socket: dial unix /run/user/1000/podman/podman.sock: 
connect: permission denied

Causes multiples :

  1. Socket n'existe pas
  2. Service en conteneur ne peut pas accéder au socket rootless
  3. Plusieurs instances en conflit

Diagnostic :

# Vérifier que le socket existe
ls -lah /run/user/$(id -u)/podman/podman.sock

# Vérifier les process en cours
ps aux | grep prometheus-podman-exporter

# Vérifier qui utilise le port
sudo lsof -i :9882

Solution finale : Service systemd user

# Désactiver toutes les instances
sudo systemctl disable --now prometheus-podman-exporter
systemctl --user disable --now prometheus-podman-exporter
sudo pkill -9 -f prometheus-podman-exporter

# Créer le service Podman API
systemctl --user enable --now podman-api

# Créer le service exporter
systemctl --user enable --now prometheus-podman-exporter

# Vérifier qu'il n'y a qu'une instance
ps aux | grep prometheus-podman-exporter | grep -v grep

Pourquoi cette solution ?

  • Le service user a accès direct au socket rootless
  • Pas de problème de mapping UID/permissions
  • Plus stable que l'approche conteneur pour rootless

Problème 5 : Prometheus ne peut pas scraper localhost depuis le conteneur

Erreur : Targets podman_exporter et node_exporter en état "down".

Cause : Prometheus (conteneur) ne peut pas atteindre localhost:9882 (hôte).

Diagnostic :

# Depuis l'hôte, ça marche
curl http://localhost:9882/metrics

# Mais Prometheus (conteneur) ne voit pas localhost de l'hôte

Solution : Utiliser host.containers.internal

# Dans prometheus.yaml
- job_name: 'podman_exporter'
  static_configs:
    - targets: ['host.containers.internal:9882']

# Dans docker-compose.yml
prometheus:
  extra_hosts:
    - "host.containers.internal:host-gateway"

Résultat : Tous les targets passent à "up" ✅


Problème 6 : Labels name manquants dans podman_container_state

Observation :

podman_container_state{id="abc123", ...} 1

Pas de label name !

Cause : Podman Exporter ne retourne pas toujours tous les labels dans toutes les métriques.

Solution : Utiliser podman_container_info avec join

# Query qui combine les deux métriques
podman_container_info * on(id) group_left(name) podman_container_state

Résultat :

{name="jenkins", id="...", state="running"} 1
{name="vault", id="...", state="running"} 1

Problème 7 : Dashboards communautaires vides

Cause : Les dashboards attendent des métriques ou labels spécifiques qui ne correspondent pas exactement.

Solution : Créer des dashboards custom adaptés aux métriques réellement disponibles.

Méthode :

  1. Tester les queries dans Explore
  2. Identifier les labels disponibles
  3. Créer les panels manuellement
  4. Adapter les value mappings

Commandes de maintenance

Gestion des services

# Status de tous les services
podman ps
systemctl --user status podman-api
systemctl --user status prometheus-podman-exporter

# Restart complet du stack
cd ~/monitoring
podman-compose restart

# Logs
podman-compose logs -f prometheus
podman-compose logs -f grafana
journalctl --user -u prometheus-podman-exporter -f

Vérification des métriques

# Node Exporter
curl http://localhost:9100/metrics | grep node_cpu

# Podman Exporter
curl http://localhost:9882/metrics | grep podman_container

# Prometheus targets
curl http://localhost:9091/api/v1/targets | jq '.data.activeTargets[] | {job: .labels.job, health: .health}'

# Query spécifique
curl -G http://localhost:9091/api/v1/query \
  --data-urlencode 'query=podman_container_info' | jq

Reload configuration Prometheus

# Sans restart
podman exec prometheus kill -HUP 1

# Ou restart complet
podman restart prometheus

Backup

# Backup volumes
podman volume export prometheus_data > prometheus-backup.tar
podman volume export grafana_data > grafana-backup.tar

# Backup configs
tar -czf monitoring-config.tar.gz ~/monitoring/

Restore

# Restore volume
podman volume create prometheus_data
cat prometheus-backup.tar | podman volume import prometheus_data -

Ressources

Documentation

  • Prometheus : https://prometheus.io/docs/
  • Grafana : https://grafana.com/docs/
  • Node Exporter : https://github.com/prometheus/node_exporter
  • Podman Exporter : https://github.com/containers/prometheus-podman-exporter

Queries PromQL utiles

Nombre de conteneurs :

count(podman_container_info)

Conteneurs par état :

sum by (state) (podman_container_state)

CPU usage par conteneur :

rate(podman_container_cpu_seconds_total[5m])

Memory usage :

podman_container_mem_usage_bytes

System CPU usage :

100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

System memory usage :

(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

Disk usage :

100 - ((node_filesystem_avail_bytes{mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes{mountpoint="/",fstype!="rootfs"}) * 100)

Dashboards Grafana recommandés

Pour création manuelle :

  • System Overview : CPU, RAM, Disk, Network
  • Container Status : État des conteneurs critiques
  • Container Resources : CPU/RAM par conteneur
  • Alerts : Services down, seuils dépassés

Configuration réseau complète

Ports utilisés :

80      HTTP (redirect HTTPS)
443     HTTPS (Nginx)
3000    Grafana (localhost)
8080    Nginx status (localhost)
9091    Prometheus (localhost)
9100    Node Exporter (localhost)
9113    Nginx Exporter (localhost, optionnel)
9882    Podman Exporter (localhost)

Firewall nftables :

# Monitoring (localhost only)
tcp dport { 3000, 9091, 9100, 9882 } ip saddr 127.0.0.1 accept

# HTTPS public
tcp dport { 80, 443 } accept

Checklist de vérification

  • Tous les conteneurs UP : podman ps
  • Services systemd actifs : systemctl --user status podman-api prometheus-podman-exporter
  • Socket Podman existe : ls /run/user/$(id -u)/podman/podman.sock
  • Prometheus targets UP : curl http://localhost:9091/api/v1/targets | jq
  • Grafana accessible : https://grafana.sanjyasz.pro
  • Dashboard services fonctionne
  • Certificat SSL valide
  • Logs propres : podman-compose logs --tail=50