fix: alerte critique si 0 zones ingérées + lastIngestionJob dans /api/status
This commit is contained in:
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
Reference in New Issue
Block a user