天天看點

給你加個buff: Zabbix 6.0 Agent 2

作者:Zabbix中國

張瑾瑾 | 宏時資料技術工程師

  • Zabbix5.0、6.0中文手冊官方譯者

感謝譯者張瑾瑾,歡迎更多資深使用者翻譯官方博文并分享!

Zabbix agent 2 的開發旨在為使用者提供更多附加功能 —— 從支援的采集名額的增加到名額采集邏輯的改進和簡化的自定義監控插件的開發。那麼在 Zabbix 6.0 LTS 版本中 Zabbix Agent 2 将實作哪些功能?

什麼是 Zabbix agent?

首先,我們來談談 Zabbix agent 的主要功能以及它如何使監控更加靈活:

  • Zabbix Agent 是一個采集監控名額的守護程序
  • 适用于 Windows 和類 Unix 系統
  • 豐富的開箱即用功能
    • 原生即支援采集大量的作業系統級别的監控名額,例如記憶體/CPU/存儲/檔案系統資訊等
    • 提供原生的日志監控功能
    • 可擴充
  • 選擇 Zabbix server 和 Zabbix agent 的通信方向
    • 通過主動檢查将監控名額及資料推送到 Zabbix server 端
    • 通過被動式讓 Zabbix server 輪詢檢查 agent
  • 控制資料采集間隔
    • 支援靈活和排程兩種自定義時間間隔。
    • 例如,你可以設定在特定時間或僅在工作時間采集某些名額

為什麼選擇 Zabbix agent 2?

既然 Zabbix agent 功能已經如此強大,為什麼我們還要考慮使用 Zabbix agent2 ?

Zabbix Agent 2 的主要目标是更加靈活便捷地擴充 agent 的名額采集功能。無論對于新的原生 Zabbix agent 2 名額的内部開發還是我們社群完成的自定義 Zabbix agent 2 插件開發都是如此。我們通過在 GO 中開發 Zabbix agent 2 來實作這一目标。GO 語言讓我們實作更少的代碼、更多的靈活性和更子產品化的方法成為可能。

除了上述次元的改進之外,Zabbix agent 2 還能幫助我們解決許多正在進行的設計問題。例如:

  • 主動監控項支援并發檢查(而在 agent 中,一次隻能采集一個主動檢查名額)
  • 支援 agent 端的資料存儲持久化
  • 減少 Zabbix agent 2 和 Zabbix server 之間的 TCP 連接配接數
  • Windows 上的 HTTPS web 檢查實作開箱即用
  • 并發性支援提供了并行讀取多個日志檔案的功能
  • 其他針對許多不同應用的開箱即用的監控方案

接下來我們一起探索 Zabbix agent 2 開箱即用可以監控的比較流行的系統:

證書監控

開箱即用的證書監控功能可以說是使用者期待已久的。最常見的需求之一是監控證書的到期日期。Zabbix agent 2 可以直接使用以下原生監控項:

用于證書監控的監控項:

web.certificate.get[hostname,<port>,<IP>]

此監控項将傳回:

  • X.509 字段
  • 驗證結果"result"字段
  • 指紋"fingerprint"字段

示例:

web.certificate.get[blog.zabbix.com,443]

該監控項傳回如下 json 格式的内容:

{
"x509":{
  "version":3,
  "serial_number":"0f5bd7fa1129ddf854e2745a3e8dc788",
  "signature_algorithm":"ECDSA-SHA256",
  "issuer":"CN=Cloudflare Inc ECC CA-3,O=Cloudflare\\, Inc.,C=US",
  "not_before":{
    "value":"Jun 08 00:00:00 2021 GMT",
    "timestamp":1623110400
    },
  "not_after":{
    "value":"Jun 07 23:59:59 2022 GMT",
    "timestamp":1654646399
    },
  "subject":"CN=zabbix.com,O=Cloudflare\\, Inc.,L=San Francisco,ST=California,C=US",
  "public_key_algorithm":"ECDSA",
  "alternative_names":[
    "*.zabbix.com","zabbix.com"
    ]
},
"result":{
  "value":"valid",
  "message":"certificate verified successfully"
  },
"sha1_fingerprint":"e759419726b0599484d75977b5e0c8f6a4fa6728",
"sha256_fingerprint":"0ffeef9b263219decf7db55c32ba65cd59bfe72b83841aa6fb720c830281fe71"
}
           

