詳解經過Zabbix如何獲取監控數據

############
zabbix基本架構
############

1.Server
zabbix系統核心進程,輪詢並捕獲數據、發送通知等。是zabbix agent和zabbix proxy彙報數據的對象。server自身可遠程檢測網絡服務。全部的先後端配置、統計信息、可操做數據存儲於此。包含server、前段界面和後端DB幾部分。

2.Agent
部署在被監控主機上用於監控本地資源和應用並向zabbix server彙報結果。使用本地系統調用故很是高效。有主動和被動兩種檢測模式。被動模式下agent根據server或proxy的具體請求來返回數 據。主動模式下先主動由server獲取監控項列表在檢測並返回新的數據。採用主動或被動檢測取決於相應監控項的配置。

3.Proxy
能夠自由選擇部署或者不部署,主要用於分擔server的負載。在集中化監控遠程位置、分支、網絡的場景中是很好的解決方案。可從被監控設備收集數據緩存在proxy本地後傳遞給其所屬的zabbix server。proxy須要單獨的數據庫。

4.Java gateway
java實現的守護進程用於監控JMX類型的應用程序。

5.Sender
命令行工具zabbix_sender,用於向zabbix server發送性能數據和可用性數據。多用於用戶腳本按期向server發送數據。
如:
shell> cd bin
shell> ./zabbix_sender -z zabbix -s "Linux DB3" -k db.connections -o 43

6.Get
命令行工具zabbix_get,用於同agent通訊從agent獲取數據。可用於zabbix agents的troubleshooting。
如:
shell> cd bin
shell> ./zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]"

####################################
#zabbix術語表
####################################
host
須要被監控的設備,如交換機、路由器、WEB服務器、DB服務器等

host group
被監控設備的邏輯分組,如DB服務器一組、WEB服務器一組等。可包含主機和模板。用於權限控制

item
須要被監控的項,如CPU空閒率、某一塊磁盤的使用率等

trigger
用於評估收到的監控值是否超出設定的閾值的邏輯表達式

event
如trigger狀態改變等值得注意的事件

action
預先定義的響應event的一系列operations

escalation
執行action中的operations的定製場景;一連串的發送通知、執行遠程命令

media
傳遞notification的方式

notification
經過media發送給用戶的關於某個event的消息

remote command
在被監控機器上觸發並自動執行的預約義命令

template
用於簡化和加速主機上大規模監控任務的部署。包含一系列項目,如items, triggers, graphs, screens, applications, low-level discovery rules

application
邏輯組中的一組items

web scenario
一個或多個HTTP request用以檢查web站點可用性

frontend
zabbix的web界面

zabbix api
容許經過JSON RPC 協議建立、更新和獲取zabbix對象如,hosts, items, graphs and others。或者執行其餘任務

zabbix server
zabbix核心,履行監控,與zabbix proxies、zabbix client交互、計算trigger、發送notification、存儲數據等任務

zabbix agent
部署在被監控主機上用於監控本地資源和應用

zabbix proxy
可代zabbix server收集數據分擔處理負載

######################################
#zabbix配置
######################################
可經過WEB界面或者模板進行配置
需配置內容包括users、user groups、hosts、host groups、items、Triggers、Events、notification、templates、visualisation等。
最終配置會被存儲在後端database中。

參考:
https://www.zabbix.com/documentation/2.4/manual/config


#####################################
zabbix取數方式
####################################
1.zabbix api
基於WEB的API,經過JSON PRC協議獲取或更改zabbix配置,並可用於獲取歷史監控數據。clients和API間的request和response使用JSON格式。包含一系列可從功能上分爲不一樣組別的方法。

發起HTTP請求的格式相似以下:
POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc
{"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":null,"params":{}}
其中http://company.com/zabbix/是zabbix前端的地址;Content-Type必須指明且爲application /json-rpc, application/json or application/jsonrequest三者之一。 {"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":null,"params": {}}是請求的具體內容。

一些實例:
*登陸認證
{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "Admin",
        "password": "zabbix"
    },
    "id": 1,
    "auth": null
}
其中:
jsonrpc:指明JSON-RPC協議版本,這裏是2.0版本
method:指明調用的API方法,這裏是用戶登陸
params:須要傳遞給API method的參數,這裏是用戶名和密碼
id:本次請求的標識符
auth:用戶認證令牌,目前尚無因此爲null
若參數無誤response將會包含用戶認證令牌,如:
{
    "jsonrpc": "2.0",
    "result": "0424bd59b807674191e7d77572075f33",
    "id": 1
}

