>백엔드 개발 >PHP 튜토리얼 >ZABBIX API를 사용하여 서버 정보 얻기

ZABBIX API를 사용하여 서버 정보 얻기

*文
*文원래의
2017-12-22 13:51:194948검색

때때로 서버의 실행 상태를 모니터링해야 하는 경우가 있습니다. ZABBIX는 이러한 온라인 모니터링 시스템입니다. 동시에 ZABBIX는 다른 프로그램이 데이터를 얻을 수 있는 API 및 기타 방법을 제공합니다. 이 기사에서는 PHP 예제 코드 공유를 사용하여 ZABBIX를 통해 서버 정보를 얻는 방법을 모든 사람에게 알립니다.

이미 Zabbix 시스템이 설치되어 있으므로 정보를 얻는 방법만 알면 됩니다. 정보를 얻는 방법은 두 가지가 있습니다.

설치는 다음을 참조하세요. centos7에 zabbix 설치에 대한 자세한 소개

1. ZABBIX API를 통해 호스트 정보 얻기

이 방법으로 얻은 호스트 정보는 비교적 새로운 것입니다(1분마다 업데이트됨). 하지만 인터페이스를 매번 요청해야 하기 때문에 상대적으로 속도가 느립니다. 동시에 쿼리하는 호스트 수가 많으면 속도가 매우 느려집니다.

오픈 소스 모니터링 시스템 ZABBIX의 공식 문서는 풍부한 API를 제공합니다. 여기서는 http 요청에 Guzzle 6을 사용합니다. 물론, PHP에 내장된 컬 기능을 사용하여 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를 기반으로 호스트 ID를 가져옵니다.


$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를 얻었습니다. 이제 이러한 모니터링 항목에 대한 이력 정보를 가져옵니다. 이 인터페이스의 정보는 1분마다 업데이트되므로 정보를 검색해야 하는 기간은 개인의 필요에 따라 다릅니다.

$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. 가져오기 데이터베이스 Information

에서 직접 가져옵니다.

이렇게 얻은 데이터는 최신 데이터가 아닙니다(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

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


를 통해 Trends 테이블 또는 Trends_uint 테이블에서 기록 정보를 얻습니다.

$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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.