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

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

Dec 22, 2017 pm 01:51 PM
api zabbix 섬기는 사람

때때로 서버의 실행 상태를 모니터링해야 하는 경우가 있습니다. 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으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

eMule 검색이 서버에 연결할 수 없는 문제를 해결하는 방법 eMule 검색이 서버에 연결할 수 없는 문제를 해결하는 방법 Jan 25, 2024 pm 02:45 PM

eMule 검색이 서버에 연결할 수 없는 문제를 해결하는 방법

CentOS 설치 퓨즈 및 CentOS 설치 서버에 대한 자세한 설명 CentOS 설치 퓨즈 및 CentOS 설치 서버에 대한 자세한 설명 Feb 13, 2024 pm 08:40 PM

CentOS 설치 퓨즈 및 CentOS 설치 서버에 대한 자세한 설명

RPC 서버 연결 불가 및 데스크탑 진입 불가 현상에 대한 해결 방법 RPC 서버 연결 불가 및 데스크탑 진입 불가 현상에 대한 해결 방법 Feb 18, 2024 am 10:34 AM

RPC 서버 연결 불가 및 데스크탑 진입 불가 현상에 대한 해결 방법

PHP를 사용한 IP 프록시 서버 구축을 위한 모범 사례 가이드 PHP를 사용한 IP 프록시 서버 구축을 위한 모범 사례 가이드 Mar 11, 2024 am 08:36 AM

PHP를 사용한 IP 프록시 서버 구축을 위한 모범 사례 가이드

Dnsmasq를 DHCP 릴레이 서버로 구성하는 방법 Dnsmasq를 DHCP 릴레이 서버로 구성하는 방법 Mar 21, 2024 am 08:50 AM

Dnsmasq를 DHCP 릴레이 서버로 구성하는 방법

에픽서버가 오프라인 상태일 때 게임에 접속할 수 없으면 어떻게 해야 하나요? 에픽게임즈가 오프라인으로 게임에 입장할 수 없는 이유에 대한 해결책 에픽서버가 오프라인 상태일 때 게임에 접속할 수 없으면 어떻게 해야 하나요? 에픽게임즈가 오프라인으로 게임에 입장할 수 없는 이유에 대한 해결책 Mar 13, 2024 pm 04:40 PM

에픽서버가 오프라인 상태일 때 게임에 접속할 수 없으면 어떻게 해야 하나요? 에픽게임즈가 오프라인으로 게임에 입장할 수 없는 이유에 대한 해결책

서버에 PHP FFmpeg 확장을 설치하는 방법은 무엇입니까? 서버에 PHP FFmpeg 확장을 설치하는 방법은 무엇입니까? Mar 28, 2024 pm 02:39 PM

서버에 PHP FFmpeg 확장을 설치하는 방법은 무엇입니까?

Apple ID 서버에 연결할 때 오류가 발생하면 어떻게 해야 합니까? Apple ID 서버에 연결할 때 오류가 발생하면 어떻게 해야 합니까? Feb 20, 2024 pm 03:30 PM

Apple ID 서버에 연결할 때 오류가 발생하면 어떻게 해야 합니까?

See all articles