*獲取hosts信息
{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": [
            "hostid",
            "host"
        ],
        "selectInterfaces": [
            "interfaceid",
            "ip"
        ]
    },
    "id": 2,
    "auth": "0424bd59b807674191e7d77572075f33"
}
本例使用可用的用戶認證令牌經過host.get方法獲取所配置的主機的ID 、name等信息,返回以下
{
    "jsonrpc": "2.0",
    "result": [
        {
            "hostid": "10084",
            "host": "Zabbix server",
            "interfaces": [
                {
                    "interfaceid": "1",
                    "ip": "127.0.0.1"
                }
            ]
        }
    ],
    "id": 2
}
爲了考慮性能影響、儘可能僅列出所需項而非返回全部數據

*建立新監控項
例如在上一步獲取的host上創建新的監控項、監控/home/joe/目錄的剩餘空間
{
    "jsonrpc": "2.0",
    "method": "item.create",
    "params": {
        "name": "Free disk space on $1",
        "key_": "vfs.fs.size[/home/joe/,free]",
        "hostid": "10084",
        "type": 0,
        "value_type": 3,
        "interfaceid": "1",
        "delay": 30
    },
    "auth": "0424bd59b807674191e7d77572075f33",
    "id": 3
}
其中params參數中的幾個關鍵參數含義以下:
name:監控項的名稱,這個能夠本身靈活定義,其中的$1表明key_中的第一個參數,此處爲/home/joe/
key_:預約義的監控項,zabbix提供了一系列此類監控內容,此處需從其中進行選擇。
hostid:即上步得到的hostid
value_type:監控數據值的類型,不一樣的數字表明不一樣的類型,此處的3表明整型
delay:zabbix取數時間間隔,此處爲30秒取一次

返回結果以下:
{
    "jsonrpc": "2.0",
    "result": {
        "itemids": [
            "24759"
        ]
    },
    "id": 3
}
itemid爲生成的監控項的id

*獲取歷史數據:
從歷史記錄表獲取itemids爲23296的按clock降序排列的十條記錄
history參數可能的取值
0 - float; 
1 - string; 
2 - log; 
3 - integer; 
4 - text. 
{
    "jsonrpc": "2.0",
    "method": "history.get",
    "params": {
        "output": "extend",
        "history": 0,
        "itemids": "23296",
        "sortfield": "clock",
        "sortorder": "DESC",
        "limit": 10
    },
    "auth": "038e1d7b1735c6a5436ee9eae095879e",
    "id": 1
}
返回結果:
{
    "jsonrpc": "2.0",
    "result": [
        {
            "itemid": "23296",
            "clock": "1351090996",
            "value": "0.0850",
            "ns": "563157632"
        },
        {
            "itemid": "23296",
            "clock": "1351090936",
            "value": "0.1600",
            "ns": "549216402"
        },
        ...]
}

*錯誤處理
下例忘記了groups這個參數
{
    "jsonrpc": "2.0",
    "method": "host.create",
    "params": {
        "host": "Linux server",
        "interfaces": [
            {
                "type": 1,
                "main": 1,
                "useip": 1,
                "ip": "192.168.3.1",
                "dns": "",
                "port": "10050"
            }
        ]
    },
    "id": 3,
    "auth": "0424bd59b807674191e7d77572075f33"
}
返回結果以下,包含的不是result屬性而是error屬性
{
    "jsonrpc": "2.0",
    "error": {
        "code": -32602,
        "message": "Invalid params.",
        "data": "No groups for host \"Linux server\"."
    },
    "id": 3
}

對於獲取監控數據來講,比較關心的應該是history.get這個方法。這種方式實際上最終仍是由後臺數據庫獲取的。方法提供了豐富的參數,使用很是靈活。但對於一次性大規模的取出大量主機大量監控項的大批數據不太適合。

參考:
https://www.zabbix.com/documentation/2.4/manual/api

