- PVSM.RU - https://www.pvsm.ru -
Возникла передо мной такая задача: сделать мониторинг Raspberry PI. И требования:
Здесь и далее под мониторингом системы я буду понимать сбор time series данных. Например, JVM heap size или количество обработанных сообщений за интервал.
Самодостаточность автоматически означает, что данные надо хранить локально. Отображать их надо в браузере, потому что уже есть вэб-админка для этого. Итак, что мы имеем из современного:
InfluxDB [2]. Специальная база для хранения time series данных. Умеет делать аггрегации и data retention. Opensource версия не поддерживает кластеризацию, но для Raspberry PI и не нужно. Проблема с системными требованиями: CPU 2-4 ядра и RAM 2-4 Gb [3]. Не подходит.
Все остальные варианты найденные на просторах, не подошли либо потому, что надо вручную делать data retention, либо требовательны к ресурсам, либо уж совсем наколеночные.
А что если продолжить мысль про RRD и Java? Получается RRD4J [7]. Эта библиотека на Java, которая полностью поддерживает все операции и возможности оригинального rrdtool [8]. Единственное отличие — это несовместимость баз данных между rrdtool и RRD4J. Но с другой стороны это даже лучше. Базы, созданные оригинальным rrdtool, бинарно несовместимы между различными архитектурами.
Итак, RRD. Он идеально подходит для Raspberry PI:
Но и не без проблем.
Не совместим с compact1 профайлом. RRD4J написан, похоже, в лихие 2000-е, когда шаблон visitor [10] был очень модным, поэтому базовые классы зависят от org.w3c.*. Оказывается одной из фич оригинального rrdtool была возможность писать в XML вместо бинарного файла. И эту фичу RRD4J гордо скопировал. Решается просто: делается hard fork [11] и удаляется все ненужное. Грязно, но работает.
И тут мне в голову приходит осознание. Мы же в 2017 году! Время, когда у нас есть стандарты на передачу бинарных файлов в браузер и разные мощные javascript библиотеки для рисования графиков. Что если передавать скачивать RRD базу с сервера как есть, вытаскивать из неё данные и рисовать уже какой-нибудь готовой и проверенной временем Javascript библиотекой?
Посидев несколько ночей в попытке понять как писать на Javascript и создать плагин для Jquery (а на нём ещё модно писать?), я создал rrd4j-js [13].
Суть проекта достаточно проста: скачивать RRD, парсить и передавать данные для отрисовки во flot [14]. А уже плагинами flot добивать нужные стили и интерактив. В итоге, решение оказалось даже лучше, чем стандартные графики rrdgraph:
Библиотека получилась достаточно простая. Больше всего времени конечно заняло выяснение конвенций по оформлению кода, созданию классов (sic!) в javascript и попытке поделиться проектом с миром.
Я с самого начала решил сделать самодостаточную библиотеку, которую можно загрузить в npm. После нескольких попыток это сделать, у меня, конечно же, всё получилось. Но тут же выяснилось, что npm используется только для server-side разработки на nodejs. И нельзя просто так [16] зарелизить библиотеку в правильный репозиторий. Да что тут стесняться: нельзя понять какой из репозиториев правильный. В итоге я остановился на npm. Может кто-нибудь сведущий подскажет как правильно?
С получившимся инструментом, уже можно было начинать творить. А именно периодически сохранять метрики в RRD4J. Обвязка в виде достаточно распространённых metrics [17] работающая в compact1 — приятное дополнение. В итоге пришлось написать достаточно простой RRD4JReporter [18], который расширяет com.codahale.metrics.ScheduledReporter и пользоваться в удовольствие.
Автор: dernasherbrezon
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/261452
Ссылки в тексте:
[1] Java и без 16Gb памяти?: https://habrahabr.ru/post/333430/
[2] InfluxDB: https://www.influxdata.com
[3] CPU 2-4 ядра и RAM 2-4 Gb: https://docs.influxdata.com/influxdb/v1.3/guides/hardware_sizing/
[4] Graphite: https://graphiteapp.org
[5] whisper: http://graphite.readthedocs.io/en/latest/whisper.html
[6] как уверяется: http://graphite.wikidot.com/whisper#toc1
[7] RRD4J: https://github.com/rrd4j/rrd4j
[8] rrdtool: https://oss.oetiker.ch/rrdtool/index.en.html
[9] каждый раз: https://oss.oetiker.ch/rrdtool/doc/rrdupdate.en.html#___top
[10] visitor: https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%81%D0%B5%D1%82%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
[11] hard fork: https://github.com/dernasherbrezon/rrd4j-light
[12] rrdgraph: https://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html
[13] rrd4j-js: https://www.npmjs.com/package/rrd4j-js
[14] flot: http://www.flotcharts.org
[15] jquery.flot.byte: https://github.com/whatbox/jquery.flot.byte
[16] просто так: https://stackoverflow.com/questions/35062852/npm-vs-bower-vs-browserify-vs-gulp-vs-grunt-vs-webpack
[17] metrics: https://github.com/dropwizard/metrics
[18] RRD4JReporter: https://github.com/dernasherbrezon/r2cloud/blob/master/src/main/java/ru/r2cloud/metrics/RRD4JReporter.java
[19] Источник: https://habrahabr.ru/post/334508/
Нажмите здесь для печати.