Table des matières
Contenu de la question
Solution
Maison développement back-end Golang 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

Feb 11, 2024 am 08:54 AM
字符串解析

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()))
           }
       }
Copier après la connexion
  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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment obtenir la date d'expiration du jeton jwt en go ? Comment obtenir la date d'expiration du jeton jwt en go ? Feb 14, 2024 pm 12:20 PM

J'ai un jeton jwt et je peux voir le jeton décodé sur le site https://jwt.io/. Cela ne m'oblige pas à définir des secrets ou des réclamations. Je cherche donc un moyen de décoder le token pour obtenir la date d'expiration sans fournir de secret. J'utilise la bibliothèque ngopkg.in/square/go-jose.v2/jwt, ci-dessous mon code : token,err:=jwt.ParseSigned(jwtToken) le jeton de valeur de retour a un champ d'en-tête qui comprend l'identifiant de clé, l'algorithme, mais ça ne me donne pas de date d'expiration. J'ai recherché ce sujet et les gens m'ont dit d'utiliser github.com/a

Comment utiliser la fonction d'analyse en langage C Comment utiliser la fonction d'analyse en langage C Apr 28, 2024 pm 09:12 PM

La fonction parse analyse une chaîne et la convertit en une liste de jetons séparés par un délimiteur. Étapes : 1. Recherchez le premier caractère non délimiteur à partir du début de la chaîne ; 2. Continuez la recherche jusqu'à ce qu'un délimiteur soit rencontré et terminez la chaîne à ce délimiteur ; 3. Stockez le jeton dans le tableau de jetons ; 1-3 jusqu'à la fin de la chaîne ; 5. Ajoutez un pointeur vers NULL à la fin du tableau pour indiquer la fin du tableau.

Obtenez des paires clé-valeur imbriquées de la requête x-www-form-urlencoded au format JSON dans Golang Obtenez des paires clé-valeur imbriquées de la requête x-www-form-urlencoded au format JSON dans Golang Feb 09, 2024 pm 03:15 PM

J'ai un cas d'utilisation où nous obtenons une valeur de clé imbriquée dans le corps x-www-form-urlencoded comme ci-dessous name=abc&age=12&notes[key1]=value1&notes[key2]=value2 J'ai essayé url.parsequery("name= abc&age=12&notes \[key1\]=value1&notes\[key2\]=value2") mais cela donne {"name":"abc","age":12,"notes[key1]":"value1", "note

Comment convertir une chaîne en entier en C++ Comment convertir une chaîne en entier en C++ May 01, 2024 pm 01:27 PM

En C++, il existe deux manières de convertir une chaîne en entier : en utilisant la fonction sto i(), qui reçoit directement la chaîne et renvoie un entier. Utilisez la classe isringstream pour analyser la chaîne dans un flux d'entrée et extraire les entiers. La méthode choisie dépend du format de chaîne : stoi() est plus concise si le format est sans ambiguïté et ne contient aucun caractère non numérique ; isstringstream est plus flexible si la chaîne peut contenir des caractères non numériques ou nécessite une conversion personnalisée.

Que signifie analyser en Java Que signifie analyser en Java Apr 28, 2024 pm 09:09 PM

L'analyse en Java fait référence au processus de conversion d'une chaîne ou d'une autre représentation en un type ou un objet spécifié. Les applications courantes incluent la conversion de chaînes en types numériques, en objets date/heure, en objets JSON et l'extraction de données à partir de documents XML. Analysez via des méthodes intégrées, des classes de formateur ou des bibliothèques tierces.

Guide de résolution d'adresse de fonction commune Golang Guide de résolution d'adresse de fonction commune Golang Apr 08, 2024 pm 02:18 PM

Les fonctions clés pour analyser les adresses dans le langage Go incluent : net.ParseIP() : analyser les adresses IPv4 ou IPv6. net.ParseCIDR() : analyser les balises CIDR. net.ResolveIPAddr() : résolvez le nom d'hôte ou l'adresse IP en adresse IP. net.ResolveTCPAdr() : résolvez le nom d'hôte et le port en adresse TCP. net.ResolveUDPAdr() : résolvez le nom d'hôte et le port en adresse UDP.

Comment utiliser la réflexion pour modifier dynamiquement les valeurs des variables dans Golang Comment utiliser la réflexion pour modifier dynamiquement les valeurs des variables dans Golang May 02, 2024 am 11:09 AM

La réflexion du langage Go vous permet de manipuler des valeurs de variables au moment de l'exécution, notamment en modifiant les valeurs booléennes, les entiers, les nombres à virgule flottante et les chaînes. En obtenant la valeur d'une variable, vous pouvez appeler les méthodes SetBool, SetInt, SetFloat et SetString pour la modifier. Par exemple, vous pouvez analyser une chaîne JSON dans une structure, puis utiliser la réflexion pour modifier les valeurs des champs de la structure. Il convient de noter que l'opération de réflexion est lente et que les champs non modifiables ne peuvent pas être modifiés. Lors de la modification de la valeur du champ de structure, les champs associés peuvent ne pas être automatiquement mis à jour.

Compréhension approfondie de PHP : méthode d'implémentation de conversion de JSON Unicode en chinois Compréhension approfondie de PHP : méthode d'implémentation de conversion de JSON Unicode en chinois Mar 05, 2024 pm 02:48 PM

Compréhension approfondie de PHP : méthode d'implémentation de conversion de JSONUnicode en chinois Au cours du développement, nous rencontrons souvent des situations où nous devons traiter des données JSON, et l'encodage Unicode en JSON nous posera quelques problèmes dans certains scénarios, en particulier lorsqu'Unicode doit être converti Lorsque l'encodage est converti en caractères chinois. En PHP, certaines méthodes peuvent nous aider à réaliser ce processus de conversion. Une méthode courante sera présentée ci-dessous et des exemples de code spécifiques seront fournis. Tout d’abord, comprenons d’abord le Un en JSON

See all articles