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

Обычно для этого поднимают дополнительные сервисы вроде Pushgateway или настраивают скрипты отправки в InfluxDB. Но если у вас на сервере уже крутится связка Prometheus + Node Exporter, есть гораздо более элегантный путь — встроенный механизм Textfile Collector.
В этой статье мы разберем, как с помощью одной строки awk и стандартного агента мониторинга вывести показания датчика на графики.
Архитектура решения
Схема работы выглядит максимально просто и надежно:
- Bash-скрипт раз в минуту делает
curlк веб-термометру. - С помощью утилиты
awkмы вырезаем из ответа только чистое число температуры. - Скрипт записывает это число в файл формата Prometheus в специальную папку.
- Node Exporter (агент мониторинга сервера) считывает этот файл при каждом обращении Prometheus.
- 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 заберет вашу новую метрику.
- Перейдите в Grafana в раздел Explore.
- Выберите ваш Data Source (Prometheus).
- Введите в поле запроса имя нашей метрики:
outside_temperatureи нажмите Run query. - При создании постоянного виджета на дашборде в панели справа в поле Unit не забудьте выбрать
Celsius (°C), чтобы шкала графика автоматически разметилась в градусах.

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