Этот тип низкоуровневого обнаружения осуществляется с использованием SQL запросов, результаты которых автоматически преобразуются в объект JSON, пригодный для низкоуровневого обнаружения.
SQL-запросы выполняются при помощи элементов данных типа «Монитор баз данных». Так что большая часть указаний со страницы ODBC мониторинга применима к получению работающего правила обнаружения «Монитора баз данных».
В правилах обнаружения «Монитор баз данных» можно использовать два ключа элементов данных:
db.odbc.discovery[]
, этот элемент данных не создает макросы низкоуровневого обнаружения в возвращаемом JSON, поэтому не требуется проверять, могут ли имена столбцов быть корректными именами макросов. Макросы низкоуровневого обнаружения можно определить дополнительным шагом по мере необходимости, используя функционал настраиваемых макросов с JSONPath, указывающим на обнаруженные значения в полученном JSON. Смотрите также: Использование db.odbc.get.В качестве практического примера, иллюстрирующего, как SQL запрос трансформируется в JSON, давайте рассмотрим низкоуровневое обнаружение Zabbix прокси, выполнив ODBC запрос к базе данных Zabbix. Он может быть полезен для автоматического создания внутренних элементов данных «zabbix[proxy,<name>,lastaccess]» для наблюдения за тем, какие прокси живы.
Давайте начнём с настройки правила обнаружения:
Все обязательные поля ввода отмечены красной звёздочкой.
Здесь используется следующий прямой запрос к базе данных Zabbix для выборки всех Zabbix прокси вместе с количеством узлов сети, за которыми эти прокси наблюдают. Количество узлов сети можно использовать, например, для фильтрации пустых прокси:
mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host;
+---------+-------+
| host | count |
+---------+-------+
| Japan 1 | 5 |
| Japan 2 | 12 |
| Latvia | 3 |
+---------+-------+
3 rows in set (0.01 sec)
Благодаря внутреннему механизму обработки элемента данных «db.odbc.discovery[,{$DSN}]», результат этого запроса автоматически преобразуется в следующий JSON:
[
{
"{#HOST}": "Japan 1",
"{#COUNT}": "5"
},
{
"{#HOST}": "Japan 2",
"{#COUNT}": "12"
},
{
"{#HOST}": "Latvia",
"{#COUNT}": "3"
}
]
Видно, что имена столбцов становятся именами макросов, а выбранные строки становятся значениями этих макросов.
Если результат преобразования имени столбца в имя макроса неочевиден, предлагается использовать алиасы к именам столбцов, как «COUNT(h2.host) AS count» в примере выше.
В случае, если имя столбца не удаётся сконвертировать в допустимое имя макроса, правило обнаружения становится неподдерживаемым с подробным сообщением об ошибке, содержащим номер проблемного столбца. Если желательна дополнительная помощь, полученные имена столбцов отображаются в файле журнала Zabbix сервера при DebugLevel=4:
$ grep db.odbc.discovery /tmp/zabbix_server.log
...
23876:20150114:153410.856 In db_odbc_discovery() query:'SELECT h1.host, COUNT(h2.host) FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host;'
23876:20150114:153410.860 db_odbc_discovery() column[1]:'host'
23876:20150114:153410.860 db_odbc_discovery() column[2]:'COUNT(h2.host)'
23876:20150114:153410.860 End of db_odbc_discovery():NOTSUPPORTED
23876:20150114:153410.860 Item [Zabbix server:db.odbc.discovery[proxies,{$DSN}]] error: Cannot convert column #2 name to macro.
Теперь, когда мы понимаем, как SQL запрос трансформируется в объект JSON, мы можем использовать макрос {#HOST} в прототипах элементов данных:
Как только обнаружение будет выполнено, элемент данных будет создан по каждому прокси:
При использовании db.odbc.get[,{$DSN}]
и следующего примера SQL:
mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host;
+---------+-------+
| host | count |
+---------+-------+
| Japan 1 | 5 |
| Japan 2 | 12 |
| Latvia | 3 |
+---------+-------+
3 rows in set (0.01 sec)
вернётся этот JSON:
[
{
"host": "Japan 1",
"count": "5"
},
{
"host": "Japan 2",
"count": "12"
},
{
"host": "Latvia",
"count": "3"
}
]
Как вы можете видеть, макросы низкоуровневого обнаружения здесь отсутствуют. Однако, можно создать настраиваемые макросы низкоуровневого обнаружения на вкладке LLD макросы правила обнаружения, используя JSONPath, например:
Теперь, этот макрос {#HOST} можно использовать в прототипах элементов данных: