You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cavaliercoder/go-zabbix库按ID查询存在的Zabbix Event无结果问题

问题根因

你遇到的问题是github.com/cavaliercoder/go-zabbix库的EventGetParams结构体设计缺陷,叠加Zabbix API的参数规则共同导致的:

  1. Zabbix event.get接口的acknowledged参数规则和你的推测完全相反:
    • 不传该参数:返回所有匹配eventid的事件,不限制确认状态
    • 设为true/1:仅返回已确认的事件
    • 设为false/0:仅返回未确认的事件
  2. 该库的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 11:36:00