ホームページ >バックエンド開発 >PHPチュートリアル >ZABBIX APIを使用してサーバー情報を取得する

ZABBIX APIを使用してサーバー情報を取得する

*文
*文オリジナル
2017-12-22 13:51:194947ブラウズ

ZABBIX は、サーバーの実行状況を監視する必要がある場合があります。同時に、ZABBIX は、他のプログラムがデータを取得するための API およびその他のメソッドを提供します。この記事では、PHP のコード共有例を使用して、ZABBIX を通じてサーバー情報を取得する方法を説明します。

zabbix システムをインストールしたので、情報を取得する方法を知る必要があるだけです。要約すると、情報を取得する方法は 2 つあります。

インストールについては、以下を参照してください: centos7 への zabbix のインストールの詳細な紹介

1. ZABBIX API を介してホスト情報を取得します

この方法で取得されるホスト情報は比較的新しい (1 分ごとに更新されます)。ただし、インターフェイスは毎回リクエストする必要があるため、同時にクエリされるホストの数が多い場合は非常に遅くなります。

オープンソース監視システム ZABBIX の公式ドキュメントでは、豊富な API が提供されています。ここでは http リクエストに Guzzle 6 を使用します。もちろん、PHP の組み込みのcurl関数を使用して、httpリクエストを自分で作成することもできます。これは非常に簡単です。


1. トークンを取得するためのユーザー認証。

$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
    ],
]);


これはユーザー認証であるため、すべての認証を null に直接書き込むことができます。返される結果は次のとおりです:

{
    "jsonrpc": "2.0",
    "result": "0424bd59b807674191e7d77572075f33",
    "id": 1
}

結果はトークンであり、後続のリクエストで必要になります。


2. ホストの IP に基づいて hostid を取得します。


$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"
 ], ]);


上記の出力は、制限された戻り項目です。すべてのホスト情報を返したい場合は、出力を削除できます。上記のリクエストの戻り結果は次のとおりです:


{
    "jsonrpc": "2.0",
    "result": [
        {
            "hostid": "10160",
        }
    ],
    "id": 1
}




3. ホストの監視項目 itemid を取得します。

zabbix には多くの監視項目が用意されているため、問題はどれが必要なのかということです。ブロガーによって導入された一般的に使用される監視項目は次のとおりです。前のステップで、対応するすべての監視項目の itemid を取得しました。これらの監視項目の履歴情報を取得します。このインターフェースの情報は毎分更新されるため、情報を取得する必要がある時間は個々のニーズによって異なります。

$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;
}


最終結果は次のようになります:


{
    "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
}


2.データベースから直接情報


この方法で取得したデータは最新のものではありません(1時間ごとに更新されます)。ただし、クエリ速度は大幅に向上しました。


laravel フレームワークを使用してコードを書いたので、ネイティブ SQL ステートメントは書かずに、ただ怠けているだけです。誰でも見るだけで大​​丈夫です。


1. IP アドレスを介してホスト テーブルからホスト ID を取得します

$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;
    }
}

返される結果は次のとおりです: 11101


2. ホスト ID を介して項目テーブルから項目監視項目の項目 ID を取得します。
{
    "jsonrpc": "2.0",
    "result": [
        {
            "itemid": "23296",
            "clock": "1351090996",
            "value": "0.0850",
            "ns": "563157632"
        },
        {
    ],
    "id": 1
}


返される結果は次のとおりです:

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"
]

3. itemid を通じて Trends テーブルまたは Trends_uint テーブルから履歴情報を取得します

$host_id = Host::where('host', '10.50.150.80')->value('hostid');


返される結果は次のとおりです:

$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_');

関連推奨事項:

centos7へのzabbixインストールの詳細な紹介

メールアラームチュートリアルのZabbix実装


Zabbix監視サーバーの時間問題の詳細な説明

以上がZABBIX APIを使用してサーバー情報を取得するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。