此監控項将批量收集多個證書名額。然後我們可以通過使用 Zabbix 依賴監控項 來擷取必要的資訊。您可以從 git 頁面 檢視并下載下傳最新的官方模闆。模闆已經包含必要的 主/依賴 監控項,隻需要導入模闆并将其應用到主機即可。

最終得到如下監控資料:

給你加個buff: Zabbix 6.0 Agent 2

物聯網監控 – MQTT

Zabbix agent 2 通過 MQTT 和 Modbus 監控項實作了開箱即用的物聯網監控。

以下示例展示 mqtt.get 監控項如何擷取特定的 MQTT 單元:

mqtt.get["tcp://host:1883","path/to/topic"]

mqtt.get["tcp://host:1883","path/to/#"]

Zabbix agent 2 對 Raspberry Pi 裝置的支援也使得物聯網監控更加友善。我們可以簡單地将 Zabbix agent 2 部署在靠近我們監控的物聯網裝置的 Raspberry Pi 裝置上。

開箱即用的資料庫監控

對于 agent,我們不得不借助使用者自定義方式例如 UserParameters、外部腳本或其他一些自定義方法進行資料庫監控。而通過 agent 2,我們為大量 SQL 和 NoSQL 資料庫引擎提供本地資料庫監控。

給你加個buff: Zabbix 6.0 Agent 2

可以在 git 頁面 找到完整的官方的 Zabbix 資料庫監控模闆。

系統監控

另一個期待已久的功能是本機 systemd 監控。Zabbix agent 2 提供了一組靈活的監控項和自動發現規則,您可以使用它們監控特定的 systemd 單元屬性,以自動發現方式發現 systemd 服務并批量檢索所有 systemd 單元屬性。

發現 systemd 單元清單及其詳細資訊:

systemd.unit.discovery[<type>]

傳回如下 json 格式的内容:

給你加個buff: Zabbix 6.0 Agent 2

檢索 systemd 單元的所有屬性:

systemd.unit.get[unit name,<interface>]

帶入任意一個 systemd 單元名進行測試傳回如下 json:

給你加個buff: Zabbix 6.0 Agent 2

檢索有關 systemd 單元的特定屬性的資訊:

systemd.unit.info[unit name,<property>,<interface>]

帶入任意一個 systemd 單元名進行測試傳回如下資訊:

給你加個buff: Zabbix 6.0 Agent 2

然後可以使用這些監控項來定義觸發器,例如:

  • 如果服務設定了系統開機自啟但沒有運作,則産生問題
  • 如果服務沒有被設定系統開機自啟但現在正在運作,請通知我們忘記啟用該服務
  • 其他情況

您可以在我們的 git 頁面 上找到有關官方 systemd 模闆的更多資訊。

Docker 監控

與之前的模闆一樣,Zabbix agent 2 docker 監控還提供了用于容器自動發現的單個名額和發現規則的監控項:

  • 自動發現所有容器或正在運作的容器
  • 對于每個容器提供以下監控
    • CPU
    • Memory
    • Network

可以在官方 git 頁面 上擷取有關 Docker 模闆的更多資訊。

應用官方模闆擷取到的預設監控項示例:

給你加個buff: Zabbix 6.0 Agent 2
給你加個buff: Zabbix 6.0 Agent 2

Zabbix agent 2 支援的其他應用

以上還遠遠不是全部!Zabbix agent 2 同時也為其他許多系統提供開箱即用的監控,例如:

  • Ceph —— 開源軟體存儲平台
  • Memcached —— 一個通用的分布式記憶體緩存系統
  • Smart —— 自監控、分析和報告技術

