Manchmal müssen wir den Betriebsstatus des Servers überwachen. ZABBIX ist ein solches Online-Überwachungssystem. Gleichzeitig stellt ZABBIX APIs und andere Methoden für andere Programme zum Abrufen von Daten bereit. In diesem Artikel wird die gemeinsame Nutzung von PHP-Beispielcode verwendet, um allen mitzuteilen, wie Serverinformationen über ZABBIX abgerufen werden können.
Da wir das Zabbix-System installiert haben, muss ich nur noch wissen, wie ich an die Informationen komme. Zusammenfassend gibt es zwei Möglichkeiten, diese zu erhalten.
Informationen zur Installation finden Sie unter: Detaillierte Einführung in die Installation von Zabbix auf Centos7
1. Erhalten Sie Hostinformationen über die ZABBIX-API
Die erhaltenen Hostinformationen Auf diese Weise ist es relativ neu (wird jede Minute aktualisiert). Da die Schnittstelle jedoch jedes Mal angefordert werden muss, ist sie relativ langsam. Wenn eine große Anzahl von Hosts gleichzeitig abgefragt wird, ist sie sehr langsam.
Die offizielle Dokumentation des Open-Source-Überwachungssystems ZABBIX bietet eine umfangreiche API. Ich verwende hier Guzzle 6 für http-Anfragen. Natürlich können Sie auch die in PHP integrierte Curl-Funktion verwenden, um selbst eine HTTP-Anfrage zu schreiben, was sehr einfach ist.
1. Benutzerauthentifizierung zum Erhalten des Tokens.
$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 ], ]);
Da es sich um eine Benutzerauthentifizierung handelt, können alle Authentifizierungen direkt auf Null geschrieben werden. Das zurückgegebene Ergebnis ist:
{ "jsonrpc": "2.0", "result": "0424bd59b807674191e7d77572075f33", "id": 1 }
Das Ergebnis enthält ein Token, das in nachfolgenden Anfragen benötigt wird.
2. Ermitteln Sie die Host-ID basierend auf der IP des Hosts.
$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" ], ]);
Die obige Ausgabe ist ein eingeschränktes Rückgabeelement. Wenn Sie alle Hostinformationen zurückgeben möchten, können Sie die Ausgabe entfernen. Das Rückgabeergebnis der obigen Anfrage ist:
{ "jsonrpc": "2.0", "result": [ { "hostid": "10160", } ], "id": 1 }
3. Holen Sie sich die Überwachungselement-Item-ID des Hosts.
Zabbix bietet viele Überwachungselemente. Die Frage ist also: Welche brauchen wir? Im Folgenden stellt ein Blogger einige häufig verwendete Überwachungselemente vor:
$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; }
Das zurückgegebene Ergebnis ist:
{ "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. Erhalten Sie die historischen Informationen des entsprechenden Überwachungselements
Im vorherigen Schritt Wir haben die Item-ID aller entsprechenden Überwachungselemente erhalten. Rufen Sie nun die historischen Informationen dieser Überwachungselemente ab. Die Informationen in dieser Schnittstelle werden jede Minute aktualisiert. Wie lange der Abruf der Informationen dauert, hängt also von Ihren individuellen Bedürfnissen ab.
$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; } }
Das zurückgegebene Ergebnis ist:
{ "jsonrpc": "2.0", "result": [ { "itemid": "23296", "clock": "1351090996", "value": "0.0850", "ns": "563157632" }, { ], "id": 1 }
Abschließend sollte das Ergebnis lauten:
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. Informationen direkt aus der Datenbank beziehen
Die auf diese Weise erhaltenen Daten sind nicht die neuesten (stündlich aktualisiert). Die Abfragegeschwindigkeit wurde jedoch erheblich verbessert.
Da ich den Code mit dem Laravel-Framework geschrieben habe, werde ich einfach faul sein und keine nativen SQL-Anweisungen schreiben. Jeder kann es sich einfach ansehen.
1. Holen Sie sich die Host-ID aus der Hosts-Tabelle über IP
$host_id = Host::where('host', '10.50.150.80')->value('hostid');
Das zurückgegebene Ergebnis ist: 11101
2. Holen Sie sich die Artikel-ID des Artikelüberwachungselements aus der Artikeltabelle über die Host-ID
$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_');
Das zurückgegebene Ergebnis ist:
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 ruft historische Informationen aus der Trends-Tabelle oder der Trends_uint-Tabelle ab
$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; }
Das zurückgegebene Ergebnis ist:
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" ]
Verwandte Empfehlungen:
Detaillierte Einführung in die Installation von Zabbix auf Centos7
Zabbix-Implementierung von E-Mail-Alarmbeispielen Tutorial
Detaillierte Erläuterung des Zabbix-Überwachungsserverzeitproblems
Das obige ist der detaillierte Inhalt vonVerwenden Sie die ZABBIX-API, um Serverinformationen abzurufen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!