Áú»¢¶Ä²©

11 D¨¦couverte ¨¤ l'aide de requ¨ºtes SQL ODBC

Aper?u

Ce type de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð de bas niveau est effectu¨¦ ¨¤ l'aide de requ¨ºtes SQL, dont les r¨¦sultats sont automatiquement transform¨¦s en un objet JSON adapt¨¦ ¨¤ la »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð de bas niveau.

Cl¨¦ d'¨¦l¨¦ment

Les requ¨ºtes SQL sont effectu¨¦es ¨¤ l'aide d'une ¨¦l¨¦ment de type "Surveillance base de donn¨¦es". Par cons¨¦quent, la plupart des instructions de la page Surveillance ODBC s'appliquent afin d'obtenir une r¨¨gle de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð "Surveillance base de donn¨¦es" fonctionnelle.

Deux cl¨¦s d'¨¦l¨¦ments peuvent ¨ºtre utilis¨¦es dans les r¨¨gles de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð "Surveillance base de donn¨¦es" :

  • db.odbc.discovery[<courte description unique>,<dsn>,<cha?ne de connexion>] - cet ¨¦l¨¦ment transforme le r¨¦sultat de la requ¨ºte SQL en un tableau JSON, transformant les noms de colonne du r¨¦sultat de la requ¨ºte en noms de macro de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð de bas niveau associ¨¦s aux valeurs de champ »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ðs. Ces macros peuvent ¨ºtre utilis¨¦es pour cr¨¦er des prototypes d'¨¦l¨¦ments, de d¨¦clencheurs, etc. Voir aussi : Utilisation de odb.odbc.discovery.
  • db.odbc.get[<courte description unique>,<dsn>,<cha?ne de connexion>] - cet ¨¦l¨¦ment transforme le r¨¦sultat de la requ¨ºte SQL en un tableau JSON, en conservant les noms de colonne d'origine du r¨¦sultat de la requ¨ºte en tant que nom de champ dans JSON associ¨¦ aux valeurs »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ðs. Compar¨¦ ¨¤ db.odbc.discovery[], cet ¨¦l¨¦ment ne cr¨¦e pas de macros de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð de bas niveau dans le JSON renvoy¨¦, il n'est donc pas n¨¦cessaire de v¨¦rifier si les noms de colonne peuvent ¨ºtre des noms de macro valides. Les macros de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð de bas niveau peuvent ¨ºtre d¨¦finies comme une ¨¦tape suppl¨¦mentaire si n¨¦cessaire, ¨¤ l'aide de la fonctionnalit¨¦ macro LLD personnalis¨¦e avec JSONPath pointant vers les valeurs »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ðs dans le JSON renvoy¨¦. Voir aussi : Utilisation de db.odbc.get.

Utilisation de db.odbc.discovery

Comme exemple pratique pour illustrer comment la requ¨ºte SQL est transform¨¦e en JSON, consid¨¦rons la »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð de bas niveau des proxys Áú»¢¶Ä²© en effectuant une requ¨ºte ODBC sur la base de donn¨¦es Áú»¢¶Ä²©. Ceci est utile pour la cr¨¦ation automatique des ¨¦l¨¦ments internes "zabbix[proxy,<nom>,lastaccess]" afin de surveiller quels proxys sont actifs.

Commen?ons par la configuration de la r¨¨gle de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð :

lld_rule_odbc.png

Tous les champs de saisie obligatoires sont marqu¨¦s d'un ast¨¦risque rouge.

Ici, la requ¨ºte directe suivante sur la base de donn¨¦es Áú»¢¶Ä²© est utilis¨¦e pour s¨¦lectionner tous les proxys Áú»¢¶Ä²©, ainsi que le nombre d¡¯h?tes qu¡¯ils surveillent. Le nombre d'h?tes peut ¨ºtre utilis¨¦, par exemple, pour filtrer les proxys vides :

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)

Gr?ce au fonctionnement interne de l'¨¦l¨¦ment ¡°db.odbc.discovery[,{$DSN}]¡±, le r¨¦sultat de cette requ¨ºte est automatiquement transform¨¦ en JSON suivant :

[
           {
               "{#HOST}": "Japan 1",
               "{#COUNT}": "5"
           },
           {
               "{#HOST}": "Japan 2",
               "{#COUNT}": "12"
           },
           {
               "{#HOST}": "Latvia",
               "{#COUNT}": "3"
           }
       ]

On peut voir que les noms de colonne deviennent des noms de macro et que les lignes s¨¦lectionn¨¦es deviennent les valeurs de ces macros.

S'il n'est pas ¨¦vident de transformer un nom de colonne en nom de macro, il est sugg¨¦r¨¦ d'utiliser des alias de colonne tels que "COUNT(h2.host) AS count" dans l'exemple ci-dessus. Si un nom de colonne ne peut pas ¨ºtre converti en un nom de macro valide, la r¨¨gle de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð devient non support¨¦e, le message d'erreur d¨¦taillant le num¨¦ro de colonne incrimin¨¦. Si une aide suppl¨¦mentaire est n¨¦cessaire, les noms de colonne obtenus sont fournis sous DebugLevel=4 dans le fichier journal du serveur Áú»¢¶Ä²© :

    $ 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 [Áú»¢¶Ä²© server:db.odbc.discovery[proxies,{$DSN}]] error: Cannot convert column #2 name to macro.

Maintenant que nous comprenons comment une requ¨ºte SQL est transform¨¦e en objet JSON, nous pouvons utiliser la macro {#HOST} dans des prototypes d¡¯¨¦l¨¦ment :

item_prototype_odbc.png

Une fois la »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð effectu¨¦e, un ¨¦l¨¦ment sera cr¨¦¨¦ pour chaque proxy :

discovered_items_odbc1.png

Utilisation de db.odbc.get

En utilisant db.odbc.get[,{$DSN}] et l'exemple SQL suivant :

    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)

ce JSON sera retourn¨¦ :

[
           {
               "host": "Japan 1",
               "count": "5"
           },
           {
               "host": "Japan 2",
               "count": "12"
           },
           {
               "host": "Latvia",
               "count": "3"
           }
       ]

Comme vous pouvez le voir, il n'y a pas de macros de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð de bas niveau. Cependant, des macros de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð personnalis¨¦es de bas niveau peuvent ¨ºtre cr¨¦¨¦es dans l'onglet Macros LLD d'une r¨¨gle de »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð ¨¤ l'aide de JSONPath, par exemple :

    {#HOST} ¡ú $.host

D¨¦sormais, cette macro {#HOST} peut ¨ºtre utilis¨¦e dans les prototypes d'¨¦l¨¦ments :

item_prototype_odbc.png