12. Обнаружение с использованием запросов ODBC SQL

Обзор

Этот тип низкоуровневого обнаружения осуществляется с использованием SQL запросов, результаты которых автоматически преобразуются в объект JSON, пригодный для низкоуровневого обнаружения.

Ключ элемента данных

SQL-запросы выполняются с использованием типа элемента данных "Database monitor". Поэтому большинство инструкций на странице ODBC monitoring применимы для того, чтобы получить рабочее правило обнаружения "Database monitor".

В правилах обнаружения "Database monitor" можно использовать два ключа элемента данных:

  • db.odbc.discovery[<unique short description>,<dsn>,<connection string>] - этот элемент преобразует результат SQL-запроса в JSON-массив, превращая имена столбцов из результата запроса в имена макросов низкоуровневого обнаружения, сопоставленные со значениями обнаруженных полей. Эти макросы можно использовать при создании прототипов элемента данных, триггера и т. д. См. также: Using db.odbc.discovery.

  • db.odbc.get[<unique short description>,<dsn>,<connection string>] - этот элемент преобразует результат SQL-запроса в JSON-массив, сохраняя исходные имена столбцов из результата запроса в качестве имен полей в JSON, сопоставленных со значениями обнаруженных данных. По сравнению с db.odbc.discovery[], этот элемент не создает макросы низкоуровневого обнаружения в возвращаемом JSON, поэтому нет необходимости проверять, могут ли имена столбцов быть допустимыми именами макросов. Макросы низкоуровневого обнаружения можно определить дополнительно, если это требуется, с помощью функциональности custom LLD macro, используя JSONPath, указывающий на обнаруженные значения в возвращаемом JSON. См. также: Using db.odbc.get.

Использование db.odbc.discovery

Следующий пример демонстрирует, как SQL-запрос преобразуется в JSON с использованием низкоуровневого обнаружения прокси Zabbix на основе ODBC-запроса к базе данных Zabbix. Это полезно для автоматического создания внутренних элементов данных "zabbix[proxy,<name>,lastaccess]" internal items, чтобы отслеживать, какие прокси активны.

Начните с конфигурации правила обнаружения:

lld\_rule\_odbc.png

Все обязательные поля ввода отмечены красной звездочкой.

Здесь используется следующий прямой запрос к базе данных Zabbix, чтобы выбрать все прокси Zabbix вместе с количеством узлов сети, которые они контролируют. Количество узлов сети можно использовать, например, для исключения пустых прокси:

mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxyid 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".

Если имя столбца невозможно преобразовать в допустимое имя макроса, правило обнаружения перейдет в состояние "не поддерживается", а в сообщении об ошибке будет указан номер проблемного столбца. Если требуется дополнительная помощь, полученные имена столбцов можно увидеть при DebugLevel=4 в файле журнала сервера Zabbix:

$ 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} в прототипах элементов данных:

item\_prototype\_odbc.png

После выполнения обнаружения для каждого прокси будет создан элемент данных:

discovered\_items\_odbc1.png

Использование db.odbc.get

При использовании 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.proxyid 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} → $.host

Теперь, этот макрос {#HOST} можно использовать в прототипах элементов данных:

item\_prototype\_odbc.png