FEAT: Télémétrie agent — inventaire CPU complet (marque, modèle, cœurs physiques/logiques, fréquence, flags) #82
Labels
No labels
bug
chore
design
dx:ci
dx:database
dx:dotnet
dx:infra
dx:security
dx:tests
dx:ui
etape-1
etape-2
etape-3
etape-4
etape-5
etape-6
etape-7
feature
priority-high
priority-low
priority-medium
security
spec
tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
nonobis/Heimdall#82
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🎯 Contexte
Objectif : maximum d'informations sur les machines des agents, même dockerisées. Le CPU est la première chose à connaître : marque, modèle exact, nombre de cœurs physiques vs logiques, threads, fréquence, architecture, cache, jeux d'instructions (AVX/AVX2/FMA — importants pour les perfs ONNX Runtime). L'entité
Agentne stocke qu'unCpuCores(int) et leSystemMetricsProvidern'expose pas la topologie.📚 Référence spec / décision
Décision : inventaire capturé au démarrage de l'agent (et rafraîchi périodiquement), remonté au central, persisté sur l'entité Agent.
/proc/cpuinfo(model name, vendor, physical id, core id, cpu cores, siblings, flags, cpu MHz),/sys/devices/system/cpu/(topologie),lscpusi dispo/proc/cpuinforeflète le host par défaut, MAIS avec--cpuset-cpusseuls les CPUs alloués sont visibles → détecter la limite cgroup (/sys/fs/cgroup/cpu.maxv2,cpuset.cpus) et l'exposer séparément des specs hostCpuCores(int) → structuré :CpuVendor,CpuModel,CpuArchitecture,PhysicalCores,LogicalCores,ThreadsPerCore,CpuFrequencyMhz,CpuFlags(AVX/AVX2/FMA/AVX512),CpuCacheBytes🔍 État actuel (vérifié dans le code)
Agententity :CpuCores(int, mis viaUpdateCapabilities) — aucune marque/modèle/fréquence.SystemMetricsProvider.GetCpuCount()compte les lignescpuNde/proc/stat(logiques),GetCpuUsageutilise ce compte (correct depuis le fix #22). Pas de lecture de/proc/cpuinfo, pas de distinction physique/logique, pas de conscience cgroup/cpuset.🧩 À faire
CpuInfoProvider: parse/proc/cpuinfo(vendor, model name, physical id/core id → cœurs physiques vs logiques, flags, MHz), topologie/sys/devices/system/cpu//proc/self/cgroup(v2) +/sys/fs/cgroup/cpuset.cpusetcpu.max→ exposerContainerCpuLimitséparé du hostAgent+ migration EF (AddAgentCpuInventory) : champs structurés CPU (voir spec)🧪 Critères d'acceptation
--cpuset-cpus=0-1: specs host complètes + limite conteneur 2 CPUs exposée distinctementmake testvert📁 Fichiers concernés
src/Heimdall.Agent/Services/CpuInfoProvider.cs (nouveau), src/Heimdall.Agent/Services/SystemMetricsProvider.cs, src/Heimdall.Agent/Services/AgentRegistrationService.cs (register payload), src/Heimdall.Domain/Entities/Agent.cs, src/Heimdall.Infrastructure/Data/Migrations/, src/Heimdall.Web/Pages/Agents/AgentDetail.razor, tests/
⚠️ Impact
Migration EF + évolution du contrat register/heartbeat (rétrocompatible : champs optionnels).
📝 Notes
Base de la télémétrie : les tickets mémoire/disque/GPU/OS/UI s'appuient sur la même architecture de collecte + remontée + persistance.