2.zabbix_get:
命令行工具,可從遠程的zabbix agent獲取數據
zabbix_get [-hV] [-s <host name or IP>] [-p <port number>] [-I <IP address>] [-k <item key>]  
-s, --host <host name or IP>
-p, --port <port number>
-I, --source-address <IP address>
-k, --key <item key>
-h, --help
-V, --version.
如:zabbix_get -s 127.0.0.1 -p 10050 -k system.cpu.load[all,avg1]  
zabbix api獲取到的是數據庫中的歷史數據,zabbix_get可得到實時的數據。可根據工具的特色選擇適合的場景。

參考:
https://www.zabbix.com/documentation/2.4/manpages/zabbix_get

3.zabbix databases:
直接由zabbix後臺數據庫獲取歷史數據。適用於一次性大規模的取出大量主機大量監控項的大批數據。

*相關表
history系列表分別存儲不一樣數據類型的歷史數據
表中數據以update interval爲時間間隔
zabbix.history    -numeric(float)  
zabbix.history_log -log
zabbix.history_str -character(up to 255 bytes)
zabbix.history_text -text
zabbix.history_unit -numeric(unsigned intergers)

trends_系列表存儲不一樣類型的歷史數據統計結果
表中數據以小時爲時間間隔,存儲每小時的最小、最大和平均值
zabbix.trends  -numeric(float)
zabbix.trends_unit -numeric(unsigned intergers)
character\log\text\類型無歷史統計結果

history系列的表只包含itemid、clock、value等數據
trends系列的表只包含itemid、clock、value_min、value_avg、value_max等數據
history、trends需與items、hosts、hosts_groups、groups表關聯來獲取item名稱、host名稱、組別等。

*表及重要的表字段
hosts
hosts.hostid  主機id
hosts.host    主機名
hosts.status  主機狀態 0爲正常監控,1爲關閉,3表示是個Template,5尚不不清楚。

hosts_group
hosts_group.hostid  主機id
hosts_group.groupid 所屬組id

groups
groups.groupid  組id
groups.name     組名

items
items.itemid    監控項id
items.hostid    監控項所在主機id
items.name      監控項別名
items.key_      監控項標準名稱
items.value_type值類型
items.delay     取數時間間隔
items.history   歷史表數據保留天數
items.trends    歷史統計表數據保留天數
item.units      數據單位

items表中value_type與history的對應關係
(主要爲了存取效率將不一樣值類型存在不一樣的history表中)
value_type  history表
0           history
1           history_str
2           history_log
3           history_uint
4           history_text

history
hisrtory.itemid 監控項id

trends
trends.itemid 監控項id

 php

zabbix後臺系統的涉及到大量的表,取歷史數據的話關心這幾個便可
 前端

*監控項規則解讀
zabbix.items表中存在相似於以下的配置項(如網絡網卡監控、磁盤監控等):
name                            key_
Free disk space on $1                    vfs.fs.size[/,free]
Free disk space on / (percentage)     vfs.fs.size[/,pfree]
Free disk space on $1                    vfs.fs.size[/boot,free]
Free disk space on /boot (percentage)    vfs.fs.size[/boot,pfree]
Free disk space on $1                    vfs.fs.size[/data,free]
Free disk space on /data (percentage)    vfs.fs.size[/data,pfree]
Free disk space on $1                    vfs.fs.size[{#FSNAME},free]
Free disk space on {#FSNAME} (percentage) vfs.fs.size[{#FSNAME},pfree]

其中相似於以下的配置是zabbix提供的low level discovery配置方式,用於自動建立監控項適用於有多塊磁盤、多個目錄、多塊網卡等類型情形下監控項的自動發現
能夠把{#FSNAME}看作是模板能夠匹配配置好的全部的相關項好比:
Free disk space on {#FSNAME} (percentage)  vfs.fs.size[{#FSNAME},pfree]
Free disk space on /data (percentage)                   vfs.fs.size[/data,pfree]
Free disk space on /boot (percentage)                   vfs.fs.size[/boot,pfree]
Free disk space on / (percentage)                   vfs.fs.size[/,pfree]

相似的還有:
Incoming network traffic on $1 net.if.in[{#IFNAME}]
Outgoing network traffic on $1  net.if.out[{#IFNAME}]
IO.util.{#DISK_NAME} IO.util[{#DISK_NAME}]
等等

而上邊例子中的$一、$2等對應key_的參數位置,例如
Free disk space on $1 vfs.fs.size[/,free]
中$1就表明/ ,Free disk space on $1至關於Free disk space on /依次類推
java

相關文章
相關標籤/搜索