Áú»¢¶Ä²©

Crear un plugin (tutorial)

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.

Qu¨¨ fareu

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.

Part 1: Escrivint el codi Go

En aquesta secci¨® aprendreu a escriure el codi del connector que afegeix una m¨¨trica nova a l'agent Áú»¢¶Ä²© 2.

  1. Creeu un directori nou myip a /usr/local/zabbix/go/plugins/.

  2. 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

package main

Mantingueu el fitxer obert per afegir m¨¦s l¨ªnies tal com es descriu a les passes seg¨¹ents.

  1. Especifiqueu els paquets que voleu importar. Aquests s¨®n els paquets que admeten el connector.

/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"
       )
  1. Definiu l'estructura del plugin. Incorporeu l'estructura plugin.Base per accedir a la funcionalitat est¨¤ndard del 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
  1. Implementaci¨® de la interf¨ªcie Export del plugin. La interf¨ªcie Export fa una enquesta i retorna un valor.

/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)
  1. Afegir registre d'esdeveniments. El registre de missatges apareixer¨¤ al registre de l'agent 2 de Áú»¢¶Ä²© agent. Podeu emprar una de les funcions de registre disponible per als plugins: Critf(), Errf(), Infof(), Warningf(), Debugf(), Tracef().

/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    
       }
  1. Registreu la m¨¨trica. L'agent Áú»¢¶Ä²© 2 inicia l'execuci¨® de la funci¨® init() a l'inici. Aquesta funci¨® cridar¨¤ al m¨¨tode plugin.RegisterMetrics (estructura, nom del plugin, nom de m¨¨trica, »å±ð²õ³¦°ù¾±±è³¦¾±¨®) per obtindre les dades del plugin.

Descripci¨® del par¨¤metre del m¨¨tode plugin.RegisterMetrics:

  • estructura - un punter a la implementaci¨® del plugin; concedeix acc¨¦s a l'estructura del plugin, inclosa la llista d'interf¨ªcies de plugins disponibles (per exemple, &impl).
  • nom - nom del plugin; ha de ser ¨²nic (per exemple, "Myip").
  • nom de la m¨¨trica - nom de la m¨¨trica (per exemple, "myip"). Aquesta ¨¦s la clau d'element que s'empra per recopilar dades d'un plugin.
  • »å±ð²õ³¦°ù¾±±è³¦¾±¨® - »å±ð²õ³¦°ù¾±±è³¦¾±¨® m¨¨trica; ha de comen?ar amb maj¨²scula i acabar amb un punt (per exemple, ""Retorna l'adre?a IP externa de l'equip on s'executa l'agent.").

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.")
              }
  1. Definiu la funci¨® main(), que implementar¨¤ el gestor del plugin Áú»¢¶Ä²© per crear i iniciar el plugin.

?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()))
                  }
              }

Part 2: Muntant el plugin

En aquesta secci¨® aprendreu a compilar el plugin.

  1. Per crear arxius Go per gestionar i descarregar depend¨¨ncies autom¨¤ticament, executeu aquest script de bash des de CLI.
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
  1. Creeu un executable myip per al plugin carregable.

  2. 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
  1. Proveu la m¨¨trica:
zabbix_agent2 -t myip

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.