Zabbix(5.0)发现规则不起作用

Zabbix(5.0)发现规则不起作用

背景。我有一个应用程序,我想使用 REST API 进行监控。要获取我需要的信息,需要两次调用 REST API。

第一个是这样的:

`http://{IPADDRESS}:1234/api/20190715/metadata`

返回:

`{"items":[{"name":"the_test_name"}]}`

the_test_name我使用 JSONPath 预处理从中提取。

第二次调用如下:

`http://{IPADDRESS}:1234/api/20190715/metadata/the_test_name/status

如您所见,我需要将第一个的结果传递给第二个。我的理解是,这不能轻易地作为两个单独的 来完成items,但使用 可能可以discovery Processes

到目前为止,我有一个模板和两个主机。模板启用了三个标准items,它们在主机上都运行良好。并且基本上与上面的 REST API 调用相同,但字符串中的值为 HardCoded。

然后,我在模板中添加了一个,Discovery Rule它基本上是上面的第一个 API 调用(基本上与标准相同items)。它的预处理值为:

`JSONPath : $.items[0].name`

并将 LLD 宏设置为:

`{#CL_NAME} : $.items[0].name`

如果我单击TEST按钮并添加服务器的 IP 地址,我就会得到正确的结果,例如the_test_name

然后我进行了item_prototype如下设置:

`http://{IPADDRESS}:1234/api/20190715/metadata/{#CL_NAME}/status`

以及预处理值:

`JSONPATH: $.timeLastRefreshSucceeded`

如果我TEST这样做,并输入IPAddress{#CL_NAME}值,它可以正常工作。

然而,然后我转到host> 点击Discovery> item_Prototypes> itemName > PreProcessing> Test

我勾选Get Value From Host并填写这两个宏,它就可以正常工作。

但回到host> Discoveryinfo框是红色的,并显示:

`Invalid Discovery Rule: cannot Parse as Valid JSON object. Invalid Object Format. Expected Opening Character '{' or '[' at 'the_test_name'`

我尝试在任何地方添加和删除步骤,但它仍然说它无效。我错过了什么!

答案1

好的,所以 zabbix 文档可能不是完全清楚地说明如何构建 LLD 低级发现项目原型,但简而言之 - zabbix 期望从您的 LLD 项目返回 JSON - 如下所示:

# mkdir /tmp/test_files/
# touch /tmp/test_files/a
# touch /tmp/test_files/b
# touch /tmp/test_files/c
# ./userparameter_file_discovery.sh /tmp/test_files/
{
  "data":[
  {
     "{#FILE}": "/tmp/test_files/b"
  },
  {
     "{#FILE}": "/tmp/test_files/c"
  },
  {
     "{#FILE}": "/tmp/test_files/a"
  }
  ]
}

对我来说 :) 俗话说 - 如果你手里有一把锤子 - 那么一切都会变成钉子,不幸的是这是真的,所以我知道如何在 bash 中编码以及如何使用 & 误用 zabbix 用户参数,所以我会在这里给你用于生成该输出的脚本内容 -curl我猜你可以调整 API 调用的输入:

#!/bin/bash
# Distribute with zabbix_agent.d file userparameter_file_discovery.conf
# 1st mandatory argument is absolute path of destination directory
# 2nd optional argument is maxdepth number for find
# 3rd optional argument is filemask for grep
#
# TODO: adjust for files with white space chars
# Author:       Roman Spiak
# Email:        [email protected]
# Mod.Date:     2020-06-04

argCount=$#

# argument count check
if [ $argCount -lt 1 ] || [ $argCount -gt 3 ]; then
        echo ERROR: argument count missmatch
        exit 1
fi

dir=$1
if [ $argCount -eq 1 ]; then
        maxDepth=1
        fileMask="."
elif [ $argCount -eq 2 ]; then
        maxDepth=$2
        fileMask="."
else
        maxDepth=$2
        fileMask=$3
fi

filePaths=`find $dir -maxdepth $maxDepth -type f|grep $fileMask`
fileCount=`echo $filePaths|wc -w`

iter=0

echo '{'
echo '  "data":['
for i in $filePaths; do
        echo '  {'
        echo "     \"{#FILE}\": \"$i\""
        iter=$((iter+1))
        if [ $iter -eq $fileCount ]; then
                echo '  }'
        else
                echo '  },'
        fi
done
echo '  ]'
echo '}'

以及 userparm 配置文件:

# UserParameter to autodiscover files inside a provided directory
# Distribute with bash script userparameter_file_discovery.sh
# 1st argument is absolute path of destination directory
# 2nd argument is maxdepth number for find
# 3rd argument is filemask for grep
#
# Author:   Roman Spiak
# Email:    [email protected]
# Mod.Date: 2020-06-02

UserParameter=file.discovery[*],/etc/zabbix/zabbix_agentd.d/userparameter_file_discovery.sh $1 $2 $3

答案2

阅读我之前的回答 - 你的情况中的整个 LLD 是一个很大的矫枉过正,所以让我们尝试一些简单的 bash 脚本,这对你的用例来说应该足够了:

#!/bin/bash
# this script uses jq - details on http://www.compciv.org/recipes/cli/jq-for-parsing-json/
# Let's assume IPADDR is passed via $1 to this bash - in zabbix via arg [*]

IPADDRESS=$1

NAME=`curl http://$IPADDRESS:1234/api/20190715/metadata|jq '.items[]'|jq '.name'`

STATUS=`curl http://$IPADDRESS:1234/api/20190715/metadata/$NAME/status`

echo $STATUS

相关内容