This is a translation of the original English documentation page. Help us make it better.

Maak een plug-in (handleiding)

Dit is een handleiding die eenvoudig en stapsgewijs uitlegt hoe je een plug-in maakt voor de Zabbix agent 2.

Wat je gaat maken

Tijdens deze handleiding voegt u een nieuwe plug-in MyIP toe. De plug-in implementeert 1 statistiek genaamd myip, die het externe IP-adres retourneert van de host waarop Zabbix agent 2 draait.

Deel 1: Schrijven van de Go code

In dit gedeelte leer je hoe je een plugin schrijft die een nieuwe metric toevoegt aan Zabbix agent 2.

  1. Maak een nieuwe folder myip in /usr/local/zabbix/go/plugins/.

  2. Maak een file main.go in de myip folder en definieer de van de Go package.

/usr/local/zabbix/go/plugins/myip/main.go

package main

Houd de file open zodat de regels zoals beschreven in de volgende stappen van deze handleiding kunnen worden toegevoegd.

  1. Geef de pakketten op om te importeren.
    Dit zijn de pakketten die de plugin ondersteunen.

/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. De plugin-structuur definiëren.
    Integreer de structuur plugin.Base om toegang te krijgen tot de standaard pluginfunctionaliteit.

/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. Implementeer plugin interface Export.
    De Export interface voert een peiling uit en retourneert een waarde.

/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. Voeg logging toe.
    Logberichten verschijnen in het logboek van Zabbix agent 2. Je kunt een van de logboekfuncties gebruiken die beschikbaar zijn voor 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))
       }
  1. De kernlogica van de plugin implementeren.
    Deze logica haalt het antwoord op van de gespecificeerde URL en leest het, retourneert vervolgens het IP-adres als antwoord en sluit het verzoek.
    In het geval van een fout bij het uitvoeren van het GET verzoek of het lezen van een antwoord, wordt in plaats daarvan de fout geretourneerd.

/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. Registreer de metric.
    Zabbix agent 2 start een init() functie bij het opstarten. Deze functie zal de plugin.RegisterMetrics(structure, plugin name, metric name, description) methode aanroepen om de plugin gegevens te krijgen.

De plugin.RegisterMetrics methode parameter beschrijving:

  • structure - een pointer naar de plugin implementatie; geeft toegang tot de plugin structuur, inclusief lijst van beschikbare plugin interfaces (bijvoorbeeld &impl).
  • name - Naam van de plugin; moet uniek zijn (bijvoorbeeld "Myip").
  • metric name - metric naam (bijvoorbeeld "myip"). Dit is de item sleutel die gebruikt wordt om gegevens van een plugin te verzamelen.
  • description - metric beschrijving; moet beginnen met een hoofdletter en eindigen met een punt (bijvoorbeeld, ""Geef het externe IP-adres van de host waar de agent draait.").

Om meerdere metrieken te registreren, herhaal je de parameters metric name en description voor elke metriek.
Bijvoorbeeld: plugin.RegisterMetrics(&impl, "Myip", "metric.one", "beschrijving metric one.", "metric.two", "beschrijving metric two.")

/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. Definieer de main() functie, die een nieuwe plugin handler instantie aanmaakt, toewijst om gebruikt te worden voor het loggen door de plugin en dan de plugin handler uitvoert.

Het definiëren van de main() functie is verplicht.

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

Deel 2: de plug-in bouwen

In dit gedeelte leert u hoe u de plug-in kunt compileren.

  1. Om Go-bestanden aan te maken voor het afhandelen van afhankelijkheden en de afhankelijkheden automatisch te downloaden, voer je dit bash-script uit vanuit de CLI (zorg ervoor dat je de juiste branchnaam opgeeft in regel 3 go get...).
go mod init myip
       GOPROXY=direct go get git.zabbix.com/ap/plugin-support/plugin@release/6.4
       go mod tidy
       go build

Het resultaat zou er ongeveer zo uit moeten zien:

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. Maak een executable myip voor de laadbare plugin.

  2. Specificeer het pad naar het configuratiebestand van de plug-in in de parameter Plugins.Myip.System.Path van het configuratiebestand van Zabbix agent 2.

De naam van de plugin in de naam van de configuratieparameter (Myip in deze tutorial) moet overeenkomen met de naam van de plugin die is gedefinieerd in de functie plugin.RegisterMetrics().

echo 'Plugins.Myip.System.Path=/usr/local/zabbix/go/plugins/myip/myip' > /etc/zabbix_agent2.d/plugins.d/myip.conf
  1. Test de metric:
zabbix_agent2 -t myip

Het antwoord moet een extern IP-adres van uw host bevatten.

Controleer in het geval van een fout of de gebruiker zabbix toestemming heeft om toegang te krijgen tot de map /usr/local/zabbix/go/plugins/myip.