fix(monitoring): corriger calcul CPU — getProcessCpuLoad au lieu de loadAverage/processors
Le calcul précédent `getSystemLoadAverage() / getAvailableProcessors() * 100` utilisait : - getSystemLoadAverage() : charge 1min du NODE Linux hôte entier (12 CPU sur prod VPS) - getAvailableProcessors() : limite conteneur K8s (1 CPU pour le pod UnionFlow) Résultat : load 1.5 sur le node → cpuUsage = (1.5 / 1) * 100 = 150% capé à 100%. Déclenchement constant d'alertes "CPU 100%" (19 faux positifs / 24h sur prod le 20-21/04/2026) dès que le node fait autre chose que dormir. Correctif : utilise com.sun.management.OperatingSystemMXBean.getProcessCpuLoad() qui retourne la charge CPU du process JVM courant (0.0-1.0), conscient du conteneur. Branche -1 préservée (API non dispo sur certaines JVM). Tests mis à jour : AlertMonitoringServiceMockStaticCoverageTest injecte désormais un com.sun.management.OperatingSystemMXBean et mocke getProcessCpuLoad() (compatible mock-maker-inline déjà configuré). AlertMonitoringServiceTest conserve sa logique OS-agnostique via des thresholds extrêmes (-1 toujours / 100 jamais).
This commit is contained in:
@@ -82,12 +82,15 @@ public class AlertMonitoringService {
|
||||
*/
|
||||
private void checkCpuThreshold(AlertConfiguration config) {
|
||||
try {
|
||||
OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
|
||||
double loadAvg = osBean.getSystemLoadAverage();
|
||||
int processors = osBean.getAvailableProcessors();
|
||||
|
||||
// Calculer l'utilisation CPU en pourcentage
|
||||
double cpuUsage = loadAvg < 0 ? 0.0 : Math.min(100.0, (loadAvg / processors) * 100.0);
|
||||
// getProcessCpuLoad() renvoie la charge CPU de CE process JVM (0.0-1.0),
|
||||
// ce qui est correct en conteneur K8s/Docker.
|
||||
// getSystemLoadAverage() renvoie la charge du NODE entier (hôte Linux),
|
||||
// divisée par availableProcessors() limité par le conteneur (ex: 1),
|
||||
// ce qui produit des faux positifs dès que le node est actif.
|
||||
com.sun.management.OperatingSystemMXBean osBean =
|
||||
(com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
|
||||
double processCpuLoad = osBean.getProcessCpuLoad();
|
||||
double cpuUsage = processCpuLoad < 0 ? 0.0 : Math.min(100.0, processCpuLoad * 100.0);
|
||||
lastCpuUsage = cpuUsage;
|
||||
|
||||
int threshold = config.getCpuThresholdPercent();
|
||||
|
||||
Reference in New Issue
Block a user