Перейти к основному содержимому

Сбор

Замер от: 2026-08-14 · чем проверено: ZAMER-KARTY-BLOKOV-2026-08-14.md (рантайм боевого s3), ZAMER-BAZY-2026-08-14.md (живая база), прогон python3 marketplace-collector-v3/next_collector.py --list — 82 описания Для кого: кто добавляет площадку, меняет расписание или чинит «сбор не пошёл». Читать до первой правки в marketplace-collector-v3/.

Что делает

Ходит на API площадок по расписанию и складывает сырые ответы в gwptd_intake.raw_payload: 8 134 349 строк и 14 198 МБ на 14.08. Рядом payload_lineage_receipt — 3 942 697 строк; вместе эти две таблицы занимают 67 % объёма схемы приёма (замер базы). Начинается записями расписания на s3, которые зовут run_collector.sh / run_collector_fleet.sh из отдельной рабочей копии /opt/gwptd-collector/repo; ядро и наблюдение работают из /opt/gwptd-analytics/repo, поэтому выкладка одного дерева не доказывает обновление другого (замер карты). Кончается строками приёма и распиской прогона. Разбор ответа в колонки идёт в том же проходе — это страница РАЗБОР.

Точка входа в код

marketplace-collector-v3/next_collector.py, функция main() — единственная точка входа в бою. next_raw_collector.py и next_parser.py лежат в дереве, но в расписании их нет вовсе: if grep -qE 'next_raw_collector|next_parser' marketplace-collector-v3/scripts/crontab.s3-next.txt; then echo 'найдено'; else echo 0; fi → 0.

Чем задаётся

  • Описания specs/products/*.yaml: 82 ProductSpec, 169 целей приёма, 3225 колонок (замер карты). Предел страницы задаёт сама площадка в своём описании API: операция ссылается через $ref на components.parameters.limit, где и лежит maximum (сохранённый образец: wb-02-products.yaml). В рабочее описание выбранные параметры пагинации переносятся в transport как limit, limitParam, pageParam, maxPages и shortPageStop (образец: specs/products/lamoda.orders.yaml). Поэтому общего предела в коде сборщика нет и подставлять одно число всем адресам нельзя (RULES.md, правило 25).
  • Расписание marketplace-collector-v3/scripts/crontab.s3-next.txt — 26 записей (замер карты, подтверждено двумя независимыми способами). Основные полосы: run_collector_fleet.sh --lanes wb,ozon,ym,lamoda в 04:00 и 16:00 UTC, 1С в 03:45 и 04:55, кабинет Lamoda в 02:00–02:40.
  • Секреты/etc/gwptd/secrets/runtime.env, принадлежит root и не хранится в Git (run_collector.sh).
  • Реестр spec_runtime/next_registry.py: перед живым запуском assert_exact_promoted_set сверяет набор выложенных описаний с реестром — при расхождении запуск прекращается.

Какие правила обязан соблюдать

  • Один живой сбор на ключ: аренда gwptd_monitoring.collector_lease (marketplace-collector-v3/spec_runtime/lease.py) — занято значит отказ от параллельного запуска. Пустая аренда = «сейчас никто не собирает», а не «механизм мёртв» (замер базы).
  • До обращения к API должны пройти блокировка рабочей копии на время выкладки, замок области площадки и ограда входных данных. Их устройство — в data-fence.md, причины отказа — в каталоге сторожей.
  • Живой запуск обязан идти с V3_SPEC_FAIL_CLOSED=1, из чистой рабочей копии ветки next/spec-platform и с доступной БД (next_collector.py, проверки в run_collector.sh).
  • Общий канон — DO-NOT-REGRESS.md. Отгрузка неприкосновенна: сбор её не задевает, а правка рядом — отдельное решение владельца (RULES.md, «НЕПРИКОСНОВЕННОЕ»).

Чем проверяется

  • python3 marketplace-collector-v3/next_collector.py --list — реестр описаний, работает без базы; на 14.08 отдаёт 82 описания (прогнал, вывод в отчёте).
  • python3 -m pytest marketplace-collector-v3/tests/test_s3_next_schedule_registry.py -q — 25 passed, 0 skipped (прогнал 14.08).
  • if grep -qE 'next_raw_collector|next_parser' marketplace-collector-v3/scripts/crontab.s3-next.txt; then echo 'найдено'; else echo 0; fi — 0: раздельная пара не в расписании; команда завершается успешно и при нуле совпадений.

Чего делать нельзя

  • Править cron руками: источник расписания — crontab.s3-next.txt, выкладка сверяет его с живым crontab побайтно.
  • Снимать ограды и замки или ослаблять закрытый отказ как побочный итог починки: снятие защиты — отдельное изменение с отдельным доказательством (RULES.md, правило 18).
  • Обходить run_collector.sh при живом запуске: без него нет проверки чистоты рабочей копии, замка области и ограды входных данных.
  • Запускать живой --all: запрещён самим входом, только --mp / --endpoint (next_collector.py).

Что НЕ установлено

  • Кто и когда должен включить учёт слотов schedule_slot_*: писатель найден, но штатное расписание его не запускает. Включение объявлено отложенным: контракты P3-B и P3-C имеют статус DEPLOYED / DARK / NOT ACTIVATED (строки 3 обоих). Код и оставшаяся граница описаны в СЛУЖЕБНОЕ.
  • Свежесть данных внутри таблиц и заполненность колонок — не замерено (замер базы, раздел «Чего в этом замере НЕТ»).

Куда за подробностью

Служба 1С — адрес и период

Внутренняя служба, ключа в адресе нет (подтверждено владельцем 14.08.2026): «это не ключ, это просто ссылка уникальная, прятать нечего».

POST https://www.gwptd.com/service/df58e51061a24820ac2c51f325c65532/901dbaa9448044ba886d8e00a89e2f7f
{"StartDate": "2026-08-01T00:00:00", "EndDate": "2026-08-31T23:59:59"}

Период любой — служба отдаёт запрошенное окно целиком. Дата обязана быть со временем: замер 11.08.2026 на окне 01–05.08 дал 1064 записи без времени против 1224 с временем, потеря 13 % — 1С читает 2026-08-05 как полночь и последний день не отдаёт вовсе.

В описании specs/products/1c.warehouse_movements.yaml окно сейчас три дня. Расширять безопасно: загрузка идёт INSERT IGNORE по row_content_hash, и повторный сбор того же периода ничего не задваивает.