Учёт как договор с потребителем

Состав полей — обещание, а не настройка на глазок

Задача. Любой узел парка. Поток учёта обязан нести то, что разбирает приёмник Хаба, пережить падение MTA и не стать самым большим хранилищем персональных данных в парке.

Из чего складывается:

  • records — виды записей, в том числе tq для сбоев прокси;
  • record-fields — поля, которых ждёт приёмник;
  • iso-times — формат отметок времени, на который рассчитан разбор;
  • sync — сброс буферов, чтобы падение не унесло последние записи;
  • user-string — признак происхождения в каждой записи, вместе с полем userString.

Области у составляющих разные. Все пять живут в одном блоке <acct-file>.

Как они взаимодействуют. Три из пяти при ошибке молчат: неназванное поле просто отсутствует, строка без поля userString не даёт ничего, а выключенный sync даёт полные данные до того единственного раза, когда не даст. Поэтому все пять стоит назвать прямо.

Главная ловушка — user-string без поля. Строка задаёт текст, но в запись он попадает, только если userString перечислено в record-fields: без поля признак узла молча не пишется.
Что делает Хаб. Применяет частично. Поток учёта для вебхука собран под разбор Хаба: виды d, b, rb, t и жалобы; у доставок и отказов к звёздочке добавлены timeFirstAttempt, totalSecondsQueued и numRetries, у жалоб — заголовок Feedback-ID. Остальных составляющих нет: записей tq в потоке нет, формат времени не назван — действует умолчание ISO, сброс буферов и признак происхождения не заданы — узел Хаб узнаёт по адресу вебхука.
Рекомендуемые значения

Пять строк:

Строка Умолчание Что задать
records d,b все виды, которые разбирает приёмник
record-fields * — поля по умолчанию звёздочка плюс нужные вне её
iso-times yes yes, названное явно
sync false true на узлах без резервных копий
user-string нет имя узла и userString в полях
Строки и умолчания — из руководства (§ 3.3.11.7–3.3.11.8, § 3.3.11.11–3.3.11.12, § 3.3.11.15). Сама схема — наша гипотеза.
Пример в конфигурации
<acct-file /var/log/pmta/acct.csv>
    records d, b, rb, t
    record-fields d *, userString, timeFirstAttempt, numRetries
    iso-times yes
    sync true    user-string node-7
</acct-file>
userString добавлено к звёздочке, иначе строка user-string ничего не даст.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Как проверить на узле
Посмотреть блок учёта на узле:
grep -n -A12 '<acct-file' /etc/pmta/config
Нет sync — действует false; нет userString в полях — признак узла не пишется.