php-Redakteur Yuzi wird Ihnen heute eine Frage zu Zabbix Agent 2 stellen. Bei einem Benutzer ist beim Versuch, das Test-Plugin gemäß den offiziellen Anweisungen zu handhaben, ein Fehler aufgetreten. Dieses Problem kann die ordnungsgemäße Funktion des Plugins beeinträchtigen. Daher werden wir nach Möglichkeiten suchen, dieses Problem zu beheben. Lass uns einen Blick darauf werfen!
Ich begann, die Möglichkeiten von Zabbix Agent 2 zu erkunden und beschloss, Schritt für Schritt ein Test-Plugin zu erstellen, wie im offiziellen Leitfaden zur Plugin-Erstellung beschrieben.
Nachdem ich alle Schritte abgeschlossen hatte, wollte der Zabbix-Agent nichts tun (außer der Option -h) und gab die folgende Fehlermeldung aus:
zabbix_agent2 [10046]:错误:无法注册插件:无法解析代理版本strconv.atoi:解析“6.0.13”:语法无效
Ich habe das auf Ubuntu 22.04 gemacht.
Zabbix-Agent 2-Version: 6.0.14.
go-Version: go1.18.1 linux/amd64
Ich habe Zabbix Agent 2 nur über apt-get installiert.
Ich habe alles nach Anleitung gemacht:
package main import ( "fmt" "io/ioutil" "net/http" "git.zabbix.com/ap/plugin-support/plugin/container" "git.zabbix.com/ap/plugin-support/plugin" ) // Plugin must define structure and embed plugin.Base structure. type Plugin struct { plugin.Base } // Create a new instance of the defined plugin structure var impl Plugin // Plugin must implement one or several plugin interfaces. func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error) { // You may use one of Critf, Errf, Infof, Warningf, Debugf, Tracef functions for logging. p.Infof("received request to handle %s key with %d parameters", key, len(params)) // Fetch response from the specified URL, it should be just the IP address. resp, err := http.Get("https://api.ipify.org") if err != nil { // Plugin will return an error response if the request failed return nil, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { // Plugin will return an error response if it failed to read the response return nil, err } return string(body), nil } func init() { // Register our metric, specifying the plugin and metric details. // 1 - a pointer to plugin implementation // 2 - plugin name // 3 - metric name (item key) // 4 - metric description // // NB! The metric description must end with a period, otherwise the Zabbix agent 2 will return an error and won't start! // Metric name (item key) and metric description can be repeated in a loop to register additional metrics. plugin.RegisterMetrics(&impl, "Myip", "myip", "Return the external IP address of the host where agent is running.") } // This is the main function, it is required to compile the plugin. // By default the function implements our packages to handle the plugin creation and execution. 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())) } }
/etc/zabbix/zabbix_agent2.d/plugins.d
zabbix_agent2 -t myip
Und ... es funktioniert nicht und gibt einen Fehler wegen der falschen Parsing-Proxy-Version aus.
Ich denke, strconv.atoi
wird im Code von Zabbix Agent 2 selbst irgendwie falsch gehandhabt, aber nachdem ich mir das gesamte Projekt mit dem Code-Editor angesehen habe, kann ich nichts Bemerkenswertes finden.
Außerdem ist es seltsam, dass die Version des Zabbix-Agenten 6.0.14 ist und 6.0.13 die Version des Plug-in-Kommunikationsprotokolls ist. Ich verstehe nicht, warum versucht wird, die Protokollversion als Proxy-Version auszugeben.
Wenn Sie also irgendwelche Gedanken zu diesem Thema haben, lade ich Sie ein, diese zu äußern. Vielen Dank im Voraus.
Ich habe die Lösung gefunden! (Na ja, mein Arbeitskollege hat das tatsächlich entdeckt, aber nicht den Punkt)
Der Grund dafür ist, dass die Datei src/go/plugins/external/broker.go
。在此文件中多次更改了请求结构中记录的逻辑。在 22 年夏天,他们改变了 Zabbix Agent 版本属性的方式(通过 strconv.Atoi
von einer Zeichenfolge in eine Ganzzahl geparst wird.
Aber im Januar '23 haben sie das Proxy-Versionsattribut entfernt, es über strconv.Atoi
geparst und das Protokollversionsattribut hinzugefügt. Deshalb wird versucht, die Protokollversion als Projektversion auszugeben.
Plugin Support
包的plugin/container/handler.go
文件中的checkVersion
Die Methode zur Überprüfung der Protokollversion wurde ebenfalls geändert.
Das Problem liegt also beim neuen Zabbix Agent 2 und dem alten Plugin-Supportpaket.
Wenn Sie Version 6.4 für Zabbix Agent 2 und Version 1.2.2 für git.zabbix.com/ap/plugin-support/plugin
verwenden, funktioniert alles einwandfrei!
Das obige ist der detaillierte Inhalt vonZabbix Agent 2 löst einen Fehler aus, wenn versucht wird, Test-Plugins gemäß den offiziellen Anweisungen zu verarbeiten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!