Общее описание
Демон - программа, собирающая информацию о системе, на которой запущена, и отправляющая её своим клиентам по 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