FEAT: Télémétrie agent — OS, conteneur Docker & réseau (host vs container, IPs, températures) #85

Closed
opened 2026-08-12 10:16:26 +02:00 by nonobis · 0 comments
Owner

🎯 Contexte

Compléter la photo machine : OS/kernel, hostname réel, infos conteneur (ID, image, limites cgroup), interfaces réseau/IP, température système. Objectif : en cas d'incident sur un site distant, le central doit pouvoir dire « cet agent tourne dans tel conteneur, sur tel OS, avec telle IP, et le host a tel uptime » — sans SSH.

📚 Référence spec / décision

Décision : collecte host + conteneur, remontée distincte.

  • OS : /etc/os-release (PRETTY_NAME), uname -r (kernel), uname -m (arch) — attention : dans le conteneur, /etc/os-release est celui du conteneur (Debian slim) ; le host est visible si /etc/hostname monté ou via lscpu/dmi
  • Docker : HOSTNAME env, /proc/self/cgroup (ID conteneur), /.dockerenv (indicateur), limites cgroup CPU/mémoire
  • Matériel host : /sys/class/dmi/id/product_name, board_vendor, board_name (si monté/lisible) — nom du PC serveur
  • Réseau : interfaces (/proc/net/dev), IP (ip/ifconfig si dispo, sinon parsing), MAC, débit ?
  • Température : /sys/class/thermal/thermal_zone*/temp (CPU/board), sensors si dispo
  • Uptime machine : /proc/uptime (≠ uptime du process actuel)

🔍 État actuel (vérifié dans le code)

Agent : Hostname (déjà envoyé au register), Version (agent), PublicIp (via ipify/ifconfig.me au register). SystemMetricsProvider calcule UptimeSeconds = uptime du process .NET (Process.StartTime), pas de la machine. Aucune info OS/kernel/conteneur/réseau/température.

🧩 À faire

  • Collecteur HostInfoProvider : OS (os-release), kernel (uname), arch, uptime machine (/proc/uptime), hostname
  • Collecteur ContainerInfoProvider : détection Docker (/.dockerenv, cgroup), ID conteneur, image (env ou /proc/1/cgroup), limites cgroup CPU/mémoire
  • Collecteur réseau : interfaces/IP (IPv4+IPv6 par interface), MAC, type (eth/wlan)
  • Température : zones thermiques sysfs + CPU package
  • Entité Agent + migration (AddAgentHostInventory) : OsName, KernelVersion, Arch, ContainerId, ContainerImage, ContainerCpuLimit, ContainerMemoryLimit, Interfaces (JSON), UptimeMachineSeconds
  • Heartbeat/register : transporter l'inventaire (register + refresh)
  • UI Admin : section « Machine » (OS, kernel, conteneur, IPs, temp, uptime machine vs process)
  • Tests : parsing os-release, cgroup, /proc/uptime

🧪 Critères d'acceptation

  • Un agent Docker déclare : image (ex. eltruncho/heimdall-agent:latest), conteneur ID, limites CPU/mémoire, OS conteneur + (si possible) nom de la machine hôte
  • Uptime machine (host) distinct de l'uptime du process agent
  • IPs par interface visibles dans l'UI
  • Température CPU remontée quand le sysfs est lisible
  • make test vert

📁 Fichiers concernés

src/Heimdall.Agent/Services/HostInfoProvider.cs, src/Heimdall.Agent/Services/ContainerInfoProvider.cs, src/Heimdall.Agent/Services/NetworkInfoProvider.cs (nouveaux), src/Heimdall.Domain/Entities/Agent.cs, src/Heimdall.Infrastructure/Data/Migrations/, src/Heimdall.Web/Pages/Agents/AgentDetail.razor, tests/

⚠️ Impact

Le conteneur voit l'OS du conteneur, pas du host : c'est une limite Docker normale — à documenter dans l'UI (ne pas faire croire que c'est l'OS du host).

📝 Notes

L'uptime machine est utile pour détecter un reboot du site (≠ redémarrage du conteneur agent).

