Направите додатак (водич)

Ово је водич корак по корак за креирање једноставног додатка који се може учитати за Zabbix agent 2.

Слободно користите наш example repository као шаблон или водич за креирање сопствених додатака.

Шта ћете створити

Током овог упутства, додаћете нови додатак који се може учитати MyIP. Додатак ће имплементирати 1 метрику под називом myip, који враћа екстерну IP адресу домаћина на коме је покренут Zabbix agent 2.

Део 1: Писање Go кода

У овом одељку ћете научити како да напишете додатак који додаје нову метрику агенту Zabbix 2.

  1. Креирајте нови директоријум myip у /usr/local/zabbix/go/plugins/.

  2. Креирајте датотеку main.go унутар myip директоријума и дефинишите име вашег Go пакета.

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

package main

Држите датотеку отворену да бисте додали још редова као што је описано у следећим корацима.

  1. Наведите пакете за увоз.

/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. Дефинишите структуру додатка. Уградите структуру plugin.Base да бисте добили приступ стандардној функционалности додатка.

/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. Имплементирајте интерфејс додатака Export. Интерфејс за извоз обавља анкету и враћа вредност.

/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. Додајте логовање. Лог поруке ће се појавити у лог датотеци Zabbix agent 2. Можете користити једну од функција за логовање које су доступне за додатке: 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. Имплементирајте основну логику додатка. Ова логика преузима одговор са наведене URL адресе и чита га, затим враћа IP адресу као одговор и затвара захтев. У случају грешке приликом извршавања GET захтева или читања одговора, грешка се враћа уместо тога.

/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. Региструјте метрику. Zabbix agent 2 покреће функцију init() након покретања. Ова функција ће позвати метод plugin.RegisterMetrics(структура, име додатка, назив метрике, опис) да би добила податке додатка.

Опис параметра методе plugin.RegisterMetrics:

-структуре- показивач на имплементацију додатка; омогућава приступ структури додатка, укључујући листу доступних интерфејса додатка (на пример, &impl). -име- назив додатка; мора бити јединствен (на пример, "Myip"). -назив метрике- назив метрике (на пример, "myip"). Ово је кључ ставке који се користи за прикупљање података из додатка. -опис- опис метрике; мора почети великим словом и завршити тачком (на пример, "Враћа спољну IP адресу домаћина на коме агент ради.").

Да бисте регистровали више метрика, поновите параметре назив метрике и опис за сваку метрику. На пример: 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. Дефинишите функцију main(), која ће креирати нову инстанцу управљача додатка, доделити је за коришћење при логовању од стране додатка, а затим извршити управљача додатка.

Дефинисање функције main() је обавезно.

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

Део 2: Израда додатка

У овом одељку ћете научити како да компајлирате додатак.

  1. Да бисте креирали Go датотеке за руковање зависностима и преузели зависности, аутоматски извршите ову bash скрипту из командне линије.
go mod init myip
       GOPROXY=direct go get git.zabbix.com/ap/plugin-support/plugin@branchname
       go mod tidy
       go build

Уверите се да сте навели исправно име гране, тј. замените branchname (погледајте 2. ред) са једним од следећих:

  • relase/* - за грану стабилног издања, где је "*" верзија издања (тј. 7.0)
  • master - за главну грану
  • <commit hash> - за специфичну верзију комита (користите специфичан хаш комит )

Излаз би требао бити сличан овоме:

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. Креирајте извршну датотеку myip за додатак који се може учитати.

  2. Наведите путању до конфигурационе датотеке додатка у параметру Plugins.Myip.System.Path конфигурационе датотеке Zabbix агента 2.

Име додатка у имену конфигурационог параметра (Myip у овом водичу) мора да одговара имену додатка дефинисаном у функцији plugin.RegisterMetrics().

echo 'Plugins.Myip.System.Path=/usr/local/zabbix/go/plugins/myip/myip' > /etc/zabbix_agent2.d/plugins.d/myip.conf
  1. Тестирајте метрику:
zabbix_agent2 -t myip

Одговор треба да садржи екстерну IP адресу вашег домаћина.

У случају грешке, проверите да ли корисник zabbix има дозволе за приступ /usr/local/zabbix/go/plugins/myip директоријуму.