Utilisez l'API ZABBIX pour obtenir des informations sur le serveur

*文
Libérer: 2023-03-18 09:02:02
original
4923 Les gens l'ont consulté

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
    ],
]);
Copier après la connexion


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
}
Copier après la connexion

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"
 ], ]);
Copier après la connexion


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
}
Copier après la connexion




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)
);
Copier après la connexion


$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;
}
Copier après la connexion

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
}
Copier après la connexion



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;
    }
}
Copier après la connexion


Le résultat renvoyé est :


{
    "jsonrpc": "2.0",
    "result": [
        {
            "itemid": "23296",
            "clock": "1351090996",
            "value": "0.0850",
            "ns": "563157632"
        },
        {
    ],
    "id": 1
}
Copier après la connexion


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"
]
Copier après la connexion
Copier après la connexion



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');
Copier après la connexion

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_');
Copier après la connexion


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
  ]
}
Copier après la connexion

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;
}
Copier après la connexion


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"
]
Copier après la connexion
Copier après la connexion


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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!