## 🎯 Contexte Compléter la photo machine : OS/kernel, hostname réel, infos **conteneur** (ID, image, limites cgroup), interfaces réseau/IP, température système. Objectif : en cas d'incident sur un site distant, le central doit pouvoir dire « cet agent tourne dans tel conteneur, sur tel OS, avec telle IP, et le host a tel uptime » — sans SSH. ## 📚 Référence spec / décision Décision : collecte host + conteneur, remontée distincte. - OS : `/etc/os-release` (PRETTY_NAME), `uname -r` (kernel), `uname -m` (arch) — attention : dans le conteneur, /etc/os-release est celui du **conteneur** (Debian slim) ; le host est visible si `/etc/hostname` monté ou via `lscpu`/dmi - **Docker** : `HOSTNAME` env, `/proc/self/cgroup` (ID conteneur), `/.dockerenv` (indicateur), limites cgroup CPU/mémoire - Matériel host : `/sys/class/dmi/id/product_name`, `board_vendor`, `board_name` (si monté/lisible) — nom du PC serveur - Réseau : interfaces (`/proc/net/dev`), IP (ip/ifconfig si dispo, sinon parsing), MAC, débit ? - Température : `/sys/class/thermal/thermal_zone*/temp` (CPU/board), `sensors` si dispo - Uptime **machine** : `/proc/uptime` (≠ uptime du process actuel) ## 🔍 État actuel (vérifié dans le code) `Agent` : `Hostname` (déjà envoyé au register), `Version` (agent), `PublicIp` (via ipify/ifconfig.me au register). `SystemMetricsProvider` calcule `UptimeSeconds` = **uptime du process .NET** (Process.StartTime), pas de la machine. Aucune info OS/kernel/conteneur/réseau/température. ## 🧩 À faire - [ ] Collecteur `HostInfoProvider` : OS (os-release), kernel (uname), arch, uptime machine (/proc/uptime), hostname - [ ] Collecteur `ContainerInfoProvider` : détection Docker (/.dockerenv, cgroup), ID conteneur, image (env ou /proc/1/cgroup), limites cgroup CPU/mémoire - [ ] Collecteur réseau : interfaces/IP (IPv4+IPv6 par interface), MAC, type (eth/wlan) - [ ] Température : zones thermiques sysfs + CPU package - [ ] Entité `Agent` + migration (`AddAgentHostInventory`) : OsName, KernelVersion, Arch, ContainerId, ContainerImage, ContainerCpuLimit, ContainerMemoryLimit, Interfaces (JSON), UptimeMachineSeconds - [ ] Heartbeat/register : transporter l'inventaire (register + refresh) - [ ] UI Admin : section « Machine » (OS, kernel, conteneur, IPs, temp, uptime machine vs process) - [ ] Tests : parsing os-release, cgroup, /proc/uptime ## 🧪 Critères d'acceptation - [ ] Un agent Docker déclare : image (ex. eltruncho/heimdall-agent:latest), conteneur ID, limites CPU/mémoire, OS conteneur + (si possible) nom de la machine hôte - [ ] Uptime machine (host) distinct de l'uptime du process agent - [ ] IPs par interface visibles dans l'UI - [ ] Température CPU remontée quand le sysfs est lisible - [ ] `make test` vert ## 📁 Fichiers concernés src/Heimdall.Agent/Services/HostInfoProvider.cs, src/Heimdall.Agent/Services/ContainerInfoProvider.cs, src/Heimdall.Agent/Services/NetworkInfoProvider.cs (nouveaux), src/Heimdall.Domain/Entities/Agent.cs, src/Heimdall.Infrastructure/Data/Migrations/, src/Heimdall.Web/Pages/Agents/AgentDetail.razor, tests/ ## ⚠️ Impact Le conteneur voit l'OS du conteneur, pas du host : c'est une limite Docker normale — à documenter dans l'UI (ne pas faire croire que c'est l'OS du host). ## 📝 Notes L'uptime machine est utile pour détecter un reboot du site (≠ redémarrage du conteneur agent).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall#85
No description provided.