Aquest ¨¦s un tutorial passa a passa per crear un plugin senzill carregable per a l'agent Áú»¢¶Ä²© 2.
No dubteu pas en emprar el nostre com a plantilla o guia per crear els vostres propis plugins.
Durant aquest tutorial, afegireu un nou connector carregable MyIP. El connector implementar¨¤ una m¨¨trica anomenada myip, que retorna l'adre?a IP externa de l'equip on s'executa l'agent Áú»¢¶Ä²© 2.
En aquesta secci¨® aprendreu a escriure el codi del connector que afegeix una m¨¨trica nova a l'agent Áú»¢¶Ä²© 2.
Creeu un directori nou myip a /usr/local/zabbix/go/plugins/.
Creeu el fitxer main.go dins del directori myip i definiu el nom del vostre paquet Go.
/usr/local/zabbix/go/plugins/myip/main.go
Mantingueu el fitxer obert per afegir m¨¦s l¨ªnies tal com es descriu a les passes seg¨¹ents.
/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))
}
7.Implementeu la l¨°gica del plugin b¨¤sic. Aquesta l¨°gica obt¨¦ la resposta de l'URL especificat i la llegeix, despr¨¦s retorna l'adre?a IP com a resposta i tanca la petici¨®. En cas d'error en executar la consulta GET o llegir una resposta, retorna l'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))
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
}
Descripci¨® del par¨¤metre del m¨¨tode plugin.RegisterMetrics:
Per registrar diverses m¨¨triques, repetiu els par¨¤metres nom de la m¨¨trica i »å±ð²õ³¦°ù¾±±è³¦¾±¨® per a cada m¨¨trica. Per exemple: 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.")
}
?s obligatori definir aquesta funci¨®.
/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 aquesta secci¨® aprendreu a compilar el plugin.
go mod init myip
GOPROXY=direct go get git.zabbix.com/ap/plugin-support/plugin@branchname
go mod tidy
go build
Assegureu-vos d'especificar el nom correcte de la branca; per exemple, substituiu branchname
(veieu la segona l¨ªnia) amb el seg¨¹ent:
release/*
- per la branca estable, on "*" ¨¦s la versi¨® de llen?ament (p.e. 7.0
)master
- per la branca principal<commit hash>
- per una versi¨® espec¨ªfica (empreu el hash de la branca espec¨ªfica)La sortida s'assemblar¨¤ a:
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
Creeu un executable myip per al plugin carregable.
Especifiqueu la ruta del fitxer de configuraci¨® del plugin al par¨¤metre Plugins.Myip.System.Path del fitxer de configuraci¨® de l'agent 2 del Áú»¢¶Ä²©.
El nom del plugin al nom del par¨¤metre de configuraci¨® (Myip en aquest tutorial) ha de coincidir amb el nom del plugin definit a la funci¨® plugin.RegisterMetrics().
echo 'Plugins.Myip.System.Path=/usr/local/zabbix/go/plugins/myip/myip' > /etc/zabbix_agent2.d/plugins.d/myip.conf
La resposta ha de contindre una adre?a IP externa del vostre equip.
En cas d'error, comproveu si l'usuari zabbix t¨¦ permisos per accedir al directori /usr/local/zabbix/go/plugins/myip.