На каждой физ машине запускается агент, который читает системный источник событий: syslog (/var/log/syslog).
Агент приводит события к единому формату, батчит их (100 событий или 1 секунда) и отправляет на центральный сервак по TCP. Для TCP используется собственный length-prefixed протокол (4 байта network order + JSON payload), чтобы корректно обрабатывать поток байтов, частичные чтения и несколько сообщений за одно чтение.
Центральный сервис (Gateway) принимает события по TCP через async i/o (Boost.Asio), парсит входной протокол, валидирует поля, нормализует и классифицирует события, после чего прогоняет их через rule engine. Например, события с "failed password", kernel errors или OOM превращаются в алерты. Все нормализованные события и алерты публикуются в Kafka в отдельные топики: netstream.events и netstream.alerts.
Отдельный сервис Consumer читает события из Kafka с manual offset commits и сохраняет данные в PostgreSQL. В БД хранятся принятые события и сработавшие алерты с индексами по agent_id, timestamp, category и severity.
Технологии: C++17, Boost.Asio, nlohmann/json, Kafka(librdkafka), PostgreSQL(libpqxx).