Grafana: различия между версиями

Материал из Wiren Board
 
(не показаны 94 промежуточные версии 4 участников)
Строка 1: Строка 1:
{{Draft}}
{{DISPLAYTITLE: Использование Grafana с контроллером Wiren Board }}
[[Image: Grafana Dash Demo.png |600px|thumb|right| Пример дашборда в Grafana: выходной контроль устройств у нас на производстве ]]
== Введение ==
'''Grafana''' — мультиплатформенное веб-приложение с открытым кодом, отображающее данные в виде графиков, диаграмм, индикаторов, а также другими способами. Конечные пользователи могут создавать сложные панели мониторинга с помощью интерактивного конструктора запросов. Умеет отправлять оповещения (alert). Расширяется с помощью системы плагинов.
'''Grafana''' — мультиплатформенное веб-приложение с открытым кодом, отображающее данные в виде графиков, диаграмм, индикаторов, а также другими способами. Конечные пользователи могут создавать сложные панели мониторинга с помощью интерактивного конструктора запросов. Умеет отправлять оповещения (alert). Расширяется с помощью системы плагинов.


Строка 6: Строка 8:
Grafana можно установить на собственный сервер, либо использовать облачный сервис [https://grafana.com/products/cloud/ Grafana Cloud].
Grafana можно установить на собственный сервер, либо использовать облачный сервис [https://grafana.com/products/cloud/ Grafana Cloud].


== Как настроить отображение данных с контроллера Wiren Board в Grafana Cloud ==
== Grafana Cloud ==
[[Image: Grafana Cloud.png |600px|thumb|right| Схема обмена данными при использовании Grafana Cloud]]
В состав Grafana Cloud уже есть база данных, поэтому отдельно устанавливать и настраивать базу данных не нужно.


В состав Grafana Cloud входит собственная база данных, поэтому устанавливать и настраивать базу данных не требуется.
Схема работы:
* На контроллер устанавливается [https://www.influxdata.com/time-series-platform/telegraf/ клиент Telegraf]
* Telegraf отправляет данные в базу данных Prometheus.
* Grafana отображает содержимое базы данных.


Показания с контроллера Wiren Board будут передаваться по схеме:
=== Регистрация в Grafana Cloud ===
# Зарегистрируйтесь в [https://grafana.com/auth/sign-up/create-user Grafana Cloud].
# Перейдите в настройки аккаунта по ссылке '''My Account'''.
# Найдите карточку '''Prometheus''' и нажмите кнопку '''Send Metrics'''.
# На открывшейся странице найдите и сохраните данные из полей:
#* Query Endpoint
#* Remote Write Endpoint
#* Username / Instance ID
#* Password / API Key, для генерации ключа нажмите '''Generate now'''.


MQTT-брокер на контроллере Wiren Board -> [https://www.influxdata.com/time-series-platform/telegraf/ клиент Telegraf] на контроллере Wiren Board -> Grafana Cloud.
<gallery widths=322px heights=200px perrow=2>
Image: Grafana Cloud Site 1.png | Настройки Grafana Cloud
Image: Grafana Cloud Site 2.png | Данные, которые нужно сохранить
</gallery>


=== Регистрация в Grafana Cloud ===
=== Установка и настройка Telegraf ===
# Зарегистрируйтесь по ссылке [https://grafana.com/auth/sign-up/create-user].
Telegraf — это сервис, который устанавливается на контроллер Wiren Board и отправляет данные в базу данных Grafana Cloud. Для выполнения команд, откройте консоль контроллера по [[SSH]].


=== Установка и настройка Telegraf на контроллер Wiren Board ===
Установка:
# Установите дополнительные пакеты:
#:<syntaxhighlight lang="bash">
apt update && apt install apt-transport-https
apt -y install gnupg
</syntaxhighlight>
# Добавьте ключ репозитория Telegraf:
#:<syntaxhighlight lang="bash">
wget -qO- https://repos.influxdata.com/influxdata-archive_compat.key | apt-key add -
</syntaxhighlight>
# Добавьте в список apt-репозиториев ссылку на репозиторий telegraf:
#*<syntaxhighlight lang="bash">
source /etc/os-release
</syntaxhighlight>
#* Здесь <code>bullseye</code> — версия ОС:
#*:<syntaxhighlight lang="bash">
echo "deb https://repos.influxdata.com/debian bullseye stable" | tee /etc/apt/sources.list.d/influxdb.list
</syntaxhighlight>
# Обновите список пакетов и установите Telegraf:
#:<syntaxhighlight lang="bash">
apt update && apt install telegraf
</syntaxhighlight>
# Включите автозапуск сервиса:
#:<syntaxhighlight lang="bash">
systemctl enable telegraf
</syntaxhighlight>


# Установите и запустите Telegraf в соответствии с [https://docs.influxdata.com/telegraf/v1.19/introduction/installation/ https://docs.influxdata.com/telegraf/v1.19/introduction/installation/]:
Настройка:
# Откройте файл настроек Telegraf:
#: <syntaxhighlight lang="bash">
#: <syntaxhighlight lang="bash">
apt update && apt install apt-transport-https
nano /etc/telegraf/telegraf.conf
wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add - 
source /etc/os-release 
test $VERSION_ID = "7" && echo "deb https://repos.influxdata.com/debian wheezy stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
test $VERSION_ID = "8" && echo "deb https://repos.influxdata.com/debian jessie stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
test $VERSION_ID = "9" && echo "deb https://repos.influxdata.com/debian stretch stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
test $VERSION_ID = "10" && echo "deb https://repos.influxdata.com/debian buster stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
apt update && apt install telegraf
systemctl start telegraf
</syntaxhighlight>
</syntaxhighlight>
# Добавьте в <code>/etc/telegraf/telegraf.conf</code> секции для получения данных из MQTT и отправки данных в Grafana Cloud. В секции отправки данных замените логин и пароль на указанные на странице [https://grafana.com/orgs/wiren https://grafana.com/orgs/wiren] в разделе Prometheus - Send metrics.
# Секция '''inputs.mqtt_consumer''', поля ''servers'', ''topics'', ''data_format'' и ''data_type'':
#: <syntaxhighlight lang="bash">
#: <syntaxhighlight lang="bash">
[[inputs.mqtt_consumer]]
[[inputs.mqtt_consumer]]
Строка 100: Строка 136:
     data_type = "float"
     data_type = "float"
</syntaxhighlight>
</syntaxhighlight>
#: <syntaxhighlight lang="bash">
# Секция '''outputs.http''', поля ''url'', ''username'', ''password'', ''data_format'' и ''[outputs.http.headers]''. Ссылку и логин с паролем мы сохраняли в разделе про регистрацию.
#:<syntaxhighlight lang="bash">
[[outputs.http]]
[[outputs.http]]
   ## URL is the address to send metrics to
   ## URL is the address to send metrics to
Строка 118: Строка 155:
     X-Prometheus-Remote-Write-Version = "0.1.0"
     X-Prometheus-Remote-Write-Version = "0.1.0"
</syntaxhighlight>
</syntaxhighlight>
# Проверьте, что Telegraf работает без ошибок.
# Закомментируйте секцию '''outputs.influxdb''':
## Остановите его и запустите вручную:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
# Configuration for sending metrics to InfluxDB
# [[outputs.influxdb]]
  ## The full HTTP or UDP URL for your InfluxDB instance.
  ##
  ## Multiple URLs can be specified for a single cluster, only ONE of the
  ## urls will be written to each interval.
  # urls = ["unix:///var/run/influxdb.sock"]
  # urls = ["udp://127.0.0.1:8089"]
  # urls = ["http://127.0.0.1:8086"]
 
  ## The target database for metrics; will be created as needed.
  ## For UDP url endpoint database needs to be configured on server side.
  # database = "telegraf"
 
  ## The value of this tag will be used to determine the database.  If this
  ## tag is not set the 'database' option is used as the default.
  # database_tag = ""
 
  ## If true, the 'database_tag' will not be included in the written metric.
  # exclude_database_tag = false
 
  ## If true, no CREATE DATABASE queries will be sent.  Set to true when using
  ## Telegraf with a user without permissions to create databases or when the
  ## database already exists.
  # skip_database_creation = false
 
  ## Name of existing retention policy to write to.  Empty string writes to
  ## the default retention policy.  Only takes effect when using HTTP.
  # retention_policy = ""
 
  ## The value of this tag will be used to determine the retention policy.  If this
  ## tag is not set the 'retention_policy' option is used as the default.
  # retention_policy_tag = ""
 
  ## If true, the 'retention_policy_tag' will not be included in the written metric.
  # exclude_retention_policy_tag = false
 
  ## Write consistency (clusters only), can be: "any", "one", "quorum", "all".
  ## Only takes effect when using HTTP.
  # write_consistency = "any"
 
  ## Timeout for HTTP messages.
  # timeout = "5s"
 
  ## HTTP Basic Auth
  # username = "telegraf"
  # password = "metricsmetricsmetricsmetrics"
 
  ## HTTP User-Agent
  # user_agent = "telegraf"
 
  ## UDP payload size is the maximum packet size to send.
  # udp_payload = "512B"
 
  ## Optional TLS Config for use on HTTP connections.
  # tls_ca = "/etc/telegraf/ca.pem"
  # tls_cert = "/etc/telegraf/cert.pem"
  # tls_key = "/etc/telegraf/key.pem"
  ## Use TLS but skip chain & host verification
  # insecure_skip_verify = false
 
  ## HTTP Proxy override, if unset values the standard proxy environment
  ## variables are consulted to determine which proxy, if any, should be used.
  # http_proxy = "http://corporate.proxy:3128"
 
  ## Additional HTTP headers
  # http_headers = {"X-Special-Header" = "Special-Value"}
 
  ## HTTP Content-Encoding for write request body, can be set to "gzip" to
  ## compress body or "identity" to apply no encoding.
  # content_encoding = "gzip"
 
  ## When true, Telegraf will output unsigned integers as unsigned values,
  ## i.e.: "42u".  You will need a version of InfluxDB supporting unsigned
  ## integer values.  Enabling this option will result in field type errors if
  ## existing data has been written.
  # influx_uint_support = false
</syntaxhighlight>
# Сохраните файл и закройте редактор.
 
Проверка работы:
# Остановите сервис:
#:<syntaxhighlight lang="bash">
systemctl stop telegraf
systemctl stop telegraf
telegraf -debug
</syntaxhighlight>
</syntaxhighlight>
##Если ошибок нет, запустите Telegraf:<syntaxhighlight lang="bash">
# Запустите сервис в режиме отладки и убедитесь, что данные отправляются:
#:<syntaxhighlight lang="console" highlight="15-19">
# telegraf -debug
2021-11-29T16:47:13Z I! Starting Telegraf 1.20.4
2021-11-29T16:47:13Z I! Using config file: /etc/telegraf/telegraf.conf
2021-11-29T16:47:13Z I! Loaded inputs: cpu disk diskio kernel mem mqtt_consumer processes swap system
2021-11-29T16:47:13Z I! Loaded aggregators:
2021-11-29T16:47:13Z I! Loaded processors:
2021-11-29T16:47:13Z I! Loaded outputs: http
2021-11-29T16:47:13Z I! Tags enabled: host=wirenboard-AWQBNTYP
2021-11-29T16:47:13Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"wirenboard-AWQBNTYP", Flush Interval:10s
2021-11-29T16:47:13Z D! [agent] Initializing plugins
2021-11-29T16:47:13Z D! [agent] Connecting outputs
2021-11-29T16:47:13Z D! [agent] Attempting connection to [outputs.http]
2021-11-29T16:47:13Z D! [agent] Successfully connected to outputs.http
2021-11-29T16:47:13Z D! [agent] Starting service inputs
2021-11-29T16:47:13Z I! [inputs.mqtt_consumer] Connected [tcp://127.0.0.1:1883]
2021-11-29T16:47:24Z D! [outputs.http] Wrote batch of 31 metrics in 696.002545ms
2021-11-29T16:47:24Z D! [outputs.http] Buffer fullness: 1 / 10000 metrics
2021-11-29T16:47:33Z D! [outputs.http] Wrote batch of 34 metrics in 129.098071ms
2021-11-29T16:47:33Z D! [outputs.http] Buffer fullness: 0 / 10000 metrics
</syntaxhighlight>
# Если ошибок нет, то остановите команду клавишами <kbd>Ctrl</kbd>+<kbd>C</kbd>.
# Запустите сервис в автоматическом режиме:
#:<syntaxhighlight lang="bash">
systemctl start telegraf
systemctl start telegraf
</syntaxhighlight>
</syntaxhighlight>


=== Создание панели с данными от контроллера Wiren Board в Grafana ===
=== Настройка в Grafana источника данных ===
Чтобы Grafana могла отобразить данные из базы данных Prometheus, нужно в её веб-интерфейсе добавить источник данных:
# Откройте веб-интерфейс Grafana.
# Перейдите в настройки аккаунта по ссылке '''My Account'''.
# Найдите карточку '''Grafana''' и нажмите кнопку '''Log In'''.
# Слева на панели нажмите на «шестерёнку» и выберите пункт '''Data Sources'''.
# Откроется страница со списком источников данных, нажмите на кнопку '''Add data source'''.
# В открывшемся списке найдите '''Prometheus''' и нажмите кнопку '''Select'''.
# На странице создания нового источника данных заполните:
#* Наименование, можно оставить по умолчанию.
#* URL — ссылка, сохранённая на этапе регистрации из поля ''Query Endpoint'' (без push на конце)
#* Auth — включите флажок Basic auth
#* Basic Auth Details — заполните поля User и Password.
# Чтобы сохранить настройки, нажмите '''Save & Test''', при успешном подключении появится сообщение '''Data source is working'''.
 
Если после сохранения настроек нет ошибок, то переходите к созданию дашборда.
 
<gallery widths=305px heights=200px perrow=3>
Image: Grafana Cloud - 1. Add Data Source 0.png | Переход к списку источников данных
Image: Grafana Cloud - 1. Add Data Source 1.png | Добавление нового источника
Image: Grafana Cloud - 1. Add Data Source 2.png | Выбор типа источника
Image: Grafana Cloud - 1. Add Data Source 3.png | Настройка источника данных: наименование и URL
Image: Grafana Cloud - 1. Add Data Source 4.png | Настройка источника данных: логин и пароль
Image: Grafana Cloud - 1. Add Data Source 5.png | Настройка источника данных: проверка соединения
</gallery>
 
=== Создание дашборда в Grafana ===
После того как мы создали источник данных — добавьте новый дашборд и создайте запрос на выборку данных:
# Откройте веб-интерфейс Grafana.
# Перейдите в настройки аккаунта по ссылке '''My Account'''.
# Найдите карточку '''Grafana''' и нажмите кнопку '''Log In'''.
# Выберите на панели слева «плюсик» и пункт '''Dashboard'''.
# В открывшейся странице '''New dashboard''', нажмите на плитку '''Add a empty panel'''. Откроется страница создания запроса.
# В поле '''Data source''' выберите созданный ранее источник данных.
# В строке '''A → Metrics browser''':
#* в группе '''2. Select labels to search in''' выберите '''topic''';
#* в группе '''3. Select values for your labels''' выберите топик, который мы отправили с контроллера;
#* Нажмите кнопку '''Use query'''. Сразу после этого на панели сверху должен появиться график.
# Задайте панели имя в поле '''Panel options''' → '''Title'''.
# Сохраните дашборд, для этого нажмите кнопку '''Save''', в появившемся окне '''введите имя''' и нажмите кнопку '''Save'''.
 
Настройка дашборда завершена.
 
Запрос из примера в текстовом виде:
<syntaxhighlight lang="json">
{topic="/devices/power_status/controls/Vin"}
</syntaxhighlight>
 
<gallery widths=305px heights=200px perrow=3 >
Image: Grafana Cloud - 2. Add Dashboard 0.png | Добавление нового дашборда
Image: Grafana Cloud - 2. Add Dashboard 1.png | Добавление панели в дашборд
Image: Grafana Cloud - 3. Construct Query 1.png | A → Metrics browser
Image: Grafana Cloud - 3. Construct Query 2.png | Выбор топика
Image: Grafana Cloud - 3. Construct Query 3.png | Выбор топика
Image: Grafana Cloud - 3. Construct Query 4.png | Кнопка Use query
Image: Grafana Cloud - 4. Save Dashboard 0.png | Сохранение дашборда и панели
Image: Grafana Cloud - 4. Save Dashboard 1.png | Ввод наименования дашборда
Image: Grafana Cloud - 5. WB Dashboard.png | Созданный дашборд с панелью Vin
</gallery>
 
== Свой сервер Grafana ==
[[Image: Local Grafana.png |600px|thumb|right| Схема обмена данными при использовании своего сервера Grafana ]]
Для установки Grafana нам потребуется выделенный сервер с IP-адресом, доступным с контроллера Wiren Board.


== Как настроить отображение данных с контроллера Wiren Board в Grafana на собственном сервере ==
Схема работы:
* Один или несколько контроллеров передают значения [[MQTT]] топиков в MQTT-брокер, установленный на сервере Grafana.
* На сервере Grafana выполняется скрипт, который записывает MQTT-топики брокера в базу данных Influx.
* Grafana отображает содержимое базы данных Influx.


На основе https://grafana.com/docs/grafana/latest/installation/debian/
Grafana и MQTT-брокер можно установить на один сервер, или разнести на разные. Если вы используете два разных сервера, то IP-адрес MQTT-брокера должен быть доступен с контроллера Wiren Board и с сервера, на котором установлена Grafana.
Цель: получить удобный способ для хранения и анализа данных с контроллеров.
Средства: Выделенный сервер (если планируется сбор данных с контроллеров через интернет - то с "белым" адресом).


=== Подготовка к установке ===
=== Установка Grafana ===
Используем чистый Debian,
[[Файл:Gragana_login_1.png|400px|thumb|right|Страница входа в веб-интерфейс Grafana]]
Добавляем пакеты, ключи
В примере мы установим Grafana на сервер с Debian Linux 11.


<syntaxhighlight lang="bash">
Подготовьте сервер к установке:
apt install -y apt-transport-https software-properties-common wget gnupg2 sudo python3-pip
#Установите пакеты:
#:<syntaxhighlight lang="bash">
sudo apt install -y apt-transport-https software-properties-common wget gnupg2 sudo python3-pip
</syntaxhighlight>
#Добавьте ключ репозитория <code>packages.grafana.com</code>:
#:<syntaxhighlight lang="bash">
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
</syntaxhighlight>
#Добавьте ссылку на репозиторий <code>packages.grafana.com</code>:
#:<syntaxhighlight lang="bash">
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
apt update
</syntaxhighlight>
#Обновите список пакетов:
#:<syntaxhighlight lang="bash">
sudo apt update
</syntaxhighlight>
</syntaxhighlight>


=== Установка ===
Если во время установки Grafana по инструкции выше возникнет ошибка <code>gpg: no valid OpenPGP data found</code> — [https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/ установите Grafana в docker]. Причина описана тут: [https://community.grafana.com/t/cant-download-grafana-9-0-2-from-russia/68391 Can’t download grafana 9.0.2 from russia]. Остальные пакеты ставятся как обычно — просто следуйте инструкции.
Ставим grafana и БД influxdb:
 
Установите необходимое ПО:
#grafana, python3 и БД influxdb:
#:<syntaxhighlight lang="bash">
sudo apt install -y grafana influxdb influxdb-client python3-pip
</syntaxhighlight>
# и дополнительные модули python:
#:<syntaxhighlight lang="bash">
sudo pip3 install paho-mqtt python-etcd influxdb
</syntaxhighlight>
 
Разрешите автозапуск сервиса и запустите его:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
apt install -y grafana influxdb influxdb-client
sudo systemctl enable grafana-server && sudo systemctl start grafana-server
</syntaxhighlight>
 
Проверьте статус сервиса:
<syntaxhighlight lang="console" highlight="4">
$ systemctl status grafana-server
● grafana-server.service - Grafana instance
    Loaded: loaded (/lib/systemd/system/grafana-server.service; enabled; vendor preset: enabled)
    Active: active (running) since Thu 2021-11-25 13:56:19 +04; 2min 33s ago
      Docs: http://docs.grafana.org
  Main PID: 3237 (grafana-server)
      Tasks: 9 (limit: 4663)
    Memory: 35.2M
        CPU: 1.371s
</syntaxhighlight>
</syntaxhighlight>


Разрешаем автозапуск, запускаем и проверяем:
Если статус <code>Active: active (running)</code> — переходите к следующим шагам.
<syntaxhighlight lang="bash">
 
apt install -y grafana
Создайте базу данных Influxdb с именем '''mqtt_data''':
systemctl enable grafana-server && systemctl start grafana-server
<syntaxhighlight lang="console">
systemctl status grafana-server
$ echo "CREATE DATABASE mqtt_data; show databases;" | influx
 
name: databases
name
----
_internal
mqtt_data
</syntaxhighlight>
 
Перейдите в веб-интерфейс Grafana:
# Откройте браузер и введите в адресную строку <code>http://192.168.2.36:3000</code>, где '''192.168.2.36''' — IP-адрес вашего сервера с Grafana.
# Введите логин/пароль '''admin'''/'''admin'''. После первого входа задайте новый пароль.
 
Если вы забыли введённый пароль, то его можно сбросить:
# Подключитесь к контроллеру по [[SSH]].
# Введите команду:  
#: <syntaxhighlight lang="bash">
grafana-cli --homepath "/usr/share/grafana/" admin reset-admin-password admin
</syntaxhighlight>
# Перезапустите сервис:
#:<syntaxhighlight lang="bash">
systemctl restart grafana-server
</syntaxhighlight>
# После этого зайдите в веб-интерфейс Grafana и создайте новый пароль.
 
=== Установка MQTT-брокера ===
Теперь настроим MQTT-брокер, куда контроллер Wiren Board будет отправлять данные.
 
Установите на сервер с Grafana '''mosquitto''' по инструкции [[MQTT#Установка брокера | Установка брокера]].
 
=== Настройка моста на контроллере ===
[[Image: Wiren Board Controller Bridge.png |500px|thumb|right| Файл конфигурации MQTT-моста]]
Настройте на контроллере Wiren Board подключение к внешнему MQTT-брокеру:
# Подключитесь к контроллеру по [[SSH]].
# Создайте файл конфигурации <code>bridge1.conf</code>:
#: <syntaxhighlight lang="bash">
nano /etc/mosquitto/conf.d/bridge1.conf
</syntaxhighlight>
# Вставьте в него строки, в которых замените в двух местах '''AWQBNTYP''' на серийный номер контроллера, а '''192.168.2.36''' на IP-адрес брокера:
#:<syntaxhighlight lang="bash">
connection bridge1
#address of server
address 192.168.2.36
notifications true
notification_topic /client/AWQBNTYP/bridge1_status
remote_username test
remote_password wbpassword
topic /hwmon/# both 2 /devices /client/AWQBNTYP/devices
</syntaxhighlight>
#: в конфигурации выше мы отправляем в MQTT-брокер все подтопики устройства '''hwmon''', чтобы передать все топики контроллера, замените путь <code>/hwmon/#</code> на <code>/#</code>
# Сохраните изменения и закройте файл.
# Перезапустите mosquitto:
#:<syntaxhighlight lang="bash">
systemctl restart mosquitto
</syntaxhighlight>
 
Теперь проверим, что контроллер отправляет данные во внешний MQTT-брокер:
#Выполните в консоли контроллера команду, в которой замените '''192.168.2.36''' на IP-адрес брокера, '''AWQBNTYP''' на серийный номер контроллера, а '''test''' и '''wbpassword''' на логин и пароль от MQTT-брокера:
#:<syntaxhighlight lang="console">
# mosquitto_sub -v -h 192.168.2.36 -u test -P wbpassword -t /client/AWQBNTYP/devices/#
/client/AWQBNTYP/devices/hwmon/meta/driver wb-rules
/client/AWQBNTYP/devices/hwmon/meta/name HW Monitor
/client/AWQBNTYP/devices/hwmon/controls/Board Temperature 35.875
/client/AWQBNTYP/devices/hwmon/controls/Board Temperature/meta/type temperature
/client/AWQBNTYP/devices/hwmon/controls/Board Temperature/meta/order 1
/client/AWQBNTYP/devices/hwmon/controls/Board Temperature/meta/readonly 1
/client/AWQBNTYP/devices/hwmon/controls/CPU Temperature 66.917
/client/AWQBNTYP/devices/hwmon/controls/CPU Temperature/meta/type temperature
/client/AWQBNTYP/devices/hwmon/controls/CPU Temperature/meta/order 2
/client/AWQBNTYP/devices/hwmon/controls/CPU Temperature/meta/readonly 1
/client/AWQBNTYP/devices/hwmon/controls/CPU Temperature 66.917
/client/AWQBNTYP/devices/hwmon/controls/Board Temperature 35.875
</syntaxhighlight>
#:Если после выполнения команды вы получите список топиков — контролер успешно отправляет данные во внешний брокер.
# Завершите команду клавишами <kbd>Ctrl</kbd>+<kbd>C</kbd>.
 
=== Скрипт на сервере Grafana ===
[[Image: Grafana mqtt to influxdb script.png |500px|thumb|right| Создание сервиса для запуска скрипта ]]
Теперь скачаем на сервер с Grafana скрипт, который будет отправлять данные из MQTT-брокера в базу данных Influx:
# Перейдите на сервере в папку <code>/usr/local/bin</code>
#:<syntaxhighlight lang="bash">
cd /usr/local/bin
</syntaxhighlight>
# Скачайте в эту папку скрипт:
#:<syntaxhighlight lang="bash">
sudo wget https://raw.githubusercontent.com/wirenboard/wbmqtt2influx/master/mqtt_to_influxdb.py
</syntaxhighlight>
# Разрешите выполнение скрипта командой:
#:<syntaxhighlight lang="bash">
sudo chmod +x mqtt_to_influxdb.py
</syntaxhighlight>
# Создайте сервис, который будет автоматически запускать скрипт:
#:<syntaxhighlight lang="bash">
sudo systemctl edit --force --full mqtt_to_influxdb.service
</syntaxhighlight>
# В открывшийся редактор вставьте строки, в которых замените '''test''' и '''wbpassword''' на логин и пароль от MQTT-брокера.:
#:<syntaxhighlight lang="bash">
[Unit]
Description=Mqtt to Influxdb script
After=multi-user.target
Requires=influxd.service
 
[Service]
Type=idle
User=mosquitto
ExecStart=/usr/bin/python3 /usr/local/bin/mqtt_to_influxdb.py -h localhost "/#" -u "test" -P "wbpassword"
Restart=always
TimeoutStartSec=10
RestartSec=10
 
[Install]
WantedBy=multi-user.target
</syntaxhighlight>
#: Если MQTT-брокер стоит на отдельном от Grafana сервере, укажите его IP-адрес вместо '''localhost'''.
# Сохраните файл, для этого нажмите клавиши <kbd>Ctrl</kbd>+<kbd>O</kbd>, затем <kbd>Enter</kbd> и <kbd>Ctrl</kbd>+<kbd>X</kbd>.
# Настройте автозапуск и запустите сервис:
#:<syntaxhighlight lang="bash">
sudo systemctl enable mqtt_to_influxdb.service && sudo systemctl start mqtt_to_influxdb.service
</syntaxhighlight>
# Проверьте статус сервиса:
#:<syntaxhighlight lang="console" highlight="4" >
$ systemctl status mqtt_to_influxdb.service
● mqtt_to_influxdb.service - Mqtt to Influxdb script
    Loaded: loaded (/etc/systemd/system/mqtt_to_influxdb.service; enabled; vendor preset: enabled)
    Active: active (running) since Thu 2021-11-25 21:38:32 +04; 4s ago
  Main PID: 5440 (python3)
      Tasks: 2 (limit: 4663)
    Memory: 17.1M
        CPU: 206ms
    CGroup: /system.slice/mqtt_to_influxdb.service
            └─5440 /usr/bin/python3 /usr/local/bin/mqtt_to_influxdb.py -h localhost /# -u test -P wbpassword
</syntaxhighlight>
#: Если в выводе команды есть строчка <code>Active: active (running)</code> — сервис создан и настроен верно.
 
Теперь проверьте, записывается ли что-то в influxDB. Для этого выполните на сервере команду:
:<syntaxhighlight lang="console">
$ influx -database 'mqtt_data' -execute 'SELECT * FROM /.*/ LIMIT 10'
name: mqtt_data
time                channel                client  value_f
----                -------                ------  -------
1637861917526049562 hwmon/CPU Temperature  AWQBNTYP 67.516
1637861917615599448 hwmon/Board Temperature AWQBNTYP 35.875
1637861927519510484 hwmon/CPU Temperature  AWQBNTYP 66.917
1637861927586856127 hwmon/Board Temperature AWQBNTYP 35.875
1637861937592362349 hwmon/Board Temperature AWQBNTYP 35.875
1637861937592362349 hwmon/CPU Temperature  AWQBNTYP 66.917
1637861947498698295 hwmon/CPU Temperature  AWQBNTYP 67.516
1637861947570297085 hwmon/Board Temperature AWQBNTYP 35.875
1637861957523243600 hwmon/CPU Temperature  AWQBNTYP 66.917
1637861957593339293 hwmon/Board Temperature AWQBNTYP 35.875
</syntaxhighlight>
</syntaxhighlight>
:если в выводе команды есть информация с топиков — можно переходить к настройке Grafana через веб-интерфейс.
=== Настройка в Grafana источника данных ===
Чтобы Grafana могла отобразить данные из базы данных Influx, нужно в её веб-интерфейсе добавить источник данных:
# Откройте веб-интерфейс Grafana.
# Слева на панели нажмите на «шестерёнку» и выберите пункт '''Data Sources'''.
# Откроется страница со списком источников данных, который у нас будет пуст. Нажмите на кнопку '''Add data source'''.
# В открывшемся списке найдите '''InfluxDB''' и нажмите кнопку '''Select'''.
# На странице создания нового источника данных заполните:
#* Наименование, можно оставить по умолчанию.
#* URL — http://localhost:8086
#* Database — mqtt_data
# Чтобы сохранить настройки, нажмите '''Save & Test''', при успешном подключении появится сообщение '''Data source is working'''.
Если после сохранения настроек нет ошибок, то переходите к созданию дашборда.
<gallery widths=305px heights=200px perrow=3>
Image: Grafana - 1. Add Data Source 0.png | Переход к списку источников данных
Image: Grafana - 1. Add Data Source 1.png | Добавление нового источника
Image: Grafana - 1. Add Data Source 2.png | Выбор типа источника
Image: Grafana - 1. Add Data Source 3.png | Настройка источника данных: наименование и URL
Image: Grafana - 1. Add Data Source 4.png | Настройка источника данных: имя базы данных и проверка соединения
</gallery>


Если статус "Active: active (running)" - то дальнейшая настройка -через веб интерфейс.
=== Создание дашборда в Grafana ===
После того как мы создали источник данных — добавьте новый дашборд и создайте запрос на выборку данных:
# Откройте веб-интерфейс Grafana.
# Выберите на панели слева «плюсик» и пункт '''Dashboard'''.
# В открывшейся странице '''New dashboard''', нажмите на плитку '''Add a empty panel'''. Откроется страница создания запроса.
# В поле '''Data source''' выберите созданный ранее источник данных, у нас это '''InfluxDB'''.
# В строке '''FROM''':
#* укажите имя БД mqtt_data;
#* выберите вид запрашиваемых данных, например, '''channel''' — это аналог MQTT-топика;
#* теперь выберите, значение какого топика выводить, например, '''hwmon/Board Temperature'''.
# Если мы хотим вывести числовые значение, то в строке '''SELECT''' выберите '''value_f''', получится ''field(value_f)''. Сразу после этого на панели сверху должен появиться график.
# Задайте панели имя в поле '''Panel options''' → '''Title'''.
# Сохраните дашборд, для этого нажмите кнопку '''Save''', в появившемся окне '''введите имя''' и нажмите кнопку '''Save'''.


==== influxdb ====
Настройка дашборда завершена.
Создаем базу данных с именем '''mqtt_data'''
 
<syntaxhighlight lang="bash">
Запрос из примера в текстовом виде:
echo "CREATE DATABASE mqtt_data; show databases;" | influx
<syntaxhighlight lang="SQL">
SELECT mean("value_f") FROM "mqtt_data" WHERE ("channel" = 'hwmon/Board Temperature') AND $timeFilter GROUP BY time($__interval) fill(null)
</syntaxhighlight>
</syntaxhighlight>
[[Файл:influx_create_db.png|200px|thumb|right|Создание БД]]


==== grafana ====
<gallery widths=305px heights=200px perrow=3 >
Открываем в браузере http://<serverIP>:3000/
Image: Grafana - 2. Add Dashboard 0.png | Добавление нового дашборда
[[Файл:Gragana_login_1.png|200px|thumb|right|страница входа]]
Image: Grafana - 2. Add Dashboard 1.png | Добавление панели в дашборд
Логин и пароль по умолчанию '''admin admin'''.
Image: Grafana - 3. Construct Query 1.png | Выбор базы данных
Сразу меняем пароль.
Image: Grafana - 3. Construct Query 2.png | Выбор вида данных
Image: Grafana - 3. Construct Query 3.png | Выбор канала с данными
Image: Grafana - 3. Construct Query 4.png | Выбор типа значения
Image: Grafana - 4. Save Dashboard 0.png | Сохранение дашборда и панели
Image: Grafana - 4. Save Dashboard 1.png | Ввод наименования дашборда
Image: Grafana - 5. WB Dashboard.png | Созданный дашборд с панелью
</gallery>
 
== Установка Grafana на Amazon WS ==
Видеоурок от нашего партнёра SetPoint.
{{YouTube
| link= kPzo9V_4Wxg
| text= Установка Grafana на Amazon WS
| width=600
| nofloat=true
}}
 
== Установка Grafana в Docker ==
 
Видеоурок от пользователя Paul Strong.
{{YouTube
| link= -Avk3_BRCO0
| text= Визуализация значений из Wiren Board MQTT в Grafana
| width=600
| nofloat=true
}}


=== запуск и контроль ===
== Полезные ссылки ==
* [https://grafana.com/docs/grafana/latest/installation/debian Оригинальная инструкция установки Grafana в Debian]
* [https://docs.influxdata.com/telegraf/v1.19/introduction/installation/ Оригинальная инструкция по установке Telegraf].
* [https://habr.com/ru/post/516772/ Grafana+Zabbix: Визуализация работы производственной линии]

Текущая версия на 17:05, 9 августа 2023

Пример дашборда в Grafana: выходной контроль устройств у нас на производстве

Введение

Grafana — мультиплатформенное веб-приложение с открытым кодом, отображающее данные в виде графиков, диаграмм, индикаторов, а также другими способами. Конечные пользователи могут создавать сложные панели мониторинга с помощью интерактивного конструктора запросов. Умеет отправлять оповещения (alert). Расширяется с помощью системы плагинов.

Grafana подходит для отображения изменяющихся со временем параметров — например, показаний датчиков, подключенных к контроллеру Wiren Board. Так как Grafana сама по себе не является базой данных, для хранения данных используются time series databases, такие как InfluxDB и Prometheus.

Grafana можно установить на собственный сервер, либо использовать облачный сервис Grafana Cloud.

Grafana Cloud

Схема обмена данными при использовании Grafana Cloud

В состав Grafana Cloud уже есть база данных, поэтому отдельно устанавливать и настраивать базу данных не нужно.

Схема работы:

  • На контроллер устанавливается клиент Telegraf
  • Telegraf отправляет данные в базу данных Prometheus.
  • Grafana отображает содержимое базы данных.

Регистрация в Grafana Cloud

  1. Зарегистрируйтесь в Grafana Cloud.
  2. Перейдите в настройки аккаунта по ссылке My Account.
  3. Найдите карточку Prometheus и нажмите кнопку Send Metrics.
  4. На открывшейся странице найдите и сохраните данные из полей:
    • Query Endpoint
    • Remote Write Endpoint
    • Username / Instance ID
    • Password / API Key, для генерации ключа нажмите Generate now.

Установка и настройка Telegraf

Telegraf — это сервис, который устанавливается на контроллер Wiren Board и отправляет данные в базу данных Grafana Cloud. Для выполнения команд, откройте консоль контроллера по SSH.

Установка:

  1. Установите дополнительные пакеты:
    apt update && apt install apt-transport-https
    apt -y install gnupg
    
  2. Добавьте ключ репозитория Telegraf:
    wget -qO- https://repos.influxdata.com/influxdata-archive_compat.key | apt-key add -
    
  3. Добавьте в список apt-репозиториев ссылку на репозиторий telegraf:
    • source /etc/os-release
      
    • Здесь bullseye — версия ОС:
      echo "deb https://repos.influxdata.com/debian bullseye stable" | tee /etc/apt/sources.list.d/influxdb.list
      
  4. Обновите список пакетов и установите Telegraf:
    apt update && apt install telegraf
    
  5. Включите автозапуск сервиса:
    systemctl enable telegraf
    

Настройка:

  1. Откройте файл настроек Telegraf:
    nano /etc/telegraf/telegraf.conf
    
  2. Секция inputs.mqtt_consumer, поля servers, topics, data_format и data_type:
    [[inputs.mqtt_consumer]]
      ## Broker URLs for the MQTT server or cluster.  To connect to multiple
      ## clusters or standalone servers, use a seperate plugin instance.
      ##   example: servers = ["tcp://localhost:1883"]
      ##            servers = ["ssl://localhost:1883"]
      ##            servers = ["ws://localhost:1883"]
      servers = ["tcp://127.0.0.1:1883"]
    
      ## Topics that will be subscribed to.
      topics = [
        "/devices/power_status/controls/Vin",
      ]
    
      ## The message topic will be stored in a tag specified by this value.  If set
      ## to the empty string no topic tag will be created.
      # topic_tag = "topic"
    
      ## QoS policy for messages
      ##   0 = at most once
      ##   1 = at least once
      ##   2 = exactly once
      ##
      ## When using a QoS of 1 or 2, you should enable persistent_session to allow
      ## resuming unacknowledged messages.
      # qos = 0
    
      ## Connection timeout for initial connection in seconds
      # connection_timeout = "30s"
    
      ## Maximum messages to read from the broker that have not been written by an
      ## output.  For best throughput set based on the number of metrics within
      ## each message and the size of the output's metric_batch_size.
      ##
      ## For example, if each message from the queue contains 10 metrics and the
      ## output metric_batch_size is 1000, setting this to 100 will ensure that a
      ## full batch is collected and the write is triggered immediately without
      ## waiting until the next flush_interval.
      # max_undelivered_messages = 1000
    
      ## Persistent session disables clearing of the client session on connection.
      ## In order for this option to work you must also set client_id to identify
      ## the client.  To receive messages that arrived while the client is offline,
      ## also set the qos option to 1 or 2 and don't forget to also set the QoS when
      ## publishing.
      # persistent_session = false
    
      ## If unset, a random client ID will be generated.
      # client_id = ""
    
      ## Username and password to connect MQTT server.
      # username = "telegraf"
      # password = "metricsmetricsmetricsmetrics"
    
      ## Optional TLS Config
      # tls_ca = "/etc/telegraf/ca.pem"
      # tls_cert = "/etc/telegraf/cert.pem"
      # tls_key = "/etc/telegraf/key.pem"
      ## Use TLS but skip chain & host verification
      # insecure_skip_verify = false
    
      ## Data format to consume.
      ## Each data format has its own unique set of configuration options, read
      ## more about them here:
      ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
        data_format = "value"
        data_type = "float"
    
  3. Секция outputs.http, поля url, username, password, data_format и [outputs.http.headers]. Ссылку и логин с паролем мы сохраняли в разделе про регистрацию.
    [[outputs.http]]
      ## URL is the address to send metrics to
      url = "https://prometheus-us-central1.grafana.net/api/prom/push"
    
      ## HTTP Basic Auth credentials
      username = "xxx" # Replace
      password = "yyy" # Replace
    
      ## Data format to output.
      data_format = "prometheusremotewrite"
    
      ## Additional HTTP headers
      [outputs.http.headers]
         Content-Type = "application/x-protobuf"
         Content-Encoding = "snappy"
         X-Prometheus-Remote-Write-Version = "0.1.0"
    
  4. Закомментируйте секцию outputs.influxdb:
    # Configuration for sending metrics to InfluxDB
    # [[outputs.influxdb]]
      ## The full HTTP or UDP URL for your InfluxDB instance.
      ##
      ## Multiple URLs can be specified for a single cluster, only ONE of the
      ## urls will be written to each interval.
      # urls = ["unix:///var/run/influxdb.sock"]
      # urls = ["udp://127.0.0.1:8089"]
      # urls = ["http://127.0.0.1:8086"]
    
      ## The target database for metrics; will be created as needed.
      ## For UDP url endpoint database needs to be configured on server side.
      # database = "telegraf"
    
      ## The value of this tag will be used to determine the database.  If this
      ## tag is not set the 'database' option is used as the default.
      # database_tag = ""
    
      ## If true, the 'database_tag' will not be included in the written metric.
      # exclude_database_tag = false
    
      ## If true, no CREATE DATABASE queries will be sent.  Set to true when using
      ## Telegraf with a user without permissions to create databases or when the
      ## database already exists.
      # skip_database_creation = false
    
      ## Name of existing retention policy to write to.  Empty string writes to
      ## the default retention policy.  Only takes effect when using HTTP.
      # retention_policy = ""
    
      ## The value of this tag will be used to determine the retention policy.  If this
      ## tag is not set the 'retention_policy' option is used as the default.
      # retention_policy_tag = ""
    
      ## If true, the 'retention_policy_tag' will not be included in the written metric.
      # exclude_retention_policy_tag = false
    
      ## Write consistency (clusters only), can be: "any", "one", "quorum", "all".
      ## Only takes effect when using HTTP.
      # write_consistency = "any"
    
      ## Timeout for HTTP messages.
      # timeout = "5s"
    
      ## HTTP Basic Auth
      # username = "telegraf"
      # password = "metricsmetricsmetricsmetrics"
    
      ## HTTP User-Agent
      # user_agent = "telegraf"
    
      ## UDP payload size is the maximum packet size to send.
      # udp_payload = "512B"
    
      ## Optional TLS Config for use on HTTP connections.
      # tls_ca = "/etc/telegraf/ca.pem"
      # tls_cert = "/etc/telegraf/cert.pem"
      # tls_key = "/etc/telegraf/key.pem"
      ## Use TLS but skip chain & host verification
      # insecure_skip_verify = false
    
      ## HTTP Proxy override, if unset values the standard proxy environment
      ## variables are consulted to determine which proxy, if any, should be used.
      # http_proxy = "http://corporate.proxy:3128"
    
      ## Additional HTTP headers
      # http_headers = {"X-Special-Header" = "Special-Value"}
    
      ## HTTP Content-Encoding for write request body, can be set to "gzip" to
      ## compress body or "identity" to apply no encoding.
      # content_encoding = "gzip"
    
      ## When true, Telegraf will output unsigned integers as unsigned values,
      ## i.e.: "42u".  You will need a version of InfluxDB supporting unsigned
      ## integer values.  Enabling this option will result in field type errors if
      ## existing data has been written.
      # influx_uint_support = false
    
  5. Сохраните файл и закройте редактор.

Проверка работы:

  1. Остановите сервис:
    systemctl stop telegraf
    
  2. Запустите сервис в режиме отладки и убедитесь, что данные отправляются:
    # telegraf -debug
    2021-11-29T16:47:13Z I! Starting Telegraf 1.20.4
    2021-11-29T16:47:13Z I! Using config file: /etc/telegraf/telegraf.conf
    2021-11-29T16:47:13Z I! Loaded inputs: cpu disk diskio kernel mem mqtt_consumer processes swap system
    2021-11-29T16:47:13Z I! Loaded aggregators: 
    2021-11-29T16:47:13Z I! Loaded processors: 
    2021-11-29T16:47:13Z I! Loaded outputs: http
    2021-11-29T16:47:13Z I! Tags enabled: host=wirenboard-AWQBNTYP
    2021-11-29T16:47:13Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"wirenboard-AWQBNTYP", Flush Interval:10s
    2021-11-29T16:47:13Z D! [agent] Initializing plugins
    2021-11-29T16:47:13Z D! [agent] Connecting outputs
    2021-11-29T16:47:13Z D! [agent] Attempting connection to [outputs.http]
    2021-11-29T16:47:13Z D! [agent] Successfully connected to outputs.http
    2021-11-29T16:47:13Z D! [agent] Starting service inputs
    2021-11-29T16:47:13Z I! [inputs.mqtt_consumer] Connected [tcp://127.0.0.1:1883]
    2021-11-29T16:47:24Z D! [outputs.http] Wrote batch of 31 metrics in 696.002545ms
    2021-11-29T16:47:24Z D! [outputs.http] Buffer fullness: 1 / 10000 metrics
    2021-11-29T16:47:33Z D! [outputs.http] Wrote batch of 34 metrics in 129.098071ms
    2021-11-29T16:47:33Z D! [outputs.http] Buffer fullness: 0 / 10000 metrics
    
  3. Если ошибок нет, то остановите команду клавишами Ctrl+C.
  4. Запустите сервис в автоматическом режиме:
    systemctl start telegraf
    

Настройка в Grafana источника данных

Чтобы Grafana могла отобразить данные из базы данных Prometheus, нужно в её веб-интерфейсе добавить источник данных:

  1. Откройте веб-интерфейс Grafana.
  2. Перейдите в настройки аккаунта по ссылке My Account.
  3. Найдите карточку Grafana и нажмите кнопку Log In.
  4. Слева на панели нажмите на «шестерёнку» и выберите пункт Data Sources.
  5. Откроется страница со списком источников данных, нажмите на кнопку Add data source.
  6. В открывшемся списке найдите Prometheus и нажмите кнопку Select.
  7. На странице создания нового источника данных заполните:
    • Наименование, можно оставить по умолчанию.
    • URL — ссылка, сохранённая на этапе регистрации из поля Query Endpoint (без push на конце)
    • Auth — включите флажок Basic auth
    • Basic Auth Details — заполните поля User и Password.
  8. Чтобы сохранить настройки, нажмите Save & Test, при успешном подключении появится сообщение Data source is working.

Если после сохранения настроек нет ошибок, то переходите к созданию дашборда.

Создание дашборда в Grafana

После того как мы создали источник данных — добавьте новый дашборд и создайте запрос на выборку данных:

  1. Откройте веб-интерфейс Grafana.
  2. Перейдите в настройки аккаунта по ссылке My Account.
  3. Найдите карточку Grafana и нажмите кнопку Log In.
  4. Выберите на панели слева «плюсик» и пункт Dashboard.
  5. В открывшейся странице New dashboard, нажмите на плитку Add a empty panel. Откроется страница создания запроса.
  6. В поле Data source выберите созданный ранее источник данных.
  7. В строке A → Metrics browser:
    • в группе 2. Select labels to search in выберите topic;
    • в группе 3. Select values for your labels выберите топик, который мы отправили с контроллера;
    • Нажмите кнопку Use query. Сразу после этого на панели сверху должен появиться график.
  8. Задайте панели имя в поле Panel optionsTitle.
  9. Сохраните дашборд, для этого нажмите кнопку Save, в появившемся окне введите имя и нажмите кнопку Save.

Настройка дашборда завершена.

Запрос из примера в текстовом виде:

{topic="/devices/power_status/controls/Vin"}

Свой сервер Grafana

Схема обмена данными при использовании своего сервера Grafana

Для установки Grafana нам потребуется выделенный сервер с IP-адресом, доступным с контроллера Wiren Board.

Схема работы:

  • Один или несколько контроллеров передают значения MQTT топиков в MQTT-брокер, установленный на сервере Grafana.
  • На сервере Grafana выполняется скрипт, который записывает MQTT-топики брокера в базу данных Influx.
  • Grafana отображает содержимое базы данных Influx.

Grafana и MQTT-брокер можно установить на один сервер, или разнести на разные. Если вы используете два разных сервера, то IP-адрес MQTT-брокера должен быть доступен с контроллера Wiren Board и с сервера, на котором установлена Grafana.

Установка Grafana

Страница входа в веб-интерфейс Grafana

В примере мы установим Grafana на сервер с Debian Linux 11.

Подготовьте сервер к установке:

  1. Установите пакеты:
    sudo apt install -y apt-transport-https software-properties-common wget gnupg2 sudo python3-pip
    
  2. Добавьте ключ репозитория packages.grafana.com:
    wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
    
  3. Добавьте ссылку на репозиторий packages.grafana.com:
    echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
    
  4. Обновите список пакетов:
    sudo apt update
    

Если во время установки Grafana по инструкции выше возникнет ошибка gpg: no valid OpenPGP data foundустановите Grafana в docker. Причина описана тут: Can’t download grafana 9.0.2 from russia. Остальные пакеты ставятся как обычно — просто следуйте инструкции.

Установите необходимое ПО:

  1. grafana, python3 и БД influxdb:
    sudo apt install -y grafana influxdb influxdb-client python3-pip
    
  2. и дополнительные модули python:
    sudo pip3 install paho-mqtt python-etcd influxdb
    

Разрешите автозапуск сервиса и запустите его:

sudo systemctl enable grafana-server && sudo systemctl start grafana-server

Проверьте статус сервиса:

$ systemctl status grafana-server
● grafana-server.service - Grafana instance
     Loaded: loaded (/lib/systemd/system/grafana-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2021-11-25 13:56:19 +04; 2min 33s ago
       Docs: http://docs.grafana.org
   Main PID: 3237 (grafana-server)
      Tasks: 9 (limit: 4663)
     Memory: 35.2M
        CPU: 1.371s

Если статус Active: active (running) — переходите к следующим шагам.

Создайте базу данных Influxdb с именем mqtt_data:

$ echo "CREATE DATABASE mqtt_data; show databases;" | influx

name: databases
name
----
_internal
mqtt_data

Перейдите в веб-интерфейс Grafana:

  1. Откройте браузер и введите в адресную строку http://192.168.2.36:3000, где 192.168.2.36 — IP-адрес вашего сервера с Grafana.
  2. Введите логин/пароль admin/admin. После первого входа задайте новый пароль.

Если вы забыли введённый пароль, то его можно сбросить:

  1. Подключитесь к контроллеру по SSH.
  2. Введите команду:
    grafana-cli --homepath "/usr/share/grafana/" admin reset-admin-password admin
    
  3. Перезапустите сервис:
    systemctl restart grafana-server
    
  4. После этого зайдите в веб-интерфейс Grafana и создайте новый пароль.

Установка MQTT-брокера

Теперь настроим MQTT-брокер, куда контроллер Wiren Board будет отправлять данные.

Установите на сервер с Grafana mosquitto по инструкции Установка брокера.

Настройка моста на контроллере

Файл конфигурации MQTT-моста

Настройте на контроллере Wiren Board подключение к внешнему MQTT-брокеру:

  1. Подключитесь к контроллеру по SSH.
  2. Создайте файл конфигурации bridge1.conf:
    nano /etc/mosquitto/conf.d/bridge1.conf
    
  3. Вставьте в него строки, в которых замените в двух местах AWQBNTYP на серийный номер контроллера, а 192.168.2.36 на IP-адрес брокера:
    connection bridge1
    #address of server
    address 192.168.2.36
    notifications true
    notification_topic /client/AWQBNTYP/bridge1_status
    remote_username test
    remote_password wbpassword
    topic /hwmon/# both 2 /devices /client/AWQBNTYP/devices
    
    в конфигурации выше мы отправляем в MQTT-брокер все подтопики устройства hwmon, чтобы передать все топики контроллера, замените путь /hwmon/# на /#
  4. Сохраните изменения и закройте файл.
  5. Перезапустите mosquitto:
    systemctl restart mosquitto
    

Теперь проверим, что контроллер отправляет данные во внешний MQTT-брокер:

  1. Выполните в консоли контроллера команду, в которой замените 192.168.2.36 на IP-адрес брокера, AWQBNTYP на серийный номер контроллера, а test и wbpassword на логин и пароль от MQTT-брокера:
    # mosquitto_sub -v -h 192.168.2.36 -u test -P wbpassword -t /client/AWQBNTYP/devices/#
    /client/AWQBNTYP/devices/hwmon/meta/driver wb-rules
    /client/AWQBNTYP/devices/hwmon/meta/name HW Monitor
    /client/AWQBNTYP/devices/hwmon/controls/Board Temperature 35.875
    /client/AWQBNTYP/devices/hwmon/controls/Board Temperature/meta/type temperature
    /client/AWQBNTYP/devices/hwmon/controls/Board Temperature/meta/order 1
    /client/AWQBNTYP/devices/hwmon/controls/Board Temperature/meta/readonly 1
    /client/AWQBNTYP/devices/hwmon/controls/CPU Temperature 66.917
    /client/AWQBNTYP/devices/hwmon/controls/CPU Temperature/meta/type temperature
    /client/AWQBNTYP/devices/hwmon/controls/CPU Temperature/meta/order 2
    /client/AWQBNTYP/devices/hwmon/controls/CPU Temperature/meta/readonly 1
    /client/AWQBNTYP/devices/hwmon/controls/CPU Temperature 66.917
    /client/AWQBNTYP/devices/hwmon/controls/Board Temperature 35.875
    
    Если после выполнения команды вы получите список топиков — контролер успешно отправляет данные во внешний брокер.
  2. Завершите команду клавишами Ctrl+C.

Скрипт на сервере Grafana

Создание сервиса для запуска скрипта

Теперь скачаем на сервер с Grafana скрипт, который будет отправлять данные из MQTT-брокера в базу данных Influx:

  1. Перейдите на сервере в папку /usr/local/bin
    cd /usr/local/bin
    
  2. Скачайте в эту папку скрипт:
    sudo wget https://raw.githubusercontent.com/wirenboard/wbmqtt2influx/master/mqtt_to_influxdb.py
    
  3. Разрешите выполнение скрипта командой:
    sudo chmod +x mqtt_to_influxdb.py
    
  4. Создайте сервис, который будет автоматически запускать скрипт:
    sudo systemctl edit --force --full mqtt_to_influxdb.service
    
  5. В открывшийся редактор вставьте строки, в которых замените test и wbpassword на логин и пароль от MQTT-брокера.:
    [Unit]
    Description=Mqtt to Influxdb script
    After=multi-user.target
    Requires=influxd.service
    
    [Service]
    Type=idle
    User=mosquitto
    ExecStart=/usr/bin/python3 /usr/local/bin/mqtt_to_influxdb.py -h localhost "/#" -u "test" -P "wbpassword"
    Restart=always
    TimeoutStartSec=10
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    
    Если MQTT-брокер стоит на отдельном от Grafana сервере, укажите его IP-адрес вместо localhost.
  6. Сохраните файл, для этого нажмите клавиши Ctrl+O, затем Enter и Ctrl+X.
  7. Настройте автозапуск и запустите сервис:
    sudo systemctl enable mqtt_to_influxdb.service && sudo systemctl start mqtt_to_influxdb.service
    
  8. Проверьте статус сервиса:
    $ systemctl status mqtt_to_influxdb.service
    ● mqtt_to_influxdb.service - Mqtt to Influxdb script
         Loaded: loaded (/etc/systemd/system/mqtt_to_influxdb.service; enabled; vendor preset: enabled)
         Active: active (running) since Thu 2021-11-25 21:38:32 +04; 4s ago
       Main PID: 5440 (python3)
          Tasks: 2 (limit: 4663)
         Memory: 17.1M
            CPU: 206ms
         CGroup: /system.slice/mqtt_to_influxdb.service
                 └─5440 /usr/bin/python3 /usr/local/bin/mqtt_to_influxdb.py -h localhost /# -u test -P wbpassword
    
    Если в выводе команды есть строчка Active: active (running) — сервис создан и настроен верно.

Теперь проверьте, записывается ли что-то в influxDB. Для этого выполните на сервере команду:

$ influx -database 'mqtt_data' -execute 'SELECT * FROM /.*/ LIMIT 10'
name: mqtt_data
time                channel                 client   value_f
----                -------                 ------   -------
1637861917526049562 hwmon/CPU Temperature   AWQBNTYP 67.516
1637861917615599448 hwmon/Board Temperature AWQBNTYP 35.875
1637861927519510484 hwmon/CPU Temperature   AWQBNTYP 66.917
1637861927586856127 hwmon/Board Temperature AWQBNTYP 35.875
1637861937592362349 hwmon/Board Temperature AWQBNTYP 35.875
1637861937592362349 hwmon/CPU Temperature   AWQBNTYP 66.917
1637861947498698295 hwmon/CPU Temperature   AWQBNTYP 67.516
1637861947570297085 hwmon/Board Temperature AWQBNTYP 35.875
1637861957523243600 hwmon/CPU Temperature   AWQBNTYP 66.917
1637861957593339293 hwmon/Board Temperature AWQBNTYP 35.875
если в выводе команды есть информация с топиков — можно переходить к настройке Grafana через веб-интерфейс.

Настройка в Grafana источника данных

Чтобы Grafana могла отобразить данные из базы данных Influx, нужно в её веб-интерфейсе добавить источник данных:

  1. Откройте веб-интерфейс Grafana.
  2. Слева на панели нажмите на «шестерёнку» и выберите пункт Data Sources.
  3. Откроется страница со списком источников данных, который у нас будет пуст. Нажмите на кнопку Add data source.
  4. В открывшемся списке найдите InfluxDB и нажмите кнопку Select.
  5. На странице создания нового источника данных заполните:
    • Наименование, можно оставить по умолчанию.
    • URL — http://localhost:8086
    • Database — mqtt_data
  6. Чтобы сохранить настройки, нажмите Save & Test, при успешном подключении появится сообщение Data source is working.

Если после сохранения настроек нет ошибок, то переходите к созданию дашборда.

Создание дашборда в Grafana

После того как мы создали источник данных — добавьте новый дашборд и создайте запрос на выборку данных:

  1. Откройте веб-интерфейс Grafana.
  2. Выберите на панели слева «плюсик» и пункт Dashboard.
  3. В открывшейся странице New dashboard, нажмите на плитку Add a empty panel. Откроется страница создания запроса.
  4. В поле Data source выберите созданный ранее источник данных, у нас это InfluxDB.
  5. В строке FROM:
    • укажите имя БД mqtt_data;
    • выберите вид запрашиваемых данных, например, channel — это аналог MQTT-топика;
    • теперь выберите, значение какого топика выводить, например, hwmon/Board Temperature.
  6. Если мы хотим вывести числовые значение, то в строке SELECT выберите value_f, получится field(value_f). Сразу после этого на панели сверху должен появиться график.
  7. Задайте панели имя в поле Panel optionsTitle.
  8. Сохраните дашборд, для этого нажмите кнопку Save, в появившемся окне введите имя и нажмите кнопку Save.

Настройка дашборда завершена.

Запрос из примера в текстовом виде:

SELECT mean("value_f") FROM "mqtt_data" WHERE ("channel" = 'hwmon/Board Temperature') AND $timeFilter GROUP BY time($__interval) fill(null)

Установка Grafana на Amazon WS

Видеоурок от нашего партнёра SetPoint.

Установка Grafana на Amazon WS

Установка Grafana в Docker

Видеоурок от пользователя Paul Strong.

Визуализация значений из Wiren Board MQTT в Grafana

Полезные ссылки