Parfois, nous devons surveiller l'état de fonctionnement du serveur. ZABBIX est un tel système de surveillance en ligne. Dans le même temps, ZABBIX fournit une API et d'autres méthodes permettant à d'autres programmes d'obtenir des données. Cet article utilise un exemple de partage de code PHP pour permettre à tout le monde de savoir comment obtenir des informations sur le serveur via ZABBIX.
Depuis que nous avons installé le système zabbix, il me suffit de savoir comment obtenir l'information. En résumé, il y a deux manières de l'obtenir.
Pour l'installation, veuillez vous référer à : Introduction détaillée à l'installation de zabbix sur centos7
1 Obtenez des informations sur l'hôte via l'API ZABBIX
Les informations sur l'hôte obtenues. de cette façon, c'est relativement nouveau (mis à jour toutes les minutes). Cependant, comme l'interface doit être demandée à chaque fois, elle est relativement lente si un grand nombre d'hôtes sont interrogés simultanément, elle sera très lente.
La documentation officielle du système de surveillance open source ZABBIX fournit une API riche. J'utilise Guzzle 6 pour les requêtes http ici. Bien sûr, vous pouvez également utiliser la fonction curl intégrée de PHP pour écrire vous-même une requête http, ce qui est très simple.
1. Authentification de l'utilisateur pour obtenir le jeton.
$responst = $this->httpClient->request('POST', 'http://zabbix.xxxxx.com/zabbix/api_jsonrpc.php', [ 'headers' => [ 'Content-Type' => 'application/json-rpc', ], 'json' => [ 'jsonrpc' => '2.0', 'method' => 'user.login', 'params' => [ "user"=> 'your username', "password"=> 'your password' ], 'id' => 1, 'auth' => null ], ]);
Puisqu'il s'agit d'une authentification utilisateur, toutes les autorisations peuvent être écrites directement sur null. Le résultat renvoyé est :
{ "jsonrpc": "2.0", "result": "0424bd59b807674191e7d77572075f33", "id": 1 }
Le résultat contient un jeton, qui est nécessaire dans les requêtes suivantes.
2. Obtenez l'ID d'hôte en fonction de l'adresse IP de l'hôte.
$responst = $this->httpClient->request('POST', 'http://zabbix.xxxxx.com/zabbix/api_jsonrpc.php', [ 'headers' => [ 'Content-Type' => 'application/json-rpc', ], 'json' => [ 'jsonrpc' => '2.0', 'method' => 'host.get', 'params' => [ "output" => ["hostid"], "filter" => [ "host" => '192.168.1.1' ] ], 'id' => 1, 'auth' =>"0424bd59b807674191e7d77572075f33" ], ]);
La sortie ci-dessus est un élément de retour restreint. Si vous souhaitez renvoyer toutes les informations sur l'hôte, vous pouvez supprimer la sortie. Le résultat de retour de la demande ci-dessus est :
{ "jsonrpc": "2.0", "result": [ { "hostid": "10160", } ], "id": 1 }
3. Obtenez l'ID de l'élément de surveillance de l'hôte.
zabbix fournit de nombreux éléments de surveillance, la question est donc de savoir de quels éléments avons-nous besoin ? Voici quelques éléments de surveillance couramment utilisés présentés par les blogueurs :
$items = array( 'vm.memory.size[available]', // 内存可用值 (KB) 'vm.memory.size[total]', // 内存总数 (KB) 'system.cpu.util[,idle]', // 当前CPU IDLE值 (%) 'vfs.fs.size[/,used]', // 当前 / 盘使用值 (KB) 'vfs.fs.size[/,total]', // 当前 / 盘总数 (KB) );
$item_ids = array(); foreach ($items as $item) { $responst = $this->httpClient->request('POST', $this->url, [ 'headers' => [ 'Content-Type' => 'application/json-rpc', ], 'json' => [ 'jsonrpc' => $this->jsonrpc, 'method' => $this->METHOD_ITEM_GET, 'params' => [ "output" => 'extend', "hostids" => $this->hostid, "search" => [ "key_" => $item ], 'sortfield' => 'name' ], 'id' => 1, 'auth' => $this->token ], ]); $body = json_decode($responst->getBody()->getContents()); $item_ids[] = $body->result[0]->itemid; }
Le résultat renvoyé est :
{ "jsonrpc": "2.0", "result": [ { "itemid": "23298", "type": "0", "snmp_community": "", "snmp_oid": "", "hostid": "10084", "name": "Context switches per second", "key_": "vm.memory.size[available]", "delay": "60", "history": "7", "trends": "365", "lastvalue": "2552", "lastclock": "1351090998", "prevvalue": "2641", "state": "0", "status": "0", "value_type": "3", "trapper_hosts": "", "units": "sps", "multiplier": "0", "delta": "1", "snmpv3_securityname": "", "snmpv3_securitylevel": "0", "snmpv3_authpassphrase": "", "snmpv3_privpassphrase": "", "snmpv3_authprotocol": "0", "snmpv3_privprotocol": "0", "snmpv3_contextname": "", "formula": "1", "error": "", "lastlogsize": "0", "logtimefmt": "", "templateid": "22680", "valuemapid": "0", "delay_flex": "", "params": "", "ipmi_sensor": "", "data_type": "0", "authtype": "0", "username": "", "password": "", "publickey": "", "privatekey": "", "mtime": "0", "lastns": "564054253", "flags": "0", "interfaceid": "1", "port": "", "description": "", "inventory_link": "0", "lifetime": "0", "evaltype": "0" } ], "id": 1 }
4 Obtenir les informations historiques de l'élément de surveillance correspondant
À l'étape précédente. Nous avons obtenu l'identifiant de tous les éléments de surveillance correspondants. Obtenez maintenant les informations historiques de ces éléments de surveillance. Les informations de cette interface sont mises à jour toutes les minutes, donc la durée pendant laquelle les informations doivent être récupérées dépend de vos besoins individuels.
$items_result = array(); foreach ($this->itemids as $k=>$itemid) { if($this->items[$k] == 'system.cpu.util[,idle]') { $history = 0; }else { $history = 3; } $responst = $this->httpClient->request('POST', 'http://zabbix.xxxxx.com/zabbix/api_jsonrpc.php', [ 'headers' => [ 'Content-Type' => 'application/json-rpc', ], 'json' => [ 'jsonrpc' => '2.0', 'method' => 'history.get', 'params' => [ "output" => 'extend', "history" => $history, "itemids" => $itemid, "sortfield" => 'clock', 'sortorder' => 'DESC', 'limit' => '1', ], 'id' => 1, 'auth' => $this->token ], ]); $body = json_decode($responst->getBody()->getContents()); if(property_exists($body, 'result')) { $items_result[$this->items[$k]] = $body->result[0]->value; }else { Log::error(json_encode($body)); return false; } }
Le résultat renvoyé est :
{ "jsonrpc": "2.0", "result": [ { "itemid": "23296", "clock": "1351090996", "value": "0.0850", "ns": "563157632" }, { ], "id": 1 }
Finalement Le résultat devrait être :
array:5 [▼ "system.cpu.util[,idle]" => 98.9622 "vfs.fs.size[/,total]" => "42141548544" "vfs.fs.size[/,used]" => "6917797137" "vm.memory.size[available]" => "57394996906" "vm.memory.size[total]" => "67439050752" ]
2. Obtenir des informations directement à partir de la base de données
Les données ainsi obtenues ne sont pas les dernières (mises à jour toutes les heures). Mais la vitesse des requêtes a été grandement améliorée.
Parce que j'ai écrit le code en utilisant le framework Laravel, je vais juste être paresseux et ne pas écrire d'instructions SQL natives. Tout le monde peut simplement le regarder.
1. Obtenez l'ID d'hôte de la table des hôtes via ip
$host_id = Host::where('host', '10.50.150.80')->value('hostid');
Le résultat renvoyé est : 11101
2. Obtenez l'ID de l'élément de surveillance des éléments à partir de la table des éléments via l'ID d'hôte
$items = array( 'vm.memory.size[available]', // 内存可用值 (KB) 'vm.memory.size[total]', // 内存总数 (KB) 'system.cpu.util[,idle]', // 当前CPU IDLE值 (%) 'vfs.fs.size[/,used]', // 当前 / 盘使用值 (KB) 'vfs.fs.size[/,total]', // 当前 / 盘总数 (KB) ); $item_ids = Item::where('hostid', 11106)->whereIn('key_', $items)->pluck('itemid', 'key_');
Le résultat renvoyé est :
Collection {#183 ▼ #items: array:5 [▼ "system.cpu.util[,idle]" => 152511 "vfs.fs.size[/,total]" => 155584 "vfs.fs.size[/,used]" => 155587 "vm.memory.size[available]" => 152533 "vm.memory.size[total]" => 152534 ] }
3. Pass itemid obtient des informations historiques à partir de la table des tendances ou de la table des tendances_uint
$result = array(); foreach ($item_ids as $key=>$item_id) { if($key == 'system.cpu.util[,idle]') { $value = Trend::where('itemid', $item_id)->orderBy('clock', 'DESC')->value('value_avg'); }else { $value = TrendsUint::where('itemid', $item_id)->orderBy('clock', 'DESC')->value('value_avg'); } $result[$key] = $value; }
Le résultat renvoyé est :
array:5 [▼ "system.cpu.util[,idle]" => 98.9622 "vfs.fs.size[/,total]" => "42141548544" "vfs.fs.size[/,used]" => "6917797137" "vm.memory.size[available]" => "57394996906" "vm.memory.size[total]" => "67439050752" ]
Recommandations associées :
Introduction détaillée à l'installation de zabbix sur centos7
Mise en œuvre Zabbix d'exemples d'alarmes par e-mail Tutoriel
Explication détaillée du problème de temps du serveur de surveillance Zabbix
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!