


Zabbix Agent 2 génère des erreurs lors de la tentative de traitement des plugins de test selon les instructions officielles
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 :
- Création du répertoire /home/ubuntu/myip
- Création d'un fichier main.go
- 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())) } }
- exemple d'initialisation du mod go.test/myip
- Module d'organisation
- Commencez à construire
- 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
- 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
文件中的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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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

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.

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¬es[key1]=value1¬es[key2]=value2 J'ai essayé url.parsequery("name= abc&age=12¬es \[key1\]=value1¬es\[key2\]=value2") mais cela donne {"name":"abc","age":12,"notes[key1]":"value1", "note

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.

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.

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.

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 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
