Переглянути джерело

Improves DB check job accuracy and logging

Refines the database check job to use both percentage and absolute thresholds when comparing production and backup data.

This change introduces an absolute difference threshold to avoid flagging small discrepancies as errors. It also enhances logging to include absolute differences and clarifies messages to reflect the hybrid logic applied. Additionally, it adds 'ElasticaSynchro' to the list of ignored tables.
Olivier Massot 3 місяців тому
батько
коміт
7acc8a8442
1 змінених файлів з 31 додано та 19 видалено
  1. 31 19
      src/Service/Cron/Job/DbCheck.php

+ 31 - 19
src/Service/Cron/Job/DbCheck.php

@@ -24,6 +24,7 @@ class DbCheck extends BaseCronJob
 {
     public const IGNORE_TABLES = [
         'messenger_messages',
+        'ElasticaSynchro',
         'enqueue',
         'zzz_.*',
     ];
@@ -98,7 +99,7 @@ class DbCheck extends BaseCronJob
 
     /**
      * Compare les données entre la base de production et le backup de test.
-     * Enregistre une erreur si un écart de plus de 5% est détecté.
+     * Enregistre une erreur si un écart significatif est détecté (plus de PERCENTAGE_THRESHOLD% et plus de ABSOLUTE_THRESHOLD enregistrements).
      */
     private function compareProductionWithBackup(): void
     {
@@ -145,34 +146,42 @@ class DbCheck extends BaseCronJob
                         continue;
                     }
 
-                    // Calculer l'écart en pourcentage
+                    $absoluteDifference = abs($prodCount - $backupCount);
+
                     if ($prodCount > 0) {
-                        $percentage = abs($prodCount - $backupCount) / $prodCount * 100;
+                        $percentage = $absoluteDifference / $prodCount * 100;
 
-                        if ($percentage > 5.0) {
+                        // Si la différence absolue est < ABSOLUTE_THRESHOLD, pas d'alerte (variations normales)
+                        // Sinon, appliquer le seuil de PERCENTAGE_THRESHOLD% pour les tables importantes
+                        if ($absoluteDifference >= self::ABSOLUTE_THRESHOLD && $percentage > self::PERCENTAGE_THRESHOLD) {
                             $discrepancies[] = [
                                 'table' => $table,
                                 'prod_count' => $prodCount,
                                 'backup_count' => $backupCount,
-                                'percentage' => $percentage
+                                'percentage' => $percentage,
+                                'absolute_difference' => $absoluteDifference
                             ];
                         }
 
                         $this->logger->debug(sprintf(
-                            'Table %s: Prod=%d, Backup=%d, Écart=%.2f%%',
+                            'Table %s: Prod=%d, Backup=%d, Écart=%.2f%% (diff absolue: %d)',
                             $table,
                             $prodCount,
                             $backupCount,
-                            $percentage
+                            $percentage,
+                            $absoluteDifference
                         ));
                     } else if ($backupCount > 0) {
-                        // Production vide mais backup non vide
-                        $discrepancies[] = [
-                            'table' => $table,
-                            'prod_count' => $prodCount,
-                            'backup_count' => $backupCount,
-                            'percentage' => 100.0
-                        ];
+                        // Production vide mais backup non vide (si backup a < ABSOLUTE_THRESHOLD enregistrements, pas d'alerte)
+                        if ($backupCount >= self::ABSOLUTE_THRESHOLD) {
+                            $discrepancies[] = [
+                                'table' => $table,
+                                'prod_count' => $prodCount,
+                                'backup_count' => $backupCount,
+                                'percentage' => 100.0,
+                                'absolute_difference' => $backupCount
+                            ];
+                        }
                     }
 
                 } catch (\Exception $tableException) {
@@ -187,21 +196,24 @@ class DbCheck extends BaseCronJob
             // Enregistrer les erreurs pour les écarts détectés
             if (count($discrepancies) > 0) {
                 $this->logger->error(sprintf(
-                    '%d tables présentent un écart supérieur à 5%% entre production et backup',
-                    count($discrepancies)
+                    '%d tables présentent un écart significatif entre production et backup (diff ≥ %d et écart > %.1f%%)',
+                    count($discrepancies),
+                    self::ABSOLUTE_THRESHOLD,
+                    self::PERCENTAGE_THRESHOLD
                 ));
 
                 foreach ($discrepancies as $discrepancy) {
                     $this->logger->error(sprintf(
-                        'Table %s: Production=%d, Backup=%d, Écart=%.2f%%',
+                        'Table %s: Production=%d, Backup=%d, Écart=%.2f%% (diff absolue: %d)',
                         $discrepancy['table'],
                         $discrepancy['prod_count'],
                         $discrepancy['backup_count'],
-                        $discrepancy['percentage']
+                        $discrepancy['percentage'],
+                        $discrepancy['absolute_difference']
                     ));
                 }
             } else {
-                $this->logger->info('Aucun écart significatif détecté entre production et backup');
+                $this->logger->info('Aucun écart significatif détecté entre production et backup (logique hybride appliquée)');
             }
 
         } catch (\Exception $e) {