diff --git a/etl/README.md b/etl/README.md index 94f8ba2..cabf674 100644 --- a/etl/README.md +++ b/etl/README.md @@ -669,8 +669,10 @@ des recommandations (`alertes`, issue #116), l'import historique (`historical_im issue #119) et l'import périodique de l'API Mock (`mock_api_import`, issue #15). Le DAG `mock_api_import` s'exécute chaque heure, à la minute `:45`. Il appelle -`app.etl.mock_api_import` avec un intervalle explicite d'une heure et une limite de 1 000 lectures -par site. Les deux pipelines normalisent leurs données vers les tables communes `site` et +`app.etl.mock_api_import` avec un intervalle explicite d'une heure et une limite d'une lecture +par site. L'API Mock génère autant de points que la limite demandée, répartis sur l'intervalle : +un seul donne la mesure de :00, au pas horaire du dataset historique, que les features ML +supposent en décalant par ligne. Les deux pipelines normalisent leurs données vers les tables communes `site` et `reading`, tout en conservant leur source (`csv` ou `api_history`). La réconciliation globale des deux sources reste à compléter dans l'issue #15. diff --git a/etl/airflow/dags/mock_api_import.py b/etl/airflow/dags/mock_api_import.py index f0043d0..ca50254 100644 --- a/etl/airflow/dags/mock_api_import.py +++ b/etl/airflow/dags/mock_api_import.py @@ -18,9 +18,9 @@ from airflow.timetables.trigger import CronTriggerTimetable # Le backend possède son propre environnement uv dans l'image Airflow (ADR 0008). COMMANDE_BACKEND = "cd /opt/backend && env -u VIRTUAL_ENV uv run --no-sync python -m" -# Le pipeline backend et l'API acceptent au maximum 1 000 lectures par site. -# Cette marge évite de perdre silencieusement une lecture si une heure en contient plus de 60. -LIMITE_LECTURES = 1000 +# Contrainte : l'API Mock génère `limit` points répartis sur l'intervalle. Un seul donne la mesure +# de :00, au pas horaire du CSV que les features ML supposent (`shift(168)` compte des lignes). +LIMITE_LECTURES = 1 # Deux reprises donnent trois tentatives au total. Même dans le pire cas, l'exécution reste # inférieure au pas horaire du DAG. diff --git a/etl/airflow/tests/test_dags.py b/etl/airflow/tests/test_dags.py index d03dd97..eb45364 100644 --- a/etl/airflow/tests/test_dags.py +++ b/etl/airflow/tests/test_dags.py @@ -118,7 +118,7 @@ def test_mock_api_import_uses_the_airflow_data_interval(dagbag: DagBag) -> None: assert "--start-time \"{{ data_interval_start.strftime('%Y-%m-%dT%H:%M:%S') }}\"" in commande assert "--end-time \"{{ data_interval_end.strftime('%Y-%m-%dT%H:%M:%S') }}\"" in commande - assert "--limit 1000" in commande + assert commande.endswith("--limit 1") @pytest.mark.parametrize("task_id", ["detection", "recommandations"])