使用cavaliercoder/go-zabbix库按ID查询存在的Zabbix Event无结果问题
问题根因
你遇到的问题是github.com/cavaliercoder/go-zabbix库的EventGetParams结构体设计缺陷,叠加Zabbix API的参数规则共同导致的:
- Zabbix
event.get接口的acknowledged参数规则和你的推测完全相反:- 不传该参数:返回所有匹配eventid的事件,不限制确认状态
- 设为
true/1:仅返回已确认的事件 - 设为
false/0:仅返回未确认的事件
- 该库的
EventGetParams中Acknowledged字段定义为值类型bool,而非指针类型*bool,Go语言encoding/json包的omitempty标签对值类型的零值(bool的零值为false)不会触发省略逻辑,所以哪怕你不给该字段赋值,序列化后也会强制带上"acknowledged":false参数,过滤掉所有已确认事件。你要查询的2589270事件属于已确认状态,所以传false时查询不到,传true时可以命中。你之前的curl请求没有带acknowledged参数,所以可以正常返回结果。
解决方案
方案1:明确匹配事件确认状态
如果你查询的事件固定为已确认状态,直接显式给Acknowledged赋值为true即可:
params := zabbix.EventGetParams{ EventIDs: event_ids, Acknowledged: true, }
方案2:调用底层JSON-RPC接口跳过结构体限制
如果你需要查询所有确认状态的事件,可以绕过库的预制结构体,直接调用底层请求方法,自行构造不包含acknowledged字段的参数:
import "encoding/json" // 自定义请求参数,不加入acknowledged字段 customParams := map[string]interface{}{ "eventids": event_ids, // 不需要过滤事件类型的话可以删掉object字段 "object": 0, } // 调用底层接口发起event.get请求 resp, err := session.Do("event.get", customParams) if err != nil { panic(err) } // 反序列化返回结果到Event切片 var events []zabbix.Event err = json.Unmarshal(resp, &events) if err != nil { panic(err) } fmt.Println(events)
方案3:修改库结构体定义(长期解决方案)
如果需要频繁使用该场景,可以修改本地依赖的库代码,将EventGetParams的Acknowledged字段改为指针类型:
// 修改前:Acknowledged bool `json:"acknowledged,omitempty"` // 修改后: Acknowledged *bool `json:"acknowledged,omitempty"`
修改后不给该字段赋值时,零值为nil,omitempty标签会生效,序列化后不会带出acknowledged参数,即可匹配所有确认状态的事件。
内容的提问来源于stack exchange,提问作者quattro
相关产品推荐
相关产品推荐

