Демон - программа, собирающая информацию о системе, на которой запущена, и отправляющая её своим клиентам по 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 и пр.).
Команды, которые могут пригодиться:
$ 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 клиентам с использованием однонаправленного потока.
Выдавать "снапшот" системы можно как отдельными сообщениями, так и одним жирным объектом.
Сбор информации, её парсинг и пр. должен осуществляться как можно более конкурентно.
Минимум - Linux (Ubuntu 18.04).
Максимум - несколько сборок под набор из популярных ОС/процессоров:
- darwin, linux, windows
- 386, amd64
Но тогда придется постараться с реализацией использования различных команд для сбора данных.
Пригодятся build тэги.
- Через аргументы командной строки можно указать, на каком порту стартует сервер.
- Через файл можно указать, какие из подсистем сбора включены/выключены.
- по возможности мок интерфейсов и проверка вызовов конкретных методов;
- тесты вспомогательных функций и пр.
- потестировать факт потока статистики, можно без конкретных цифр;
- можно посоздавать файлы, пооткрывать сокеты и посмотреть на изменение снапшота.
Необходимо реализовать простой клиент, который в реальном времени получает и выводит в STDOUT статистику по одному из пунктов (например, сетевую информацию) в читаемом формате (например, в виде таблицы).
Максимум - 20 баллов (при условии выполнения обязательных требований):
- Реализован сбор:
- load average - 1 балл;
- загрузка CPU - 1 балл;
- загрузка дисков - 1 балл;
- top talkers по сети - 1 балла;
- статистика по сети - 1 балл.
- Через конфигурацию можно отключать отдельную статистику - 2 балла.
- Написаны юнит-тесты - 1 балл.
- Написаны интеграционные тесты - 2 балла.
- Реализован простой клиент к демону - 2 балла.
- Сбор хотя бы одного типа статистики работает на разных ОС - 5 баллов.
- Понятность и чистота кода - до 3 баллов.