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.
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[]
, 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.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 »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð :
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 :
Une fois la »å¨¦³¦´Ç³Ü±¹±ð°ù³Ù±ð effectu¨¦e, un ¨¦l¨¦ment sera cr¨¦¨¦ pour chaque proxy :
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 :