完整的 Zabbix 官方模闆可以在 git 頁面 上找到。

agent 2 插件

Zabbix agent 2 的底層結構基于 GO 插件。這種方法用于官方 Zabbix agent 2 監控項,并應用于開發自定義社群擴充。

給你加個buff: Zabbix 6.0 Agent 2

啟動時,Zabbix agent 2 掃描特定目錄,并确定每個插件支援的接口。接下來,Zabbix 将驗證現有的插件配置,并在上述目錄中注冊每個插件。現在我們可以開始監控工作流程了。一旦請求了一個名額,Zabbix agent 2 将檢查負責收集特定名額的插件目前是否處于活動狀态。如果它處于非活動狀态 —— agent 2 将檢查特定插件是否支援 Runner 接口并嘗試啟動它。接下來,agent 2 将檢查 Configurator 接口是否可用并執行插件配置。最後,一旦插件處于活動狀态,agent 2 将使用 Exporter 接口收集名額。下次請求該名額時 —— 插件将處于活動狀态,agent 2 可以立即從 Exporter 接口請求監控名額資料。

但是有沒有一種情況下,插件可以保持不活動狀态?也就是說如果插件處在非活動狀态,一段時間後它會被解除安裝嗎?該插件不會無限期地加載到記憶體中。如果一個插件已經 24 小時沒有收到請求,插件将被停用,并從記憶體中解除安裝。

可加載插件

我們來總結一下 Zabbix agent 2 插件的邏輯:

  • 外部插件可在 Zabbix agent 2 啟動時加載,無需重新編譯 Zabbix agent 2
  • 在 Linux 上使用 Unix 套接字,在 Windows 上使用命名管道,雙向連接配接插件
  • 向後相容舊插件
  • 如果出現以下情況,插件将被停用:
    • 24 小時内沒有使用任何相關的被動項目密鑰
    • 主動類型監控項不在主動檢查清單中
  • 自定義插件架構與内部插件相同
  • 有專用于社群插件和內建的獨立存儲庫

agent 2 支援的平台

此時,你可能想知道相容性如何?我可以使用 Zabbix agent 2 代替 Zabbix agent 嗎?可以在同一個平台上使用嗎?我們來看一下可以部署 Zabbix agent 2 的平台:

  • RHEL/CentOS 6、7、8
  • SLES 15 SP1+
  • Debian 9、10、11,Ubuntu 18.04、20.04
  • 樹莓派作業系統,Ubuntu ARM64
  • Windows 7 及更高版本、Windows Server 2008R2 及更高版本

如果你想在不受官方支援的系統上部署 agent 2,要點是系統需要支援 GO 環境。這意味着要運作 Zabbix agent 2,您必須為 GO 語言支援提供一組依賴。這樣就可以編譯安裝 Zabbix agent 2。

新增的 agent 監控項鍵值

最後,介紹一些 Zabbix 6.0 LTS 中的新 Zabbix agent 監控項。因為 agent 仍為官方支援,是以 Zabbix agent 和 Zabbix agent 2 都将支援這些監控項。

agent variant

agent.hostmetadata

  • 從 agent 的配置檔案中擷取 HostMetadata 或者 HostMetadataItem 參數的值,如果沒有做配置則傳回空值
給你加個buff: Zabbix 6.0 Agent 2

agent.variant

  • Zabbix agent —— 傳回 1
  • Zabbix agent 2 —— 傳回 2
給你加個buff: Zabbix 6.0 Agent 2

檔案屬性

  • vfs.file.permissions – 傳回代表檔案 Unix 權限的 4 位字元串
  • vfs.file.owner – 傳回檔案的使用者所有者(可以調整選項來選擇傳回屬主、屬組或是 UID、GId 或 Windows 的 SID)
  • vfs.file.get – 傳回有關檔案的資訊。類似于 stat 指令結果
  • vfs.dir.get - 擷取有關目錄和檔案的資訊
  • vfs.file.cksum – 檔案校驗和,通過 UNIX cksum 算法計算。對于 crc32(預設值)傳回整數,對于 md5, sha256 傳回字元串。目前使用 md5 和 sha256
  • vfs.file.size - 測量檔案大小位元組或檔案中的行

