# Toujours et encore des problèmes de zinzin + troubleshooting

## 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 :**
```bash
# 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) :**
```yaml
   tmpfs:
     - /run
```

2. **Reset du storage Podman :**
```bash
   podman system prune -a --volumes
```

3. **Reboot du serveur:**
```bash
   sudo reboot
```

4. **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 :** 

1. Fichier créé avec extension `.yaml` au lieu de `.yml`
2. Le volume mount ne fonctionnait pas correctement

**Solutions :**
```bash
# 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 :**

1. **Socket n'existe pas**
2. **Service en conteneur ne peut pas accéder au socket rootless**
3. **Plusieurs instances en conflit**

**Diagnostic :**
```bash
# 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**
```bash
# 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 :**
```bash
# 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`**
```yaml
# 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**
```promql
# 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 :**

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
```bash
# 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
```bash
# 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
```bash
# 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 :**
```promql
count(podman_container_info)
```

**Conteneurs par état :**
```promql
sum by (state) (podman_container_state)
```

**CPU usage par conteneur :**
```promql
rate(podman_container_cpu_seconds_total[5m])
```

**Memory usage :**
```promql
podman_container_mem_usage_bytes
```

**System CPU usage :**
```promql
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
```

**System memory usage :**
```promql
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
```

**Disk usage :**
```promql
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 :**
```nft
# 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.sanjy.fr`
- [ ] Dashboard services fonctionne
- [ ] Certificat SSL valide
- [ ] Logs propres : `podman-compose logs --tail=50`

---