Автоматизация отчетов по трафику

Как устроена архитектура системы сбора логов
В основе автоматизации — распределенный сбор данных на стороне сервера. Каждое событие фиксируется через Nginx-модуль, который записывает 24 параметра запроса, включая заголовки HTTP, User-Agent, IP-адрес и таймстамп с микросекундной точностью. Никаких клиентских скриптов — отказ от JavaScript-тегов снижает потерю данных до 0,02%.
Сырые данные буферизируются в оперативной памяти и пакетно передаются в хранилище по протоколу gRPC со сжатием Snappy. Это позволяет обрабатывать до 150 000 событий в секунду на одном ядре процессора. Для сравнения: аналоги на основе REST API теряют до 5% пакетов при пиковых нагрузках.
Система поддерживает два режима агрегации: микро-батчи (пачки по 1000 строк) и потоковую обработку через Apache Kafka. Первый подходит для ежедневных отчетов, второй — для реального времени. Выбор режима влияет на финальную задержку появления данных в отчете.
Отличия от аналогов: почему стандартные решения не справляются
Типовые системы автоматизации отчетов часто используют готовые библиотеки вроде Matomo или Piwik. Проблема в том, что они не разделяют события по флагам атрибуции: UTM-метки, geo-поля и тип устройства попадают в один срез без возможности точной фильтрации. В результате отчеты по трафику содержат «шум» — до 40% записей, которые невозможно однозначно привязать к источнику.
Ваше решение использует строгую схему валидации на этапе парсинга. Для каждого query-параметра установлен тип данных: число, строка фиксированной длины (для меток), дата в формате ISO 8601. Записи, не соответствующие схеме, отбрасываются с записью в отдельный лог ошибок. Это гарантирует, что в итоговом отчете нет «мусора».
Второе ключевое отличие — поддержка собственных правил трансформации. Вы можете настроить маппинг значений: например, заменить код страны на название региона через справочник, или склеить несколько полей в один ключ. Без этого каждый отчет приходится вручную чистить в Excel.
Технические характеристики форматов и протоколов выгрузки
Система отдает отчеты в трех форматах: JSON Lines (машиночитаемый), Parquet (колоночный для аналитики) и XLSX с форматированием (для отправки заказчику). Каждый формат имеет свои настройки сжатия: для Parquet — Snappy или ZSTD (уровень 3), для XLSX — оптимизация под размер файла.
- JSON Lines: кодировка UTF-8, максимальная вложенность 2 уровня, каждое событие — отдельная строка с уникальным event_id.
- Parquet: схема определяется автоматически по первым 100 строкам, поддержка null-значений, сортировка по убыванию времени.
- XLSX: фиксированная ширина столбцов 15 символов, автофильтры по 10 колонкам, защита листа от редактирования.
Для интеграции с внешними системами поддерживается выгрузка по FTP (TFTP для старых серверов) и SFTP с шифрованием AES-256. Параллельно можно отправить копию в S3-совместимое хранилище или Google Drive через API.
При настройке автоматического расписания доступны интервалы: каждые 15 минут, 1 час, 6 часов, раз в сутки (выбор часа с точностью до минуты). Для суточных отчетов можно задать «время заморозки»: система подождет указанное количество часов, чтобы данные из всех регионов точно доехали.
Стандарты качества и проверка целостности данных
Каждый сформированный отчет проходит валидацию по четырем критериям: количество записей не меньше ожидаемого, сумма просмотров ±2% от эталонного счетчика, отсутствие дубликатов по полю (source, time, utm_campaign), полнота UTM-меток (100% полей не пусты, если метка была передана).
Система автоматически вычисляет контрольную сумму SHA-256 для файла отчета и сохраняет ее в метаданные. При ручной выгрузке через интерфейс вы можете проверить эту сумму. Если отчет создавался по расписанию, система сравнивает хеши при повторной передаче — несовпадение означает повторную отправку.
Особое внимание — к обработке временных зон. Все таймстампы хранятся в UTC, но в отчете отображаются с учетом вашего часового пояса (указывается при настройке). Разница в переходе на летнее время (DST) учитывается автоматически через системную базу tzdata — обновляется еженедельно.
Материалы и производительность инфраструктуры
Серверная часть использует Rust с нулевыми накладными расходами на управление памятью. Каждый модуль (сбор, парсинг, агрегация, отправка) работает в отдельном изолированном процессе. Это позволяет обновлять логику одного модуля без остановки всей системы.
- Хранилище событий: ClickHouse с движком MergeTree — дедупликация на уровне первичного ключа (time + source + campaign).
- Кэш популярных отчетов: Redis Cluster — TTL 30 минут, объем до 2 ГБ на ноду.
- Сетевая подсистема: gRPC с keep-alive каждые 10 секунд, таймаут ответа 500 мс.
Система рассчитана на работу с 100 до 500 000 сессий в сутки. При росте нагрузки достаточно добавить узлы ClickHouse и перераспределить шарды. Пример: для 200 000 сессий/день (≈5 млн событий) достаточно одного сервера (8 vCPU, 32 ГБ RAM, SSD-диск 200 ГБ).
Как настраивается автоматический отчет без участия разработчиков
Мастер создания отчета содержит три шага. Первый — выбор источника данных: можно взять сырые логи (формат CLF или расширенный), готовые сессии (агрегированные по визитам) или UTM-статистику по кампаниям. Второй шаг — фильтры: по дате, по типу устройства (мобильное/десктоп), по источнику перехода (organic, paid, social).
На третьем шаге — маппинг полей. Например, можно объединить utm_source и utm_medium в один столбец «Канал», или разделить IP-адрес на октеты для геоаналитики. Последнее действие — выбор формата и расписания. Настройки сохраняются как шаблон, чтобы не повторять процесс для однотипных отчетов.
Если нужна кастомизация — доступен API в стиле GraphQL с DeepQL-синтаксисом. Пример запроса: events { where: { time_gte: "now-24h", source_eq: "google" } }. Ответ приходит в виде JSON с пагинацией по курсору. Без этого пришлось бы писать SQL вручную каждый раз.
Решение типовых проблем: как верифицировать отчет
- Если количество записей меньше ожидаемого — проверьте фильтры дат: система использует UTC, а не локальное время. Исправьте временной сдвиг в настройках.
- Если UTM-метки отображаются как пустые — убедитесь, что на странице передачи данных установлен правильный заголовок X-Requested-With: XMLHttpRequest. Без него метки не парсятся.
- Если отчет весит больше 50 МБ — переключите формат на Parquet: сжатие ZSTD уменьшит размер в 4-8 раз без потери данных.
- Если графики в отчете отображаются с разрывами — проверьте связность данных через инструмент «Проверка целостности» в интерфейсе. Там же доступен экспорт списка пропущенных событий.
Система автоматически генерирует уведомления при аномалиях: резкий спад трафика (более 30% за час), превышение порога ошибок парсинга (более 5%), потеря связи с источником данных. Все алерты можно получить через Webhook, Telegram или email.
Добавлено: 11.05.2026
