UniSet 2.44.3
(DBServer_OpenTSDB) Реализация шлюза к InfluxDB

Общее описание шлюза к 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"