Este é um tutorial passo a passo para criar um plug-in carregável simples para o Zabbix agent 2.
Durante este tutorial, você adicionará um novo plug-in carregável MyIP. O plug-in implementará uma métrica chamada myip, que retorna o endereço IP externo do host em que o Zabbix Agent 2 está sendo executado.
Nesta seção, você aprenderá a escrever o plug-in que adiciona uma nova métrica ao Zabbix Agent 2.
Crie um novo diretório myip em /usr/local/zabbix/go/plugins/.
Crie o arquivo main.go dentro do diretório myip e defina o nome do seu pacote Go.
/usr/local/zabbix/go/plugins/myip/main.go
Mantenha o arquivo aberto para adicionar mais linhas, conforme descrito nas próximas etapas.
/usr/local/zabbix/go/plugins/myip/main.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"git.zabbix.com/ap/plugin-support/plugin/container"
"git.zabbix.com/ap/plugin-support/plugin"
)
/usr/local/zabbix/go/plugins/myip/main.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"git.zabbix.com/ap/plugin-support/plugin/container"
"git.zabbix.com/ap/plugin-support/plugin"
)
type Plugin struct {
plugin.Base
}
var impl Plugin
/usr/local/zabbix/go/plugins/myip/main.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"git.zabbix.com/ap/plugin-support/plugin/container"
"git.zabbix.com/ap/plugin-support/plugin"
)
type Plugin struct {
plugin.Base
}
var impl Plugin
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error)
/usr/local/zabbix/go/plugins/myip/main.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"git.zabbix.com/ap/plugin-support/plugin/container"
"git.zabbix.com/ap/plugin-support/plugin"
)
type Plugin struct {
plugin.Base
}
var impl Plugin
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error){
p.Infof("received request to handle %s key with %d parameters", key, len(params))
}
/usr/local/zabbix/go/plugins/myip/main.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"git.zabbix.com/ap/plugin-support/plugin/container"
"git.zabbix.com/ap/plugin-support/plugin"
)
type Plugin struct {
plugin.Base
}
var impl Plugin
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error){
p.Infof("received request to handle %s key with %d parameters", key, len(params))
resp, err := http.Get("https://api.ipify.org")
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return string(body), nil
}
A descrição do parâmetro do método plugin.RegisterMetrics:
Para registrar várias métricas, repita os parâmetros nome da métrica e descrição para cada métrica.
Por exemplo: plugin.RegisterMetrics(&impl, "Myip", "metric.one", "Metric one description.", "metric.two", "Metric two description.")
/usr/local/zabbix/go/plugins/myip/main.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"git.zabbix.com/ap/plugin-support/plugin/container"
"git.zabbix.com/ap/plugin-support/plugin"
)
type Plugin struct {
plugin.Base
}
var impl Plugin
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error){
p.Infof("received request to handle %s key with %d parameters", key, len(params))
resp, err := http.Get("https://api.ipify.org")
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return string(body), nil
}
func init() {
plugin.RegisterMetrics(&impl, "Myip", "myip", "Return the external IP address of the host where agent is running.")
}
A definição da função main() é obrigatória.
/usr/local/zabbix/go/plugins/myip/main.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"git.zabbix.com/ap/plugin-support/plugin/container"
"git.zabbix.com/ap/plugin-support/plugin"
)
type Plugin struct {
plugin.Base
}
var impl Plugin
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error){
p.Infof("received request to handle %s key with %d parameters", key, len(params))
resp, err := http.Get("https://api.ipify.org")
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return string(body), nil
}
func init() {
plugin.RegisterMetrics(&impl, "Myip", "myip", "Return the external IP address of the host where agent is running.")
}
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()))
}
}
Nesta seção, você aprenderá a compilar o plug-in.
go mod init myip
GOPROXY=direct go get git.zabbix.com/ap/plugin-support/plugin@branchname
go mod tidy
go build
Certifique-se de especificar o nome correto da ramificação, ou seja, substitua branchname
(consulte a linha 2) por um dos seguintes:
release/*
- para a ramificação de lançamento estável, em que "*" é a versão de lançamento (ou seja, 6.4
)master
- para a ramificação master<commit hash>
- para a versão específica do commit (use o hash específico do commit)A saída deve ser semelhante a esta:
go: criando um novo go.mod: módulo myip
go: para adicionar requisitos e somas ao módulo:
go mod tidy
go: encontrando módulo para o pacote git.zabbix.com/ap/plugin-support/plugin/container
go: encontrando módulo para o pacote git.zabbix.com/ap/plugin-support/plugin
go: encontrado git.zabbix.com/ap/plugin-support/plugin em git.zabbix.com/ap/plugin-support v0.0.0-20220608100211-35b8bffd7ad0
go: encontrado git.zabbix.com/ap/plugin-support/plugin/container em git.zabbix.com/ap/plugin-support v0.0.0-20220608100211-35b8bffd7ad0
Crie um executável myip para o plug-in carregável.
Especifique o caminho para o arquivo de configuração do plug-in no parâmetro Plugins.Myip.System.Path do arquivo de configuração do Zabbix Agent 2.
O nome do plug-in no nome do parâmetro de configuração (Myip neste tutorial) deve corresponder ao nome do plug-in definido na função plugin.RegisterMetrics().
echo 'Plugins.Myip.System.Path=/usr/local/zabbix/go/plugins/myip/myip' > /etc/zabbix_agent2.d/plugins.d/myip.conf
A resposta deve conter um endereço IP externo de seu host.
Em caso de erro, verifique se o usuário zabbix tem permissões para acessar o diretório /usr/local/zabbix/go/plugins/myip.