Rest Api Zabbix(方法:item.get)如何获取指标的全名

时间:2018-05-16 17:17:42

标签: java api zabbix

我从zabbix获取id指标的方法:

protected String getItemId(String host, String zabbixHostItemName) {
    JSONObject hostItemsFilter = new JSONObject();
    hostItemsFilter.put("name", new String[]{zabbixHostItemName});
    return connectZabbix.zabbixAPI.call(RequestBuilder.newBuilder()
            .method("item.get")
            .paramEntry("filter", hostItemsFilter)
            .paramEntry("host", host)
            .build()).getJSONArray("result").getJSONObject(0).getString("itemid");
}

以下请求正文生成的内容:

{
  "jsonrpc": "2.0",
  "method": "item.get",
  "params": {
    "filter": {
      "name": [
        "myItem"
      ]
    },
    "host": "myHost"
  }
}

它几乎总能奏效。
当Zabbiks返回参数化的度量标准名称时,会发生此问题。 例如,如果您请求指标:

Incomming network traffic on lan900

我的方法返回错误,因为网络接口上的数据已参数化 如果我从zabbix请求主机上的所有指标,那么例如必要的“Incomming network traffic on”将匹配名称:

Incomming network traffic on $1

如何构建一个可以从指标和主机的全名中找到itemid的查询?

1 个答案:

答案 0 :(得分:1)

当前项API无法自动扩展宏,它是触发器API中的一个功能实现(expandComment,expandDescription,expandExpression)。

您可以提升this功能请求。

您可以对"Incoming network traffic on $1"进行第一次查询,该查询将返回一系列匹配项,一个针对您的案例中的每个网络接口。

然后,您可以使用真实的接口名称过滤'key_'字段。

一个小蟒蛇样本:

f  = {  'name' : 'Incoming packet on $1'  }
hostname = 'somehostname'

itemObj = zapi.item.get(filter=f, host=hostname, output=['itemids', 'name', 'key_'] )

for item in itemObj:
    if re.search('eth0', item['key_']):
        print item['itemid']