1. Agent2 的插件种类
Agent2支持两种插件,一种是内置插件(Built-in plugins),一种是可加载插件(loadable plugins)。
内置插件是和Agent2的源代码放在一起的,编译时就一起编译出来了。 在/etc/zabbix/zabbix_agent2.d/plugins.d/ 下面放着所有插件的配置文件,可以看到当前系统都有哪些插件。
那么它的问题就是每次写新的插件或对既存插件做修改后,都需要重新编译整个Agent2。
相对的,可加载模块是ZBX6之后才支持的。它可以单独编译,兼顾了效率和灵活性。
可加载模块可以/必须实现 Exporter (except the ContextProvider parameter)、Runner、Configurator 这三种接口其中之一,不支持Watcher和Collector接口。
默认情况下,这两种插件都是不活动的,只有当被监控的插件提供指标时才会激活。
关于内置插件,ZBX的官方博客、还有网上的一些文章说的都比较清楚了( 比如源代码里提供了两个例子:Zabbix Agent 2 Plugins project overview - ZABBIX GIT)。本文主要对可加载模块做一下说明,抛砖引玉。
2. 开发一个可加载模块
代码是用Go写的、编译的,所以以下过程需要有最基础的go相关知识。
下面要创建一个简单的可加载插件 Myip,它的作用就是返回第一个参数的内容。
比如执行 zabbix_ange2 -t myip[a,b],就会返回a。
[root@localhost plugins.d]# zabbix_agent2 -t myip[a,b]
myip[a,b] [s|a]
2.1 以下是完整的go代码。
package main
import (
"fmt"
"git.zabbix.com/ap/plugin-support/plugin/container"
"git.zabbix.com/ap/plugin-support/plugin"
)
// 嵌入plugin.Base结构以获得对标准插件功能的访问
type Plugin struct {
plugin.Base
}
var impl Plugin
// 实现插件接口Export,该接口执行一个轮询并返回一个值
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error){
// 这里写主逻辑
return params[1], nil // 返回第一个参数
}
// 注册metric
// agent2在启动时运行init(),该函数将调用plugin.RegisterMetrics(structure, plugin name, metric name, description)方法来获取插件的数据
// structure - 一个指向插件实现的指针;授予对插件结构的访问权,包括可用的插件接口的列表
// name - 插件名称;必须是唯一的
// metric name - metric名称。这是用于从插件中收集数据的项目键
// description - metric描述;必须以大写字母开始,以句号结束
func init() {
plugin.RegisterMetrics(&impl, "Myip", "myip", "Return the external IP address of the host where agent is running.")
}
// 定义main()函数,它将实现Zabbix插件处理程序,以创建和启动该插件
func main() {
h, err := container.NewHandler(impl.Name())
if err != nil {
panic(fmt.Sprintf("failed to create plugin handler %s", err.Error()))
}
impl.Logger = &h
err = h.Execute()
if err != nil {
panic(fmt.Sprintf("failed to execute plugin handler %s", err.Error()))
}
}
2.2 编译代码
编译后会在同路径下生成一个 myip 的二进制文件。
go mod init myip
GOPROXY=direct // 解决外部依赖
go mod tidy
go build // 编译
2.3 配置插件
echo 'Plugins.Myip.System.Path=/usr/local/zabbix/go/plugins/myip/myip' > /etc/zabbix_agent2.d/plugins.d/myip.conf
# /usr/local/zabbix/go/plugins/myip/myip 是编译好的二进制文件
2.4 重启agent2,让插件生效
systemctl restart zabbix-agent2
zabbix_agent2 -t myip[a,b] # 测试
这里只是实现了一个最简单的插件,甚至连参数校验都没有。所以这个例子中,参数写几个都不会报错。
2.5 ZBX监控项的配置
item key 就是 myip[a,b],其它的和普通item 一样配置就好。
参考链接:
Zabbix Agent 2 Plugins project overview - ZABBIX GIT
1696





