Zabbix agent 2 的开发旨在为用户提供更多附加功能 —— 从支持的采集指标的增加到指标采集逻辑的改进和简化的自定义监控插件的开发。那么在 Zabbix 6.0 LTS 版本中 Zabbix Agent 2 将实现哪些功能?
首先,我们来谈谈 Zabbix agent 的主要功能以及它如何使监控更加灵活:
既然 Zabbix agent 功能已经如此强大,为什么我们还要考虑使用 Zabbix agent2 ?
Zabbix Agent 2 的主要目标是更加灵活便捷地扩展 agent 的指标采集功能。无论对于新的原生 Zabbix agent 2 指标的内部开发还是我们社区完成的自定义 Zabbix agent 2 插件开发都是如此。我们通过在 GO 中开发 Zabbix agent 2 来实现这一目标。GO 语言让我们实现更少的代码、更多的灵活性和更模块化的方法成为可能。
除了上述维度的改进之外,Zabbix agent 2 还能帮助我们解决许多正在进行的设计问题。例如:
接下来我们一起探索 Zabbix agent 2 开箱即用可以监控的比较流行的系统:
开箱即用的证书监控功能可以说是用户期待已久的。最常见的需求之一是监控证书的到期日期。Zabbix agent 2 可以直接使用以下原生监控项:
用于证书监控的监控项:
web.certificate.get[hostname,<port>,<IP>]
此监控项将返回:
示例:
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 页面 查看并下载最新的官方模板。模板已经包含必要的 主/依赖 监控项,只需要导入模板并将其应用到主机即可。
最终得到如下监控数据:
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 数据库引擎提供本地数据库监控。
可以在 git 页面 找到完整的官方的 Zabbix 数据库监控模板。
另一个期待已久的功能是本机 systemd 监控。Zabbix agent 2 提供了一组灵活的监控项和自动发现规则,您可以使用它们监控特定的 systemd 单元属性,以自动发现方式发现 systemd 服务并批量检索所有 systemd 单元属性。
发现 systemd 单元列表及其详细信息:
systemd.unit.discovery[<type>]
返回如下 json 格式的内容:
检索 systemd 单元的所有属性:
systemd.unit.get[unit name,<interface>]
带入任意一个 systemd 单元名进行测试返回如下 json:
检索有关 systemd 单元的特定属性的信息:
systemd.unit.info[unit name,<property>,<interface>]
带入任意一个 systemd 单元名进行测试返回如下信息:
然后可以使用这些监控项来定义触发器,例如:
您可以在我们的 git 页面 上找到有关官方 systemd 模板的更多信息。
与之前的模板一样,Zabbix agent 2 docker 监控还提供了用于容器自动发现的单个指标和发现规则的监控项:
可以在官方 git 页面 上获取有关 Docker 模板的更多信息。
应用官方模板获取到的默认监控项示例:
以上还远远不是全部!Zabbix agent 2 同时也为其他许多系统提供开箱即用的监控,例如:
完整的 Zabbix 官方模板可以在 git 页面 上找到。
Zabbix agent 2 的底层结构基于 GO 插件。这种方法用于官方 Zabbix 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 吗?可以在同一个平台上使用吗?我们来看一下可以部署 Zabbix agent 2 的平台:
如果你想在不受官方支持的系统上部署 agent 2,要点是系统需要支持 GO 环境。这意味着要运行 Zabbix agent 2,您必须为 GO 语言支持提供一组依赖。这样就可以编译安装 Zabbix agent 2。
最后,介绍一些 Zabbix 6.0 LTS 中的新 Zabbix agent 监控项。因为 agent 仍为官方支持,所以 Zabbix agent 和 Zabbix agent 2 都将支持这些监控项。
agent.hostmetadata
agent.variant
下面是一个适用于大多数 .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
}
}]
我们可以看到, 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
vfs.fs.get
[{
"{#FSNAME}": "C:",
"{#FSTYPE}": "NTFS",
"{#FSLABEL}": "System",
"{#FSDRIVETYPE}": "fixed"
}]
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 实现起来更加容易。