[Перевод] Панель мониторинга Grafana для пивной системы BeerTender

Пояснение. BeerTender — устройство для охлаждения и розлива пива от Krups и Heineken. По заявлению производителей, оно сохраняет качества свежего пива в течение 30 дней после открытия кега. Конечно, системным администраторам и девопсам удобно отслеживать температуру и уровень пива в своём бочонке с помощью привычных онлайновых панелей мониторинга. В предыдущей статье рассказывалось, как подключить BeerTender к Warp 10, а сейчас мы настроим панель мониторинга Grafana

edf3a3ce53ae1323eb8697358f0256bd.png

OVHcloud, крупнейший европейский хостер и облачный провайдер, активно использует платформу Warp 10. В один кластер Warp 10 стекаются все их данные мониторинга. Это 400 000 серверов, 27 дата-центров, в общей сложности несколько миллионов метрик в секунду!

У них много панелей мониторинга, а теперь OVHcloud является мейнтейнером опенсорсного плагина Warp 10 Grafana, разработку которого мы начали некоторое время назад. О нём и поговорим. Если хотите сами попробовать, данные в открытом доступе — можете скопировать WarpScript ниже.

1d3a631002ed21c5c17014adf259d785.png


Мы уже рассказывали, как подключить BeerTender к Warp 10

Установка


Во-первых, устанавливаем Grafana. Следуйте инструкциям на их веб-сайте.

Подключаемся к URL по умолчанию http://localhost:3000/, заходим по дефолтному паролю admin/admin, затем меняем пароль администратора.

Для последней версии Grafana плагин придётся установить вручную. Метод с grafana-cli не сработает. Нужно просто клонировать репозиторий плагина в каталог плагинов Grafana и везде исправить разрешения.

sudo systemctl stop grafana-server.service
sudo chown -R grafana:mygroup /var/lib/grafana/
sudo chmod g+rw /var/lib/grafana/plugins
git clone git@github.com:ovh/ovh-warp10-datasource.git /var/lib/grafana/plugins/ovh-warp10-datasource
sudo chown -R grafana:mygroup /var/lib/grafana/plugins
sudo systemctl start grafana-server.service


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


В конфигурации Grafana зайдите в раздел Datasources и добавьте datasource с типом Warp 10. Убедитесь, что он указывает на нужный инстанс Warp 10. Можете указать такие же настройки, как у нас:

458542267fe277be0e54ab6ac358df53.png

Пришло время снять данные с датчика BeerTender…

Отображение температуры


Создайте новый дашборд, добавьте панель с типом визуализации Graph (график) и зайдите в режим построения запроса (Queries):

04c4c2c72c65f5ba669aca9d86f7c401.png
Исходная температура (целочисленные значения c сенсора)

  • В источнике данных выберите Warp 10 (или значение по умолчанию)
  • Включите редактор WarpScript
  • Скопируйте WarpScript ниже
  • В правом верхнем углу выберите «Последние 30 дней»
  • Сохраните результат
"gCA1SVjbDkaxtmTx9ydI4TI2iGc5hFgcbCWnzMRZSt45XW8dZ53Z7VK_if28i0kXwNDLazXHgLrXUKgxLK0RbS79eJmBCpyBlIxw9US7bPfdWH4Fta51.kXN.D4Hsk5OZOwl.vLRBzMpP7F2pAMfclMXSGtCOT6F"
 'rt' STORE
 [ $rt 'beertender.rawtemperature' {} NOW 30 d ] FETCH 0 GET


Этот скрипт будет отображать исходные значения от АЦП датчика. Обратите внимание, что редактор WarpScript в Grafana не такой мощный, как раньше, здесь больше нет автодополнения. Можете написать скрипт в WarpStudio или VSCode, так у вас будет подсветка синтаксиса и онлайн-документация, а затем скопировать и вставить результат в Grafana.

Автоматический интервал


В данном примере выбираем 30-дневный интервал и устанавливаем режим просмотра в графане за последние 30 дней. Если мы выбираем режим просмотра за последний день или год, WarpScript будет всегда запрашивать данные каждые 30 дней. Плагин решает эту проблему: для использования в WarpScript’е доступны две переменные — $end и $interval.

[ $rt 'beertender.rawtemperature' {} $end $interval ] FETCH 0 


Температура пива


Я сделал несколько замеров воды, льда и горячей воды, сравнивая с эталонным датчиком… Получилось следующее:

T (°C)	исходное значение
18,3	680
41,5	870
37,6	841
10	586
11	596
8	559
1	467
4,5	500
6,5	535


Вставим эти значения во временной ряд GTS и отсортируем результат по исходным значениям с датчика:

NEWGTS 'linearInterpolation' RENAME
680 NaN NaN NaN 18.3 ADDVALUE
870 NaN NaN NaN 41.5 ADDVALUE
841 NaN NaN NaN 37.6 ADDVALUE
586 NaN NaN NaN 10 ADDVALUE
596 NaN NaN NaN 11 ADDVALUE
559 NaN NaN NaN 8 ADDVALUE
467 NaN NaN NaN 1 ADDVALUE
500 NaN NaN NaN 4.5 ADDVALUE
535 NaN NaN NaN 6.5 ADDVALUE
SORT


140dcb8ede7c3f8a3a7da87baeaa2ab6.png
Ожидаемая интерполяция

