目录
问题内容
解决方法
首页 后端开发 Golang Zabbix Agent 2 在尝试根据官方说明处理测试插件时抛出错误

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

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

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

php小编柚子今天要和大家分享关于Zabbix Agent 2的一则问题。在尝试根据官方说明处理测试插件时,一位用户遇到了错误的抛出问题。这个问题可能会影响插件的正常运行,因此我们将会探讨解决这个问题的方法。让我们一起来看看吧!

问题内容

我开始探索 zabbix agent 2 的可能性,并决定按照官方插件创建指南中的描述逐步创建一个测试插件。

在我完成所有步骤之后,zabbix agent 不想执行任何操作(除了 -h 选项)并给出以下错误:

zabbix_agent2 [10046]:错误:无法注册插件:无法解析代理版本strconv.atoi:解析“6.0.13”:语法无效

我在 ubuntu 22.04 上完成了这一切。

zabbix agent 2 版本:6.0.14。

go版本:go1.18.1 linux/amd64

我只通过 apt-get 安装了 zabbix agent 2。

我按照说明做了一切:

  1. 创建了目录 /home/ubuntu/myip
  2. 创建了一个文件 main.go
  3. 粘贴了指令中的代码
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. go mod init example.test/myip
  2. 整理模组
  3. 开始构建
  4. 我使用插件可执行文件的路径创建了文件 myip.conf 并将其放入目录 /etc/zabbix/zabbix_agent2.d/plugins.d
  5. 并启动命令 zabbix_agent2 -t myip

并且......它不起作用并抛出有关错误解析代理版本的错误。

我认为 strconv.atoi 在 zabbix agent 2 本身的代码中以某种方式处理不正确,但是在使用代码编辑器查看整个项目后,我找不到任何值得注意的东西。

另外,奇怪的是zabbix agent版本是6.0.14,6.0.13是插件通信协议版本。我不明白为什么它试图将协议版本冒充代理版本。

所以,如果你对这个问题有什么想法,我请你表达出来。预先感谢您。

解决方法

我找到了解决办法! (嗯,实际上我的工作同事发现了这一点,但不是重点)

原因是文件 src/go/plugins/external/broker.go。在此文件中多次更改了请求结构中记录的逻辑。在 22 年夏天,他们改变了 Zabbix Agent 版本属性的方式(通过 strconv.Atoi 从字符串解析为整数)。

但在 23 年 1 月,他们删除了代理版本的属性,通过 strconv.Atoi 进行解析,并添加了协议版本的属性。这就是为什么它试图将协议版本冒充为项目版本。

Plugin Support包的plugin/container/handler.go文件中的checkVersion方法也已更改,用于检查协议版本。

所以,问题出在新的 Zabbix Agent 2 和旧的插件支持包上。

如果您对 Zabbix Agent 2 使用版本 6.4,对 git.zabbix.com/ap/plugin-support/plugin 使用版本 1.2.2,则一切正常!

以上是Zabbix Agent 2 在尝试根据官方说明处理测试插件时抛出错误的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何从 go 中的 jwt 令牌获取过期日期? 如何从 go 中的 jwt 令牌获取过期日期? Feb 14, 2024 pm 12:20 PM

我有一个jwt令牌,我可以在https://jwt.io/网站上看到解码后的令牌。它不需要我设置任何秘密或声明。所以我正在寻找一种方法来解码令牌以获得过期日期而不提供任何秘密。我正在使用库ngopkg.in/square/go-jose.v2/jwt,下面是我的代码:token,err:=jwt.ParseSigned(jwtToken)返回值token有一个标头字段,其中包括keyid、算法,但它没有给我过期日期。我搜索过这个主题,人们说使用github.com/a

c语言中parse函数怎么用 c语言中parse函数怎么用 Apr 28, 2024 pm 09:12 PM

parse 函数解析字符串,将其转换为由分隔符分隔的令牌列表。步骤:1. 从字符串开头搜索第一个非分隔符字符;2. 继续搜索直到遇到分隔符,并在该分隔符处终止字符串;3. 将令牌存储在令牌数组中;4. 重复 1-3 步,直至字符串结束;5. 在数组末尾添加指向 NULL 的指针,表示数组结束。

在golang中获取JSON格式的x-www-form-urlencoded请求的嵌套键值对 在golang中获取JSON格式的x-www-form-urlencoded请求的嵌套键值对 Feb 09, 2024 pm 03:15 PM

我有一个用例,我们在x-www-form-urlencoded主体中获取嵌套键值,如下所示name=abc&age=12&notes[key1]=value1&notes[key2]=value2我尝试了url.parsequery("name=abc&age=12&notes\[key1\]=value1&notes\[key2\]=value2")但它给出了{"name":"abc","age":12,"notes[key1]":"value1","note

c++中 string转int的方法 c++中 string转int的方法 May 01, 2024 pm 01:27 PM

在 C++ 中,有两种将 string 转换为 int 的方法:使用 sto i() 函数,直接接收字符串并返回整数。使用 istringstream 类,将字符串解析为输入流,然后提取整数。选择方法取决于字符串格式:如果格式明确且无非数字字符,stoi() 更简洁;如果字符串可能包含非数字字符或需要自定义转换,则 istringstream 更灵活。

java中parse是什么意思 java中parse是什么意思 Apr 28, 2024 pm 09:09 PM

Java中的parse指将字符串或其他表示形式转换为指定类型或对象的处理过程。常见的应用包括将字符串转换为数字类型、日期/时间对象、JSON对象以及从XML文档中提取数据。通过内置方法、格式化器类或第三方库进行parse。

Golang 常用函数地址解析指南 Golang 常用函数地址解析指南 Apr 08, 2024 pm 02:18 PM

Go语言中解析地址的关键函数包括:net.ParseIP():解析IPv4或IPv6地址。net.ParseCIDR():解析CIDR标记。net.ResolveIPAddr():解析主机名或IP地址为IP地址。net.ResolveTCPAddr():解析主机名和端口为TCP地址。net.ResolveUDPAddr():解析主机名和端口为UDP地址。

深入了解PHP:JSON Unicode转中文的实现方法 深入了解PHP:JSON Unicode转中文的实现方法 Mar 05, 2024 pm 02:48 PM

深入了解PHP:JSONUnicode转中文的实现方法在开发中,我们经常会遇到需要处理JSON数据的情况,而JSON中的Unicode编码在一些场景下会给我们带来一些问题,特别是当需要将Unicode编码转换为中文字符时。在PHP中,有一些方法可以帮助我们实现这个转换过程,下面将介绍一种常用的方法,并提供具体的代码示例。首先,让我们先了解一下JSON中Un

golang 如何使用反射动态修改变量值 golang 如何使用反射动态修改变量值 May 02, 2024 am 11:09 AM

Go语言反射允许在运行时操控变量值,包括修改布尔值、整数、浮点数和字符串。通过获取变量的Value,可以调用SetBool、SetInt、SetFloat和SetString方法进行修改。例如,可以解析JSON字符串为结构体,然后使用反射修改结构体字段的值。需要注意,反射操作较慢,且无法修改不可修改字段,修改结构体字段值时可能不会自动更新相关字段。

See all articles