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 :
- Ajout de tmpfs (non retenu - contournement) :
tmpfs:
- /run
- Reset du storage Podman :
podman system prune -a --volumes
- Reboot du serveur:
sudo reboot
- J'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 :
- Fichier créé avec extension
.yamlau lieu de.yml - Le volume mount ne fonctionnait pas correctement
Solutions :
# Vérifier que le fichier existe
ls -lah ~/monitoring/prometheus/config/prometheus.yaml
# Utiliser la bonne extension dans la command du podman-compose.yaml
command:
- '--config.file=/etc/prometheus/prometheus.yaml'
et non
command:
- '--config.file=/etc/prometheus/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 :
- Socket n'existe pas
- Service en conteneur ne peut pas accéder au socket rootless
- Plusieurs instances en conflit
Diagnostic :
# Vérification que le socket existe
ls -lah /run/user/$(id -u)/podman/podman.sock
# Vérification des 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
En fait du faire une bêtise à un moment et lancer podman et d'autres en sudo ça m'a mis dans la sauce.
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 et parser les infos
# Query qui contient tout
podman_container_info
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 :
- Tester les queries dans Explore
- Identifier les labels disponibles
- Créer les panels manuellement
- 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
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 que j'ai trouvées
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)
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 pas besoin de les rajouter dans nft)
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