# statCollector Техническое задание "StatCollector" — высоконагруженный сервер сбора и агрегации метрик 1. Наименование системы **"StatCollector"** — высокопроизводительный TCP-сервер для приёма, агрегации и хранения статистических метрик в реальном времени на языке C++. 2. Предметная область В современных распределённых системах (микросервисы, IoT-устройства, веб-приложения) критически важно собирать и агрегировать метрики в реальном времени: - количество запросов к API; - время ответа (latency); - ошибки (HTTP 5xx, таймауты); - загрузка CPU/памяти; - бизнес-метрики (количество продаж, активных пользователей). **Задача** — разработать упрощённый аналог систем мониторинга (StatsD, Prometheus), который принимает метрики от множества источников, агрегирует их по заданным интервалам и предоставляет доступ к агрегированным данным. 3. Постановка задачи Разработать сервер на C++, который: - принимает TCP-подключения от произвольного числа клиентов (агентов мониторинга); - принимает метрики в текстовом формате; - агрегирует метрики за заданные временные интервалы (например, за 5 секунд, 1 минуту); - поддерживает разные типы метрик (счётчики, текущие значения, таймеры); - предоставляет доступ к агрегированным данным через отдельный интерфейс (TCP или простая HTTP-обвязка); - выдерживает высокую нагрузку по приёму метрик (десятки тысяч событий в секунду). 4. Функциональные требования | ID | Требование | |----|------------| | **FR1** | Клиент подключается по TCP и отправляет метрику в формате: `metric_name:value|type` (например, `api_requests:1|counter`) | | **FR2** | Поддержка типов метрик:
• `counter` — счётчик (суммируется за интервал)
• `gauge` — текущее значение (записывается последнее)
• `timer` — время в мс (вычисляется среднее, p95) | | **FR3** | Автоматическая агрегация метрик по временным окнам (например, каждые 5 секунд) | | **FR4** | Возможность запросить агрегированные метрики по команде `STATS metric_name` | | **FR5** | Поддержка множества одновременных клиентских подключений | | **FR6** | Поддержка тегов для метрик: `api_requests:1|counter|endpoint=/users,method=GET` | | **FR7** | (Опционально) Экспорт метрик в формате Prometheus через HTTP-эндпоинт `/metrics` | 5. Нефункциональные требования | ID | Требование | |----|------------| | **NFR1** | Сервер должен выдерживать приём не менее 50 000 метрик в секунду | | **NFR2** | Среднее время обработки одной метрики — не более 50 мкс | | **NFR3** | Отсутствие гонок данных при конкурентном приёме метрик | | **NFR4** | Устойчивость к некорректным форматам метрик (сервер не падает) | | **NFR5** | Автоматическая очистка старых агрегированных данных | 6. Технологический стек | Компонент | Технология | Обоснование | |-----------|------------|-------------| | **Язык** | C++17/20 | Максимальная производительность | | **Сеть** | Boost.Asio | Асинхронный ввод-вывод для тысяч подключений | | **Хранилище** | `std::unordered_map` + шардирование | Высокая производительность при конкурентном доступе | | **Агрегация** | Инкрементальные алгоритмы (P² для квантилей) | Минимальные накладные расходы | | **Многопоточность** | Пул потоков + lock-free очереди | Максимальная пропускная способность | | **Тестирование** | Самописный генератор нагрузки на C++ | Полный контроль над тестированием | 7. Результаты (Deliverables) 1. **Исходный код сервера** на C++ с CMake 2. **Тестовый клиент** для ручной проверки (или инструкция по подключению через netcat/telnet) 3. **Нагрузочный генератор** для автоматического тестирования 4. **Отчёт** с: - Архитектурой и принятыми решениями - Результатами нагрузочного тестирования (таблицы, графики) - Анализом узких мест - Рекомендациями по улучшению ---