首页 > 解决方案 > Rest Api Zabbix(方法:item.get)如何获取指标的全名

问题描述

我从 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?

标签: javaapizabbix

解决方案


当前的item API不能自动扩展宏,它是一个特性实现,例如在trigger API(expandComment,expandDescription,expandExpression)中。

您可以对此功能请求进行投票。

您可以对 进行第一次查询"Incoming network traffic on $1",这将返回一个匹配项的数组,在您的情况下,每个网络接口都有一个。

然后您可以过滤'key_'具有真实接口名称的字段。

一个小python示例:

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

推荐阅读