背景。我有一个应用程序,我想使用 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
> Discovery
,info
框是红色的,并显示:
`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