Maison  >  Article  >  développement back-end  >  Zabbix Agent 2 génère des erreurs lors de la tentative de traitement des plugins de test selon les instructions officielles

Zabbix Agent 2 génère des erreurs lors de la tentative de traitement des plugins de test selon les instructions officielles

PHPz
PHPzavant
2024-02-11 08:54:17962parcourir

Zabbix Agent 2 在尝试根据官方说明处理测试插件时抛出错误

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!

Contenu de la question

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 :

  1. Création du répertoire /home/ubuntu/myip
  2. Création d'un fichier main.go
  3. Collé le code des 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()))
           }
       }
  1. exemple d'initialisation du mod go.test/myip
  2. Module d'organisation
  3. Commencez à construire
  4. J'ai créé le fichier myip.conf en utilisant le chemin d'accès à l'exécutable du plugin et je l'ai placé dans le répertoire /etc/zabbix/zabbix_agent2.d/plugins.d
  5. et lancez la commande 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.

Solution

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文件中的checkVersionLa 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer