L'éditeur php Yuzi partagera avec vous une question sur Zabbix Agent 2 aujourd'hui. Un utilisateur a rencontré une erreur en essayant de gérer le plugin de test conformément aux instructions officielles. Ce problème peut affecter le bon fonctionnement du plugin, nous allons donc explorer les moyens de résoudre ce problème. Nous allons jeter un coup d'oeil!
J'ai commencé à explorer les possibilités de l'agent zabbix 2 et j'ai décidé de créer un plugin de test étape par étape comme décrit dans le guide officiel de création de plugin.
Après avoir terminé toutes les étapes, l'agent zabbix n'a rien voulu faire (sauf l'option -h) et a donné l'erreur suivante :
zabbix_agent2 [10046]:错误:无法注册插件:无法解析代理版本strconv.atoi:解析“6.0.13”:语法无效
J'ai fait ça sur Ubuntu 22.04.
agent Zabbix 2 version : 6.0.14.
version go : go1.18.1 linux/amd64
J'ai uniquement installé l'agent Zabbix 2 via apt-get.
J'ai tout fait selon les instructions :
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
Et... cela ne fonctionne pas et génère une erreur concernant une mauvaise version d'analyse du proxy.
Je pense que strconv.atoi
est d'une manière ou d'une autre mal géré dans le code de l'agent zabbix 2 lui-même, mais après avoir regardé l'ensemble du projet à l'aide de l'éditeur de code, je ne trouve rien d'intéressant.
De plus, il est étrange que la version de l'agent Zabbix soit la 6.0.14 et que la version 6.0.13 soit la version du protocole de communication du plug-in. Je ne comprends pas pourquoi il essaie de faire passer la version du protocole pour la version proxy.
Donc, si vous avez des idées sur cette question, je vous invite à les exprimer. Merci d'avance.
J'ai trouvé la solution ! (Eh bien, mon collègue de travail a découvert cela, mais ce n'est pas le but)
La raison est que le fichier src/go/plugins/external/broker.go
。在此文件中多次更改了请求结构中记录的逻辑。在 22 年夏天,他们改变了 Zabbix Agent 版本属性的方式(通过 strconv.Atoi
est analysé à partir d'une chaîne en un entier).
Mais en janvier 23, ils ont supprimé l'attribut de version du proxy, l'ont analysé via strconv.Atoi
et ont ajouté l'attribut de version de protocole. C'est pourquoi il essaie de faire passer la version du protocole comme version du projet.
Plugin Support
包的plugin/container/handler.go
文件中的checkVersion
La méthode de vérification de la version du protocole a également été modifiée.
Donc, le problème vient du nouveau Zabbix Agent 2 et de l'ancien package de support du plugin.
Si vous utilisez la version 6.4 pour Zabbix Agent 2 et la version 1.2.2 pour git.zabbix.com/ap/plugin-support/plugin
alors tout fonctionne bien !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!