Este es un tutorial paso a paso para crear un complemento cargable simple para el agente 2 Áú»¢¶Ä²©.
No dude en utilizar nuestro como plantilla o gu¨ªa para crear sus propios complementos.
Durante este tutorial agregar¨¢s un nuevo complemento cargable MyIP. El complemento implementar¨¢ 1 m¨¦trica llamada myip que devuelve la direcci¨®n IP externa del host donde se ejecuta el agente Áú»¢¶Ä²© 2.
En esta secci¨®n aprender¨¢ c¨®mo escribir el complemento que agrega una nueva m¨¦trica al agente Áú»¢¶Ä²© 2.
Cree un nuevo directorio myip en /usr/local/zabbix/go/plugins/.
Cree el archivo main.go dentro del directorio myip y defina el nombre de su paquete Go.
/usr/local/zabbix/go/plugins/myip/main.go
Mantenga el archivo abierto para agregar m¨¢s l¨ªneas como se describe en los siguientes pasos.
/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
}
La descripci¨®n del par¨¢metro del m¨¦todo plugin.RegisterMetrics:
Para registrar varias m¨¦tricas, repita los par¨¢metros metric name y description para cada m¨¦trica. Por ejemplo: plugin.RegisterMetrics(&impl, "Myip", "metric.one", "Descripci¨®n de m¨¦trica uno.", "metric.two", "Descripci¨®n de m¨¦trica dos.")
/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.")
}
Definir la funci¨®n main() es obligatorio.
/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()))
}
}
En esta secci¨®n aprender¨¢ c¨®mo compilar el complemento.
go mod init myip
GOPROXY=direct go get git.zabbix.com/ap/plugin-support/plugin@branchname
go mod tidy
go build
´¡²õ±ð²µ¨²°ù±ð²õ±ð de especificar el nombre correcto de la rama, es decir, reemplace branchname
(ver L¨ªnea 2) con uno de los siguientes nombres:
release/*
- para la rama de lanzamiento estable, donde "*" es la versi¨®n de lanzamiento (es decir, 7.0
)master
- para la rama master<commit hash>
- para la versi¨®n de "commit" espec¨ªfica (use el hash de "commit" espec¨ªfico)El resultado deber¨ªa ser similar a este:
go: creating new go.mod: module myip
go: to add module requirements and sums:
go mod tidy
go: finding module for package git.zabbix.com/ap/plugin-support/plugin/container
go: finding module for package git.zabbix.com/ap/plugin-support/plugin
go: found git.zabbix.com/ap/plugin-support/plugin in git.zabbix.com/ap/plugin-support v0.0.0-20220608100211-35b8bffd7ad0
go: found git.zabbix.com/ap/plugin-support/plugin/container in git.zabbix.com/ap/plugin-support v0.0.0-20220608100211-35b8bffd7ad0
Cree un ejecutable myip para el complemento cargable.
Especifique la ruta al archivo de configuraci¨®n del complemento en el par¨¢metro Plugins.Myip.System.Path del archivo de configuraci¨®n del agente 2 de Áú»¢¶Ä²©.
El nombre del complemento en el nombre del par¨¢metro de configuraci¨®n (Myip en este tutorial) debe coincidir con el nombre del complemento definido en la funci¨®n plugin.RegisterMetrics().
echo 'Plugins.Myip.System.Path=/usr/local/zabbix/go/plugins/myip/myip' > /etc/zabbix_agent2.d/plugins.d/myip.conf
La respuesta debe contener una direcci¨®n IP externa de su equipo.
En caso de error, verifique si el usuario zabbix tiene permisos para acceder al directorio /usr/local/zabbix/go/plugins/myip.