feat(etl): добавлен дневной конвейер трансформаций #171

Merged
ddmitry merged 3 commits from 156-etl-pipeline into main 2026-08-27 13:13:27 +03:00
Owner

Зачем

Менти видит один etl_pipeline, который одинаково верно запускается из жизненного цикла, вручную после разгона и повторно после падения: он сам ждёт готовности источника и выводит объём работы из состояния данных.

Что

  • Добавлен параметрически независимый etl_pipeline: DDS, затем DM, с ожиданием и распространением отказа.
  • Первый шаг DDS ждёт нулевого отставания группы clickstream_hits, затем пустой очереди доставки ods.event_dist на обеих нодах ClickHouse. У барьеров общий предел 300 секунд и опрос раз в 3 секунды.
  • world_initialize и world_live_day ждут ETL последним шагом после установки позиции. world_next_day по-прежнему только разгоняет источники.
  • Архитектура, ADR, спека жизненного цикла и карта проверок приведены к новому графу.

Проверка

  • make config-test; make lint.
  • make smoke: 21/21; make check-clickhouse: 10/10; финальный make check-services: 7/7 за 129 с.
  • make rebuild-storage: 7 минут; world_initialize без ручного шага довёл позицию до 8 и собрал DDS и DM.
  • Два пакетных дня догнаны одним ручным etl_pipeline без параметров; полный зелёный world_live_day занял 27 м 2 с.
  • Временная поломка SQL daily_traffic покрасила DM, etl_pipeline и world_live_day; после возврата SQL ручной ETL восстановил слои без параметров.
  • Реальный пакетный хвост прошёл 46 367 → 27 239 → 0; только затем обе очереди ClickHouse показали 0 файлов и начались трансформации.
  • После пересборки два холодных прогона check-services дали 5/1 из-за 30-секундного ожидания импорта Superset. Диагностический прогон с 90 с прошёл 3/0, а последующий штатный прогон — 7/7; тайм-аут вне границ задачи не менялся.

Ревью и текст

  • Линия уместности: два прогона Fable; дополнительное ревью перепроверено и разобрано в комментарии к PR.
  • Линия дефектов: Opus, все принятые находки исправлены и перепроверены; два отклонения сохранены с доводами.
  • Владелец снял для этого прогона раздел AGENTS.md «Кому что поручать»: вся реализация выполнена Codex, и ревьюеры были предупреждены не считать это находкой.
  • Документация написана через writing-for-agents; финальный ai-text-lint дал Голос: чисто, затем выполнена отдельная литературная вычитка русского текста.

Closes #156

## Зачем Менти видит один `etl_pipeline`, который одинаково верно запускается из жизненного цикла, вручную после разгона и повторно после падения: он сам ждёт готовности источника и выводит объём работы из состояния данных. ## Что - Добавлен параметрически независимый `etl_pipeline`: DDS, затем DM, с ожиданием и распространением отказа. - Первый шаг DDS ждёт нулевого отставания группы `clickstream_hits`, затем пустой очереди доставки `ods.event_dist` на обеих нодах ClickHouse. У барьеров общий предел 300 секунд и опрос раз в 3 секунды. - `world_initialize` и `world_live_day` ждут ETL последним шагом после установки позиции. `world_next_day` по-прежнему только разгоняет источники. - Архитектура, ADR, спека жизненного цикла и карта проверок приведены к новому графу. ## Проверка - `make config-test`; `make lint`. - `make smoke`: 21/21; `make check-clickhouse`: 10/10; финальный `make check-services`: 7/7 за 129 с. - `make rebuild-storage`: 7 минут; `world_initialize` без ручного шага довёл позицию до `8` и собрал DDS и DM. - Два пакетных дня догнаны одним ручным `etl_pipeline` без параметров; полный зелёный `world_live_day` занял 27 м 2 с. - Временная поломка SQL `daily_traffic` покрасила DM, `etl_pipeline` и `world_live_day`; после возврата SQL ручной ETL восстановил слои без параметров. - Реальный пакетный хвост прошёл 46 367 → 27 239 → 0; только затем обе очереди ClickHouse показали 0 файлов и начались трансформации. - После пересборки два холодных прогона `check-services` дали 5/1 из-за 30-секундного ожидания импорта Superset. Диагностический прогон с 90 с прошёл 3/0, а последующий штатный прогон — 7/7; тайм-аут вне границ задачи не менялся. ## Ревью и текст - Линия уместности: два прогона Fable; дополнительное ревью перепроверено и разобрано в комментарии к PR. - Линия дефектов: Opus, все принятые находки исправлены и перепроверены; два отклонения сохранены с доводами. - Владелец снял для этого прогона раздел `AGENTS.md` «Кому что поручать»: вся реализация выполнена Codex, и ревьюеры были предупреждены не считать это находкой. - Документация написана через `writing-for-agents`; финальный `ai-text-lint` дал `Голос: чисто`, затем выполнена отдельная литературная вычитка русского текста. Closes #156
ddmitry added 1 commit 2026-08-27 02:44:41 +03:00
Зачем:
- Один запуск должен одинаково работать из жизненного цикла, вручную после разгона и повторно после отказа.

Что:
- Добавлена последовательная сцепка DDS и DM с ожиданием каждого слоя.
- DDS дожидается смещений Kafka и очереди доставки ClickHouse за общий срок.
- ETL встроен в создание мира и живой день; документация приведена к новому графу.

Проверка:
- make config-test; make lint.
- make smoke: 21/21; make check-clickhouse: 10/10; make check-services: 7/7.
- make rebuild-storage, живой и пакетный дни, искусственный отказ и ручное восстановление ETL.
ddmitry added 1 commit 2026-08-27 11:17:57 +03:00
- Зачем:
  - верхние смещения можно получить тем же административным клиентом без одноразового Consumer и фиктивной группы.
