Мониторинг Raspberry PI
- вторник, 1 августа 2017 г. в 03:14:20
Возникла передо мной такая задача: сделать мониторинг Raspberry PI. И требования:
Здесь и далее под мониторингом системы я буду понимать сбор time series данных. Например, JVM heap size или количество обработанных сообщений за интервал.
Самодостаточность автоматически означает, что данные надо хранить локально. Отображать их надо в браузере, потому что уже есть вэб-админка для этого. Итак, что мы имеем из современного:
InfluxDB. Специальная база для хранения time series данных. Умеет делать аггрегации и data retention. Opensource версия не поддерживает кластеризацию, но для Raspberry PI и не нужно. Проблема с системными требованиями: CPU 2-4 ядра и RAM 2-4 Gb. Не подходит.
Все остальные варианты найденные на просторах, не подошли либо потому, что надо вручную делать data retention, либо требовательны к ресурсам, либо уж совсем наколеночные.
А что если продолжить мысль про RRD и Java? Получается RRD4J. Эта библиотека на Java, которая полностью поддерживает все операции и возможности оригинального rrdtool. Единственное отличие — это несовместимость баз данных между rrdtool и RRD4J. Но с другой стороны это даже лучше. Базы, созданные оригинальным rrdtool, бинарно несовместимы между различными архитектурами.
Итак, RRD. Он идеально подходит для Raspberry PI:
Но и не без проблем.
Не совместим с compact1 профайлом. RRD4J написан, похоже, в лихие 2000-е, когда шаблон visitor был очень модным, поэтому базовые классы зависят от org.w3c.*. Оказывается одной из фич оригинального rrdtool была возможность писать в XML вместо бинарного файла. И эту фичу RRD4J гордо скопировал. Решается просто: делается hard fork и удаляется все ненужное. Грязно, но работает.
И тут мне в голову приходит осознание. Мы же в 2017 году! Время, когда у нас есть стандарты на передачу бинарных файлов в браузер и разные мощные javascript библиотеки для рисования графиков. Что если передавать скачивать RRD базу с сервера как есть, вытаскивать из неё данные и рисовать уже какой-нибудь готовой и проверенной временем Javascript библиотекой?
Посидев несколько ночей в попытке понять как писать на Javascript и создать плагин для Jquery (а на нём ещё модно писать?), я создал rrd4j-js.
Суть проекта достаточно проста: скачивать RRD, парсить и передавать данные для отрисовки во flot. А уже плагинами flot добивать нужные стили и интерактив. В итоге, решение оказалось даже лучше, чем стандартные графики rrdgraph:
Библиотека получилась достаточно простая. Больше всего времени конечно заняло выяснение конвенций по оформлению кода, созданию классов (sic!) в javascript и попытке поделиться проектом с миром.
Я с самого начала решил сделать самодостаточную библиотеку, которую можно загрузить в npm. После нескольких попыток это сделать, у меня, конечно же, всё получилось. Но тут же выяснилось, что npm используется только для server-side разработки на nodejs. И нельзя просто так зарелизить библиотеку в правильный репозиторий. Да что тут стесняться: нельзя понять какой из репозиториев правильный. В итоге я остановился на npm. Может кто-нибудь сведущий подскажет как правильно?
С получившимся инструментом, уже можно было начинать творить. А именно периодически сохранять метрики в RRD4J. Обвязка в виде достаточно распространённых metrics работающая в compact1 — приятное дополнение. В итоге пришлось написать достаточно простой RRD4JReporter, который расширяет com.codahale.metrics.ScheduledReporter и пользоваться в удовольствие.