|
|
@@ -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) {
|