Исходные данные с датчика поступают в виде целых чисел. Самый простой способ интерполяции — сначала построить кривую, а затем применить функцию ATTICK для считывания с неё значений в градусах.

Интерполяция в WarpScript выполняется просто. Делаем бакет, чтобы установить нужный период, а затем запускаем интерполяцию, заполняя недостающие значения.

[ $linearInterpolation bucketizer.last 0 1 0 ] BUCKETIZE 0 GET
INTERPOLATE 'truthtableGTS' STORE

f146d76a90bca0b87a2b2c54779214e1.png

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

Предупреждение: значения поступают каждые 10 секунд. За три месяца накопится 270 тыс. значений. Слишком много для Grafana… Просто сохраним максимальное значение каждого часа. В WarpScript это BUCKETIZE с бакетизатором bucketizer.max.

Можете скопировать в Grafana этот WarpScript:

// raw value interpolation
"gCA1SVjbDkaxtmTx9ydI4TI2iGc5hFgcbCWnzMRZSt45XW8dZ53Z7VK_if28i0kXwNDLazXHgLrXUKgxLK0RbS79eJmBCpyBlIxw9US7bPfdWH4Fta51.kXN.D4Hsk5OZOwl.vLRBzMpP7F2pAMfclMXSGtCOT6F"
'rt' STORE

NEWGTS 'linearInterpolation' RENAME
680 NaN NaN NaN 18.3 ADDVALUE
870 NaN NaN NaN 41.5 ADDVALUE
841 NaN NaN NaN 37.6 ADDVALUE
586 NaN NaN NaN 10 ADDVALUE
596 NaN NaN NaN 11 ADDVALUE
559 NaN NaN NaN 8 ADDVALUE
467 NaN NaN NaN 1 ADDVALUE
500 NaN NaN NaN 4.5 ADDVALUE
535 NaN NaN NaN 6.5 ADDVALUE
SORT 'linearInterpolation' STORE

[ $linearInterpolation bucketizer.last 0 1 0 ] BUCKETIZE 0 GET
INTERPOLATE 'truthtableGTS' STORE

[ $rt 'beertender.rawtemperature' {} NOW $end $interval ] FETCH 
// subsampling, keep max of every hour
[ SWAP bucketizer.max 0 1 h 0 ] BUCKETIZE
UNBUCKETIZE // do not try to interpolate missing buckets.
// interpolation
[ SWAP 
  <% 
    'l' STORE
    [
      $l 0 GET //same tick
      NaN NaN NaN  //no latitude/longitude/elevation
      $truthtableGTS $l 7 GET 0 GET ATTICK 4 GET //take the interpolated value
    ]
%> MACROMAPPER 0 0 0 ] MAP
'temperature (°C)' RENAME


b901de94794350e3a1b01a04f24a69e4.png
5°C, нормально для пива

7afe0a744272dd6d75b6ea949b0d414e.png
Панель мониторинга BeerTender, первая версия

Уровень в бочонке


Уровень в бочонке замеряет тензометр… Но это дешёвый трёхпроводной датчик на ржавой металлической подставке. С такого оборудования невозможно получить точную информацию. Поэтому неудивительно, что на выходе действительно зашумлённый результат, и абсолютным значениям нельзя доверять. Для нашего BeerTender я нашёл экспериментальную формулу, чтобы Grafana отображала текущий уровень в процентах.

Совет: плагин Warp 10 получает данные только из GTS. Даже если вы хотите отобразить одно значение, его нужно представить в одной точке данных GTS.

Вот WarpScript, который берёт последнюю точку данных и превращает её в процентное значение, а также создаёт временной ряд с одной точкой:

"gCA1SVjbDkaxtmTx9ydI4TI2iGc5hFgcbCWnzMRZSt45XW8dZ53Z7VK_if28i0kXwNDLazXHgLrXUKgxLK0RbS79eJmBCpyBlIxw9US7bPfdWH4Fta51.kXN.D4Hsk5OZOwl.vLRBzMpP7F2pAMfclMXSGtCOT6F"
'rt' STORE

//read for beer level
[ $rt 'beertender.rawvalue' {} NOW -1 ] FETCH 
0 GET VALUES 0 GET 'rawSensorValue' STORE

//raw correction: 
// empty: 30.8e6
// full (and cold): 30.5e6 

30.8e6 $rawSensorValue - 0 MAX 
2800 / 100 MIN   
'beerlevelPercent' STORE

$beerlevelPercent
NEWGTS 'Barre Level (%25)' RENAME
1 NaN NaN NaN $beerlevelPercent ADDVALUE


Этот WarpScript использовать в качестве запроса для панели с типом визуализации Gauge:

5765fc72c3dd8525d1174cb84eda5f43.png
Симпатичный индикатор

Если вам интересно, можете посмотреть и исходные данные… Теперь у нас есть токен для доступа к уникальной статистике по потреблению пива!

Выводы


  • Если данные мониторинга за последнее время находятся под вашим контролем, Grafana может легко интегрировать источник данных Warp 10.
  • Плагин Grafana ожидает временной ряд GTS или список GTS.
  • OVHcloud — текущий мейнтейнер плагина. Не стесняйтесь вносить свой вклад!
  • Читайте документацию для дополнительной информации.
  • Если хотите обогатить визуализацию данных, можете брать наши готовые веб-компоненты.


1d3a631002ed21c5c17014adf259d785.png

© Habrahabr.ru