- Что:
  - чтение хвоста переведено на AdminClient.list_offsets с OffsetSpec.latest.
  - назначение system.one названо рядом с запросом, а документация и запись проверок сокращены и переставлены по смыслу.
- Проверка:
  - make config-test; make lint.
  - живые проверки готового и отсутствующего разделов Kafka; полный etl_pipeline.
Author
Owner

Дополнительное вкусовое ревью Fable перепроверено по коду, постановке, Context7 и установленному стенду.

  • 1 - исправлено: Consumer удален, верхние смещения читает AdminClient.list_offsets с OffsetSpec.latest. API подтвержден Context7 и живым вызовом на confluent-kafka 2.15.0.
  • 2 - частично исправлено: system.one сохранен, потому что постановка требует журнал по каждой ноде на каждом опросе; рядом добавлено объяснение нулевых строк.
  • 3 - отклонено: отсутствие ё следует обязательному для задачи ai-text-lint, это авторская норма владельца скилла.
  • 4 - исправлено: запись о TriggerDagRunOperator перенесена из готовности источника в раздел «Форма».
  • 5 - исправлено: приемочная запись теперь называет пройденный make config-test.
  • 6 - подтверждено вне границ #156: холодный тайм-аут Superset воспроизведен, дубликата в трекере нет; код проверки в этом PR не менялся.
  • 7 - частично исправлено: докстринги задают вопрос барьера, пустая фраза о будущем замере удалена. Аннотация probe отклонена: она вернула бы отдельный Callable ради одного частного параметра, а файл аннотирован не целиком.

Проверка после правок: make config-test, make lint, живые готовый и отсутствующий разделы Kafka, полный etl_pipeline - зеленые.

Коммит: 61e662c.

Дополнительное вкусовое ревью Fable перепроверено по коду, постановке, Context7 и установленному стенду. - 1 - исправлено: `Consumer` удален, верхние смещения читает `AdminClient.list_offsets` с `OffsetSpec.latest`. API подтвержден Context7 и живым вызовом на `confluent-kafka 2.15.0`. - 2 - частично исправлено: `system.one` сохранен, потому что постановка требует журнал по каждой ноде на каждом опросе; рядом добавлено объяснение нулевых строк. - 3 - отклонено: отсутствие `ё` следует обязательному для задачи `ai-text-lint`, это авторская норма владельца скилла. - 4 - исправлено: запись о `TriggerDagRunOperator` перенесена из готовности источника в раздел «Форма». - 5 - исправлено: приемочная запись теперь называет пройденный `make config-test`. - 6 - подтверждено вне границ #156: холодный тайм-аут Superset воспроизведен, дубликата в трекере нет; код проверки в этом PR не менялся. - 7 - частично исправлено: докстринги задают вопрос барьера, пустая фраза о будущем замере удалена. Аннотация `probe` отклонена: она вернула бы отдельный `Callable` ради одного частного параметра, а файл аннотирован не целиком. Проверка после правок: `make config-test`, `make lint`, живые готовый и отсутствующий разделы Kafka, полный `etl_pipeline` - зеленые. Коммит: `61e662c`.
ddmitry added 1 commit 2026-08-27 12:23:21 +03:00
- Зачем:
  - ветка ETL должна учитывать новую витрину `purchase_vs_orders` из `main`.
- Что:
  - `origin/main` влит без переписывания истории опубликованного PR;
  - `dm_transform` теперь собирает третью витрину внутри общего конвейера.
- Проверка:
  - `make config-test`, `make lint`;
  - `generator`: `make lint`, `make typecheck`, `make test` — 429 тестов;
  - `make rebuild-storage`, `make smoke`, `make check-clickhouse`, `make check-services`;
  - импорт DAG без ошибок, `purchase_vs_orders` заполнена.
Author
Owner

После слияния задачи #155 обновил ветку через merge, без переписывания истории опубликованного PR.

Смысловой стык проверен: новая витрина purchase_vs_orders входит в dm_transform, поэтому запускается внутри общего etl_pipeline. Адресная пересборка завершилась за 7:45; витрина получила 1917 строк в четырех классах сверки.

Проверки после слияния:

  • make config-test, корневой make lint;
  • в generator/: make lint, make typecheck, make test — 429 тестов;
  • make rebuild-storage;
  • make smoke — 21/21;
  • make check-clickhouse — 10/10;
  • make check-services — 7/7;
  • ошибок импорта DAG нет.

Merge-коммит: cec11ed.

Отдельный хвост из вкусового ревью по холодному тайм-ауту Superset вынесен в #172; он не замаскирован правкой этой ветки.

После слияния задачи #155 обновил ветку через merge, без переписывания истории опубликованного PR. Смысловой стык проверен: новая витрина `purchase_vs_orders` входит в `dm_transform`, поэтому запускается внутри общего `etl_pipeline`. Адресная пересборка завершилась за 7:45; витрина получила 1917 строк в четырех классах сверки. Проверки после слияния: - `make config-test`, корневой `make lint`; - в `generator/`: `make lint`, `make typecheck`, `make test` — 429 тестов; - `make rebuild-storage`; - `make smoke` — 21/21; - `make check-clickhouse` — 10/10; - `make check-services` — 7/7; - ошибок импорта DAG нет. Merge-коммит: `cec11ed`. Отдельный хвост из вкусового ревью по холодному тайм-ауту Superset вынесен в #172; он не замаскирован правкой этой ветки.
ddmitry merged commit 4e60aafc31 into main 2026-08-27 13:13:27 +03:00
ddmitry deleted branch 156-etl-pipeline 2026-08-27 13:13:28 +03:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ddmitry/clickstream-data-platform#171