给你加个buff: Zabbix 6.0 Agent 2 !

2022-04-07 14:24:20 浏览数 (1)

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 格式的内容:

代码语言:javascript复制
{
"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 页面 查看并下载最新的官方模板。模板已经包含必要的 主/依赖 监控项,只需要导入模板并将其应用到主机即可。

最终得到如下监控数据:

物联网监控 – 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 数据库引擎提供本地数据库监控。

可以在 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 模板的更多信息。

Docker 监控

与之前的模板一样,Zabbix agent 2 docker 监控还提供了用于容器自动发现的单个指标和发现规则的监控项:

  • 自动发现所有容器或正在运行的容器
  • 对于每个容器提供以下监控
    • CPU
    • Memory
    • Network

可以在官方 git 页面 上获取有关 Docker 模板的更多信息。

应用官方模板获取到的默认监控项示例:

Zabbix agent 2 支持的其他应用

以上还远远不是全部!Zabbix agent 2 同时也为其他许多系统提供开箱即用的监控,例如:

  • Ceph —— 开源软件存储平台
  • Memcached —— 一个通用的分布式内存缓存系统
  • Smart —— 自监控、分析和报告技术

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

agent 2 插件

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 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 参数的值,如果没有做配置则返回空值

agent.variant

  • Zabbix agent —— 返回 1
  • Zabbix agent 2 —— 返回 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 文件很可能包含与目录中发现的每个文件相关的多个此类元素。

代码语言:javascript复制
[{
  "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 命令提供的信息。

代码语言:javascript复制
{
  "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

  • 将检索一个附加标签值 – {#FSLABEL}
代码语言:javascript复制
[{
  "{#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 实现起来更加容易。

0 人点赞