Общее описание шлюза к InfluxDB
Класс реализует пересылку указанных (настроенных) датчиков в InfluxDB с использованием Line Protocol через TCP-соединение.
Формат записи (InfluxDB Line Protocol):
<measurement>,project=<project>,sensor=<name>[,tags...] value=<value> <timestamp_ms>
Пример записи:
sensors,project=theatre,sensor=FC8_Fault_S value=0 1762405075021
sensors,project=theatre,sensor=Box1_Temperature_AS value=235 1762405075022
Такой формат оптимален для InfluxDB:
- Один measurement для всех датчиков (эффективные запросы)
- Теги индексируются (быстрый поиск по project, sensor)
- Timestamp в миллисекундах
Настройка BackendOpenTSDB
Пример секции конфигурации:
<BackendOpenTSDB name="BackendOpenTSDB1" host="localhost" port="8089"
filter_field="tsdb" filter_value="1"
measurement="sensors"
project="theatre"
tags="host=server1,env=prod"/>
Где:
- host - host для связи с InfluxDB
- port - port для связи с InfluxDB (TCP line protocol). Default: 4242
- filter_field - поле у датчика, определяющее, что его нужно сохранять в БД
- filter_value - значение filter_field, определяющее, что датчик нужно сохранять в БД
- measurement - имя measurement в InfluxDB. Default: "sensors"
- project - значение тега project (например имя подсистемы/проекта)
- tags - дополнительные теги для каждой записи, через запятую (tag1=val1,tag2=val2)
Конфигурация датчиков в секции <sensors>:
<sensors>
...
<item id="54" iotype="AI" name="Box1_Temperature_AS" textname="Temperature sensor" tsdb="1"/>
<item id="55" iotype="DI" name="FC8_Fault_S" textname="Drive fault" tsdb="1" tsdb_tags="unit=drive"/>
<item id="56" iotype="AI" name="Pressure_AS" tsdb="1" tsdb_name="MainPressure"/>
...
</sensors>
Где:
- tsdb - поле фильтра для включения датчика в запись
- tsdb_tags - дополнительные теги для конкретного датчика (через запятую)
- tsdb_name - переопределение имени датчика в теге sensor
Результат записи для примера выше:
sensors,project=theatre,sensor=Box1_Temperature_AS,host=server1,env=prod value=235 1762405075021
sensors,project=theatre,sensor=FC8_Fault_S,host=server1,env=prod,unit=drive value=0 1762405075022
sensors,project=theatre,sensor=MainPressure,host=server1,env=prod value=101 1762405075023
Имя датчика в теге sensor
По умолчанию в качестве имени берётся name, но при необходимости можно указать специальное имя. Для этого достаточно задать поле tsdb_name="...".
Буфер на запись в БД
В данной реализации встроен специальный буфер, который накапливает данные и скидывает их пачкой в БД. Так же он является защитным механизмом на случай если БД временно недоступна. Параметры буфера задаются аргументами командной строки или в конфигурационном файле. Доступны следующие параметры:
- bufSize - размер буфера, при заполнении которого происходит посылка данных в БД
- bufMaxSize - максимальный размер буфера, при котором начинают откидываться новые сообщения (потеря сообщений)
- bufSyncTimeout - период сброса данных в БД
- reconnectTime - время на повторную попытку подключения к БД
- sizeOfMessageQueue - Размер очереди сообщений для обработки изменений по датчикам. При большом количестве отслеживаемых датчиков, размер должен быть достаточным, чтобы не терять изменения.
Примеры запросов к InfluxDB
Получение данных конкретного датчика:
SELECT * FROM sensors WHERE sensor='FC8_Fault_S'
SELECT time, value FROM sensors WHERE sensor='Box1_Temperature_AS' AND time > now() - 1h
Фильтрация по проекту:
SELECT * FROM sensors WHERE project='theatre'
SELECT mean(value) FROM sensors WHERE project='theatre' GROUP BY sensor
Просмотр доступных тегов:
SHOW TAG VALUES FROM sensors WITH KEY = "sensor"
SHOW TAG VALUES FROM sensors WITH KEY = "project"