Использование Grafana с контроллером Wiren Board

From Wiren Board
This is the approved revision of this page, as well as being the most recent.
Пример дашборда в 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. Подключитесь к серверу Grafana по 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 0 /devices /client/AWQBNTYP/devices
    
    в конфигурации выше мы отправляем в MQTT-брокер все подтопики устройства hwmon, чтобы передать все топики контроллера, замените путь /hwmon/# на /#
  4. Сохраните изменения и закройте файл.
  5. Перезапустите mosquitto:
    systemctl restart mosquitto
    

Обратите внимание на корректный выбор QOS для моста. Использованный в примере уровень - не подразумевает ограничение длины очереди и способен при потере связи с мостом переполнить выделенную брокеру память - и вызвать его остановку.

Теперь проверим, что контроллер отправляет данные во внешний 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 + InfluxDB в Docker

Вместо ручной установки пакетов можно развернуть Grafana и InfluxDB в контейнерах Docker. Это позволяет получить преднастроенную систему одной командой, используя технологию Provisioning (автоматическая конфигурация).

Ниже описан способ создания стека, где:

  • docker-compose.yml — описывает всю инфраструктуру (InfluxDB 2.7 + Grafana 10).
  • provisioning — автоматически создает и настраивает подключение к источнику данных.

Подготовка структуры каталогов

Создайте отдельный каталог для проекта и перейдите в него:

mkdir grafana-stack
cd grafana-stack

Создайте структуру каталогов для конфигурационных файлов:

mkdir -p provisioning/datasources

Итоговая структура файлов должна получиться следующей:

grafana-stack/
├── docker-compose.yml
└── provisioning/
    └── datasources/
        └── datasource.yml

Файл docker-compose.yml

Этот файл описывает запуск двух контейнеров: базы данных InfluxDB и интерфейса Grafana. Мы используем переменные окружения для автоматической инициализации базы данных (создание пользователя, организации и бакета), чтобы не делать это вручную через браузер.

Создайте файл docker-compose.yml:

nano docker-compose.yml

Вставьте следующее содержимое:

version: "3.8"

services:
  influxdb:
    image: influxdb:2.7
    container_name: influxdb
    ports:
      - "8086:8086"
    volumes:
      - influxdb_data:/var/lib/influxdb2
    environment:
      # Включаем автоматическую инициализацию InfluxDB
      DOCKER_INFLUXDB_INIT_MODE: setup

      # Учётная запись администратора БД
      DOCKER_INFLUXDB_INIT_USERNAME: admin
      DOCKER_INFLUXDB_INIT_PASSWORD: adminpassword

      # Организация (логическая группа)
      DOCKER_INFLUXDB_INIT_ORG: demo-org

      # Бакет (аналог базы данных, куда будут писаться метрики)
      DOCKER_INFLUXDB_INIT_BUCKET: metrics

      # Хранение данных без ограничения по времени
      DOCKER_INFLUXDB_INIT_RETENTION: 0

      # Токен доступа (нужен для подключения Grafana и агентов записи)
      DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: supersecrettoken

  grafana:
    image: grafana/grafana:10.2.3
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      # Данные Grafana (дашборды, пользователи)
      - grafana_data:/var/lib/grafana

      # Provisioning (автоподключение источников при старте)
      - ./provisioning:/etc/grafana/provisioning
    depends_on:
      - influxdb
    environment:
      # Учётная запись администратора Grafana
      GF_SECURITY_ADMIN_USER: admin
      GF_SECURITY_ADMIN_PASSWORD: admin

      # Запрещаем свободную регистрацию пользователей
      GF_USERS_ALLOW_SIGN_UP: "false"

volumes:
  influxdb_data:
  grafana_data:

Ключевые моменты конфигурации:

  • depends_on: influxdb — гарантирует, что Grafana запустится после контейнера базы данных.
  • ./provisioning:/etc/grafana/provisioning — пробрасывает локальные конфиги внутрь контейнера, позволяя Grafana автоматически подхватить настройки источника данных.

Настройка Provisioning (Источник данных)

Provisioning позволяет избежать ручной настройки источников данных ("ClickOps"). Grafana считает конфигурацию из файла при старте, создаст источник InfluxDB и сделает его доступным по умолчанию.

Создайте файл конфигурации источника:

nano provisioning/datasources/datasource.yml

Вставьте настройки для подключения к InfluxDB (язык запросов Flux):

apiVersion: 1

datasources:
  - name: InfluxDB
    type: influxdb
    access: proxy
    isDefault: true

    # Имя хоста совпадает с именем сервиса в docker-compose
    url: http://influxdb:8086

    jsonData:
      version: Flux
      organization: demo-org
      defaultBucket: metrics

    secureJsonData:
      token: supersecrettoken


Запуск и проверка

Находясь в каталоге grafana-stack, запустите сервисы в фоновом режиме:

docker compose up -d

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

docker ps

Ожидаемый результат: контейнер influxdb имеет статус healthy, контейнер grafana — статус Up.

Вход в систему

  1. Откройте браузер и перейдите по адресу: http://<IP-адрес-сервера>:3000 (или http://127.0.0.1:3000, если запускаете локально).
  2. Используйте логин/пароль, заданные в docker-compose:
    • Login: admin
    • Password: admin
  3. Перейдите в раздел Connections → Data sources. Вы должны увидеть источник InfluxDB, созданный автоматически. При нажатии на него и вызове "Save & Test" проверка должна проходить успешно.



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

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

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