Windows 的 vfs.dir.get

下面是一個适用于大多數 .get 監控項鍵值說明的示例。在這裡,我們可以看到有關 JSON 數組中目錄内容的批量資訊。然後可以在低級自動發現中使用它來自動監控 vfs.dir.get 監控項獲得的每個實體的參數。下面是在 Windows 上執行的 vfs.dir.get 鍵值的輸出示例。請注意,這隻是部分輸出,真正的 JSON 檔案很可能包含與目錄中發現的每個檔案相關的多個此類元素。

[{
  "basename": "input.json",
  "pathname": "c:\\app1\\temp\\input.json",
  "dirname": "c:\\app1\\temp",
  "type": "file",
  "user": "AKADIKIS-840-G2\\aigars",
  "SID": "S-1-5-21-341453538-698488186-381249278-1001",
  "size": 2506752,
  "time": {
    "access": "2021-11-03T09:19:42.5662347+02:00",
    "modify": "2020-12-21T16:00:46+02:00",
    "change": "2020-12-29T12:20:10.0104822+02:00"
  },
  "timestamp": {
    "access": 1635923982,
    "modify": 1608559246,
    "change": 1609237210
  }
}]
           

Linux 的 vfs.file.get

我們可以看到, vfs.file.get 的輸出也和前面的 get 請求非常相似。正如我之前提到的,這裡的資訊類似于 stat 指令提供的資訊。

{
  "basename": "passwd",
  "pathname": "/etc/passwd",
  "dirname": "/etc",
  "type": "file",
  "user": "root",
  "group": "root",
  "permissions": "0644",
  "uid": 0,
  "gid": 0,
  "size": 3348,
  "time": {
    "access": "2021-11-03T09:27:21+0200",
    "modify": "2021-10-24T13:18:18+0300",
    "change": "2021-10-24T13:18:18+0300"
},
"timestamp": {
    "access": 1635924441,
    "modify": 1635070698,
    "change": 1635070698
  }
}
           

自動發現鍵值的更多元度

Zabbix 6.0 LTS 中一些現有監控項鍵值的功能也得到了改進。例如,對于 vfs.fs.discovery 和 vfs.fs.get,新版本 Zabbix 将收集檔案系統标簽作為 {#FSLABEL} 宏的值。

vfs.fs.discovery

  • 将檢索一個附加标簽值 – {#FSLABEL}

vfs.fs.get

[{
  "{#FSNAME}": "C:",
  "{#FSTYPE}": "NTFS",
  "{#FSLABEL}": "System",
  "{#FSDRIVETYPE}": "fixed"
}]
           

Q&A

Q:可以同時運作 Zabbix Agent 和 Zabbix Agent 2 嗎?

A:兩個 agent 可以同時在一台機器上運作。但是需要調整其中一個 agent 的監聽端口,因為預設情況下,它們都将嘗試監聽 10050。是以,我們需要将其中一個 agent 切換為其他端口。也可以簡單地禁用其中一個 agent 的被動檢查功能,使之不會監聽傳入的連接配接。

Q:沒有管理者權限可以運作 Zabbix agent 嗎?

A:當然。可以使用 Windows 和 Linux 的任何使用者運作 agent。隻需確定使用者有權通路 Zabbix agent 需要監控的資訊(例如日志、檔案、檔案夾等)。

Q:有沒有 Zabbix agent 優于 Zabbix agent 2 的範例?

A:首先,Zabbix agent 的二進制檔案更輕,這是一個優勢;另外,Zabbix agent 2 依賴複雜的 GO 語言環境,如果不能為 Zabbix agent 2 提供必要的 GO 依賴項,那麼選擇 Zabbix agent 自然更合适;此外,如果使用某種自動化或編排工具來部署 Zabbix agent,使用相同類型的 agent 實作起來更加容易。

繼續閱讀