fix: alerte critique si 0 zones ingérées + lastIngestionJob dans /api/status

This commit is contained in:
Gwadaking
2026-04-09 00:14:34 -04:00
parent e5e835298e
commit 544ba24af2
2 changed files with 37 additions and 5 deletions

View File

@@ -17,17 +17,31 @@ class StatusController extends AbstractController
public function __invoke(): JsonResponse public function __invoke(): JsonResponse
{ {
$row = $this->connection->fetchAssociative( $obs = $this->connection->fetchAssociative(
'SELECT detected_at, source, coverage_area 'SELECT detected_at, source, coverage_area
FROM sargassum_observation FROM sargassum_observation
ORDER BY detected_at DESC LIMIT 1' ORDER BY detected_at DESC LIMIT 1'
); );
$job = $this->connection->fetchAssociative(
"SELECT status, source, error_message, created_at, processed_at, retry_count
FROM data_ingestion_job
ORDER BY created_at DESC LIMIT 1"
);
return $this->json([ return $this->json([
'lastObservation' => $row !== false ? [ 'lastObservation' => $obs !== false ? [
'detectedAt' => $row['detected_at'], 'detectedAt' => $obs['detected_at'],
'source' => $row['source'], 'source' => $obs['source'],
'coverageKm2' => $row['coverage_area'] !== null ? (float) $row['coverage_area'] : null, 'coverageKm2' => $obs['coverage_area'] !== null ? (float) $obs['coverage_area'] : null,
] : null,
'lastIngestionJob' => $job !== false ? [
'status' => $job['status'],
'source' => $job['source'],
'error' => $job['error_message'],
'startedAt' => $job['created_at'],
'finishedAt' => $job['processed_at'],
'retryCount' => (int) $job['retry_count'],
] : null, ] : null,
]); ]);
} }

View File

@@ -43,15 +43,33 @@ final class IngestionScheduleHandler
$this->logger->info('Scheduled ingestion started', ['date' => $date->format('Y-m-d')]); $this->logger->info('Scheduled ingestion started', ['date' => $date->format('Y-m-d')]);
// Étape 1 : ingestion de toutes les zones // Étape 1 : ingestion de toutes les zones
$succeeded = 0;
$failed = 0;
foreach (self::ZONES as $name => $bbox) { foreach (self::ZONES as $name => $bbox) {
try { try {
$this->ingestion->ingestWithFallback($bbox, $date); $this->ingestion->ingestWithFallback($bbox, $date);
$this->logger->info('Zone ingested', ['zone' => $name]); $this->logger->info('Zone ingested', ['zone' => $name]);
++$succeeded;
} catch (\Throwable $e) { } catch (\Throwable $e) {
$this->logger->error('Ingestion failed', ['zone' => $name, 'error' => $e->getMessage()]); $this->logger->error('Ingestion failed', ['zone' => $name, 'error' => $e->getMessage()]);
++$failed;
} }
} }
if ($succeeded === 0) {
$this->logger->critical('All zones failed — no data ingested this cycle', [
'date' => $date->format('Y-m-d'),
'zones' => array_keys(self::ZONES),
'count' => $failed,
]);
} else {
$this->logger->info('Ingestion cycle summary', [
'succeeded' => $succeeded,
'failed' => $failed,
'date' => $date->format('Y-m-d'),
]);
}
// Étape 2 : forecasts pour les observations sans prévision // Étape 2 : forecasts pour les observations sans prévision
$observations = $this->em->getRepository(SargassumObservation::class) $observations = $this->em->getRepository(SargassumObservation::class)
->createQueryBuilder('o') ->createQueryBuilder('o')