Мониторинг температуры: Как подружить копеечный веб-термометр с Prometheus и Grafana

автор: rss9020 2 мин. чтения

Задача: есть копеечное устройство (или DIY-плата на ESP8266/ESP32), которое отдает температуру по HTTP в виде простейшего текста. Нужно закинуть эти данные в красивый дашборд Grafana.

Обычно для этого поднимают дополнительные сервисы вроде Pushgateway или настраивают скрипты отправки в InfluxDB. Но если у вас на сервере уже крутится связка Prometheus + Node Exporter, есть гораздо более элегантный путь — встроенный механизм Textfile Collector.

В этой статье мы разберем, как с помощью одной строки awk и стандартного агента мониторинга вывести показания датчика на графики.


Архитектура решения

Схема работы выглядит максимально просто и надежно:

  1. Bash-скрипт раз в минуту делает curl к веб-термометру.
  2. С помощью утилиты awk мы вырезаем из ответа только чистое число температуры.
  3. Скрипт записывает это число в файл формата Prometheus в специальную папку.
  4. Node Exporter (агент мониторинга сервера) считывает этот файл при каждом обращении Prometheus.
  5. Grafana рисует красивый график.

Шаг 1. Парсим температуру из HTTP-запроса

curl -s http://192.168.0.53/control/sensors.tpl | grep temperature

Наш термометр по адресу http://192.168.0.53/control/sensors.tpl выдает текстовую строку вида:

text

DS18B20 Sensor 1 (00 00 00 00 00 00 00 00) temperature 22.43 C<br>

Чтобы оставить только число 22.43, используем встроенную переменную NF в awk, которая означает общее количество полей в строке. Само число является предпоследним полем (NF-1), так как последнее — это C<br>.

Финальный конвейер выглядит так (-s глушит лишний вывод прогресс-бара curl):

bash

curl -s http://192.168.0/control/sensors.tpl | awk '/temperature/ {print $(NF-1)}'
# На выходе получаем чистые: 22.43


Шаг 2. Настраиваем Node Exporter

У меня Node Exporter собирает только системные метрики (процессор, память, диски). Включим сборщик кастомных текстовых файлов (Textfile Collector).

Создаем директорию, где будут лежать наши файлы с метриками:bash

mkdir -p /var/lib/node_exporter/textfile_collector

Открываем конфигурацию сервиса Node Exporter:

systemctl edit --full node_exporter

Или напрямую правим

/etc/systemd/system/node_exporter.service)
/etc/systemd/system/node_exporter.service.d/override.conf

Находим строку ExecStart= и добавляем в самый конец аргументов флаг пути к нашей папке:

ExecStart=/usr/local/bin/node_exporter --collector.textfile.directory=/var/lib/node_exporter/textfile_collector

Перезапускаем демон и сам сервис:

systemctl daemon-reload && systemctl restart node_exporter

Шаг 3. Пишем Bash-скрипт автоматизации

Создадим скрипт /root/temperature/get_temp.sh.

bash

#!/bin/bash

# Настройки путей
DIR="/var/lib/node_exporter/textfile_collector"
TMP_FILE="$DIR/temperature.prom.tmp"
FINAL_FILE="$DIR/temperature.prom"

# Забираем данные с датчика
temp=$(curl -s http://192.168.0/control/sensors.tpl | awk '/temperature/ {print $(NF-1)}')

# Защита от сбоя сети: пишем в файл, только если переменная не пустая
if [ ! -z "$temp" ]; then
    # Записываем метрику с метаданными (HELP и TYPE)
    echo "# HELP outside_temperature Temperature from DS18B20" > "$TMP_FILE"
    echo "# TYPE outside_temperature gauge" >> "$TMP_FILE"
    echo "outside_temperature $temp" >> "$TMP_FILE"
     echo "" >> "$TMP_FILE" # Обязательный перенос строки для Prometheus  
    # Атомарно заменяем старый файл новым, чтобы Node Exporter не прочитал полупустой файл
    mv "$TMP_FILE" "$FINAL_FILE"
fi


Делаем скрипт исполняемым:

bash

chmod +x /root/temperature/get_temp.sh


Шаг 4. Добавляем сбор в планировщик (Cron)

Чтобы данные обновлялись непрерывно, заставим скрипт выполняться каждую минуту. Открываем планировщик задач:

bash

crontab -e

Используйте код с осторожностью.

И добавляем в самый конец строку:

text

* * * * * /root/temperature/get_temp.sh >/dev/null 2>&1

Используйте код с осторожностью.


Шаг 5. Отрисовка графиков в Grafana

Уже спустя минуту Prometheus через Node Exporter заберет вашу новую метрику.

  1. Перейдите в Grafana в раздел Explore.
  2. Выберите ваш Data Source (Prometheus).
  3. Введите в поле запроса имя нашей метрики: outside_temperature и нажмите Run query.
  4. При создании постоянного виджета на дашборде в панели справа в поле Unit не забудьте выбрать Celsius (°C), чтобы шкала графика автоматически разметилась в градусах.

Заключение

Метод с использованием textfile_collector хорош тем, что он не создает лишних сущностей в вашей системе. Вам не нужно писать полноценный exporter на Go или Python, вешать его на отдельный сетевой порт и следить за его доступностью. Простой скрипт и текстовый файл решают задачу мониторинга любых кастомных устройств буквально за 10 минут.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *