Dashboard на основе Grafana и InfluxDB

В продолжение темы умного дома где мой котёл умел выдавать API для мониторинга температур, захотелось мне вывести эти данные в более приятный вид. Кроме того, хотя сам котёл умеет рисовать графики, он показывал на них только температурную зону одного контура, а мне хотелось видеть два.

Поэтому я решил поизучать бесплатный dashboard и графико-генератор на основе Grafana. Зарегился и упёрся в то что он сам не хранит данные. Он умеет только подключаться к внешним источникам и делать запросы туда.

Новый MySQL мне не хотелось поднимать, а открывать существующий тем более. Cloudwatch от Амазона — видимо полезен для мониторинга сервисов если вы активно пользуетесь этой инфраструктурой. Prometheus я могу и на работе посмотреть. Выбрал InfluxDB — специальную БД для хранения временных событий.

Ставить Influx было достаточно просто. Сложней было связать графану с influx.

Сервис гоняется на 8086 порту и Grafana хочет SSL и CORS. Поэтому пришлось делать proxy на nginx и добавлять header:

location /influx/ {
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    add_header 'Access-Control-Allow-Credentials' 'true';
    proxy_pass http://localhost:8086/;
}

Теперь встаёт вопрос как данные добавить в influx. Писать будет процесс на node, поэтому я по-быстрому нашёл библиотечку и пример подключения:

const Influx = require('influx');
const influx = new Influx.InfluxDB({
    host: 'localhost',
    database: 'home',
    schema: [
        {
            measurement: 'response_times',
            fields: {
                boiler_smoketemp: Influx.FieldType.FLOAT,
                boiler_output: Influx.FieldType.FLOAT,
                boiler_power: Influx.FieldType.FLOAT,
                boiler_light: Influx.FieldType.FLOAT,
                boiler_oxygen: Influx.FieldType.FLOAT,
                boiler_oxygenlow: Influx.FieldType.FLOAT,
                boiler_oxygenmid: Influx.FieldType.FLOAT,
                boiler_oxygenhigh: Influx.FieldType.FLOAT,
                boiler_connectionindex: Influx.FieldType.FLOAT,
                boiler_return: Influx.FieldType.FLOAT,
                zone_1: Influx.FieldType.FLOAT,
                zone_2: Influx.FieldType.FLOAT
            },
            tags: [
                'host'
            ]
        }
    ]
});
//заполняем data..
influx.writePoints([
    {
        measurement: 'heating',
        fields: data
    }
]).catch(err => {
    console.error(`Error saving data to InfluxDB! ${err.stack}`)
});

Теперь что-бы проверить записались ли данные, можно использовать хронограф — скачиваемый UI-сервис который в более ранних версиях был встроен в influx в виде админ-панели.

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