Heim Backend-Entwicklung PHP-Tutorial Verwenden Sie die ZABBIX-API, um Serverinformationen abzurufen

Verwenden Sie die ZABBIX-API, um Serverinformationen abzurufen

Dec 22, 2017 pm 01:51 PM
api zabbix 服务器

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
    ],
]);
Nach dem Login kopieren


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
}
Nach dem Login kopieren

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"
 ], ]);
Nach dem Login kopieren


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
}
Nach dem Login kopieren




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)
);
Nach dem Login kopieren


$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;
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren



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;
    }
}
Nach dem Login kopieren


Das zurückgegebene Ergebnis ist:


{
    "jsonrpc": "2.0",
    "result": [
        {
            "itemid": "23296",
            "clock": "1351090996",
            "value": "0.0850",
            "ns": "563157632"
        },
        {
    ],
    "id": 1
}
Nach dem Login kopieren


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"
]
Nach dem Login kopieren
Nach dem Login kopieren



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');
Nach dem Login kopieren

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_');
Nach dem Login kopieren


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
  ]
}
Nach dem Login kopieren

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;
}
Nach dem Login kopieren


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"
]
Nach dem Login kopieren
Nach dem Login kopieren


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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So lösen Sie das Problem, dass die eMule-Suche keine Verbindung zum Server herstellen kann So lösen Sie das Problem, dass die eMule-Suche keine Verbindung zum Server herstellen kann Jan 25, 2024 pm 02:45 PM

So lösen Sie das Problem, dass die eMule-Suche keine Verbindung zum Server herstellen kann

Detaillierte Erläuterung der CentOS-Installationssicherung und des CentOS-Installationsservers Detaillierte Erläuterung der CentOS-Installationssicherung und des CentOS-Installationsservers Feb 13, 2024 pm 08:40 PM

Detaillierte Erläuterung der CentOS-Installationssicherung und des CentOS-Installationsservers

Lösung für die Unfähigkeit, eine Verbindung zum RPC-Server herzustellen und den Desktop nicht aufzurufen Lösung für die Unfähigkeit, eine Verbindung zum RPC-Server herzustellen und den Desktop nicht aufzurufen Feb 18, 2024 am 10:34 AM

Lösung für die Unfähigkeit, eine Verbindung zum RPC-Server herzustellen und den Desktop nicht aufzurufen

Best-Practice-Leitfaden zum Erstellen von IP-Proxyservern mit PHP Best-Practice-Leitfaden zum Erstellen von IP-Proxyservern mit PHP Mar 11, 2024 am 08:36 AM

Best-Practice-Leitfaden zum Erstellen von IP-Proxyservern mit PHP

So konfigurieren Sie Dnsmasq als DHCP-Relay-Server So konfigurieren Sie Dnsmasq als DHCP-Relay-Server Mar 21, 2024 am 08:50 AM

So konfigurieren Sie Dnsmasq als DHCP-Relay-Server

Was soll ich tun, wenn ich das Spiel nicht betreten kann, während der Epic-Server offline ist? Lösung, warum Epic das Spiel nicht offline betreten kann Was soll ich tun, wenn ich das Spiel nicht betreten kann, während der Epic-Server offline ist? Lösung, warum Epic das Spiel nicht offline betreten kann Mar 13, 2024 pm 04:40 PM

Was soll ich tun, wenn ich das Spiel nicht betreten kann, während der Epic-Server offline ist? Lösung, warum Epic das Spiel nicht offline betreten kann

Wie installiere ich die PHP-FFmpeg-Erweiterung auf dem Server? Wie installiere ich die PHP-FFmpeg-Erweiterung auf dem Server? Mar 28, 2024 pm 02:39 PM

Wie installiere ich die PHP-FFmpeg-Erweiterung auf dem Server?

Was tun, wenn beim Herstellen der Verbindung zum Apple-ID-Server ein Fehler auftritt? Was tun, wenn beim Herstellen der Verbindung zum Apple-ID-Server ein Fehler auftritt? Feb 20, 2024 pm 03:30 PM

Was tun, wenn beim Herstellen der Verbindung zum Apple-ID-Server ein Fehler auftritt?

See all articles