👣 Задание на разработку демона, осуществляющего "Системный мониторинг"



Общее описание



Демон - программа, собирающая информацию о системе, на которой запущена, и отправляющая её своим клиентам по GRPC.



Архитектура

GRPC сервер;

допускается использование временных (/tmp) файлов;

статистика хранится в памяти, долговременное хранение не предусмотрено.



Требования

Необходимо каждые N секунд выдавать информацию, усредненную за последние M секунд.



Например, N = 5с, а M = 15с, тогда демон "молчит" первые 15 секунд, затем выдает снапшот за 0-15с; через 5с (в 20с) выдает снапшот за 5-20с; через 5с (в 25с) выдает снапшот за 10-25с и т.д.



N и M указывает клиент в запросе на получение статистики.



Что необходимо собирать:



Средняя загрузка системы (load average).



Средняя загрузка CPU (%user_mode, %system_mode, %idle).



Загрузка дисков:



-tps (transfers per second);

-KB/s (kilobytes (read+write) per second);



Информация о дисках по каждой файловой системе:



-использовано мегабайт, % от доступного количества;

-использовано inode, % от доступного количества.

Top talkers по сети:



- по протоколам: protocol (TCP, UDP, ICMP, etc), bytes, % от sum(bytes) за последние M), сортируем по убыванию процента;

-по трафику: source ip:port, destination ip:port, protocol, bytes per second (bps), сортируем по убыванию bps.



Статистика по сетевым соединениям:



- слушающие TCP & UDP сокеты: command, pid, user, protocol, port;

-количество TCP соединений, находящихся в разных состояниях (ESTAB, FIN_WAIT, SYN_RCV и пр.).



Разрешено использовать только стандартную библиотеку языка Go!

Команды, которые могут пригодиться:



$ top -b -n1

$ df -k

$ df -i

$ iostat -d -k

$ cat /proc/net/dev

$ sudo netstat -lntup

$ ss -ta

$ tcpdump -ntq -i any -P inout -l

$ tcpdump -nt -i any -P inout -ttt -l

Статистика представляет собой объекты, описанные в формате Protobuf.



Информацию необходимо выдавать всем подключенным по GRPC клиентам с использованием однонаправленного потока.



Выдавать "снапшот" системы можно как отдельными сообщениями, так и одним жирным объектом.



Сбор информации, её парсинг и пр. должен осуществляться как можно более конкурентно.



Конфигурация



Через аргументы командной строки можно указать, на каком порту стартует сервер.

Через файл можно указать, какие из подсистем сбора включены/выключены.

Тестирование



Юнит-тесты

по возможности мок интерфейсов и проверка вызовов конкретных методов;

тесты вспомогательных функций и пр.



Интеграционные тесты



потестировать факт потока статистики, можно без конкретных цифр;

можно посоздавать файлы, пооткрывать сокеты и посмотреть на изменение снапшота.



Клиент



Необходимо реализовать простой клиент, который в реальном времени получает и выводит в STDOUT статистику по одному из пунктов (например, сетевую информацию) в читаемом формате (например, в виде таблицы).



@golang_interview