Verwenden Sie die ZABBIX-API, um Serverinformationen abzurufen

*文
Freigeben: 2023-03-18 09:02:02
Original
4943 Leute haben es durchsucht

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!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage