开发(在 PRTG-speek 中)提供 XML 的“自定义高级 REST 传感器”时,我遇到了一些文档并未真正解答的问题。
首先让我们看看我的一个传感器(处于“alpha”开发状态)实际输出什么(为简洁起见,删除了 XML 注释):
<?xml version="1.0" encoding="UTF-8"?>
<Prtg>
<Text>meminfo OK</Text>
<Result>
<Channel>Active</Channel>
<Value>374688</Value>
</Result>
<Result>
<Channel>Writeback</Channel>
<Value>0</Value>
</Result>
<Result>
<Channel>Inactive</Channel>
<Value>539368</Value>
</Result>
<Result>
<Channel>Buffers</Channel>
<Value>237668</Value>
</Result>
<Result>
<Channel>Free</Channel>
<Value>376916</Value>
</Result>
<Result>
<Channel>Cached</Channel>
<Value>571884</Value>
</Result>
<Result>
<Channel>Dirty</Channel>
<Value>36</Value>
</Result>
</Prtg>
因此,我所称的这个特定传感器有七个“通道” PFS_mem1
(显然是一些内存统计信息)。输出从我的小型 HTTP REST 服务器返回,如下所示Content-Type: application/xml
。
PRTG 配置的“REST 配置”设置为“channelDiscovery”,因为我假设 XML“结果”中的“通道”会被自动检测(而不是提供“REST 配置文件”)。
然而,在配置传感器后,通道标签(例如“缓冲区”)没有被“检测到”(正如我所料);相反,在$["Prtg"]["Result"]["0"]["Value"]
标签应该出现的位置出现了类似表达式。相反,“值”被正确提取。
不会$["Prtg"]["Result"]["0"]["Channel"]
提取相应的“频道”名称吗?
除了标签之外,另一个问题是将“结果”分配给“渠道”:看起来通道不是通过其名称来识别的,而是通过“结果”位置来识别的,因此当“结果”元素(即“通道”)的顺序发生变化时,PRTG 似乎会混合图中的不同通道。
显示的表达式似乎表明 PRTG 不使用 XPath,而是使用他们自己的语法,并且他们对 XML 的解释(我将用双引号编码)似乎使用类似 XML 的语法,但实际上不是 XML。相反,他们似乎认为所有“XML”都是通过替换某些模板中的某些占位符创建的。
提供“REST 配置文件”的(看似无用的)要求可能支持我的印象,即 PRTG 无法真正处理 XML,REST 自定义传感器的帮助文本显示:
传感器要求您将包含映射规则的 REST 配置文件存储在探测系统上。在集群中,将该文件复制到每个集群节点。
然而我的传感器实际上会动态创建一个对象树,将各个通道存储在哈希表中,最后将该数据结构转换为 XML。
那么 PRTG 中的“渠道发现”到底是什么呢?
文档
我发现这个“文档”没什么帮助:
默认 REST 配置文件是频道发现。如果选择此文件,传感器将解析返回的 JSON 或 XML,并根据可用值自动创建通道:每个数字一个通道,如果字符串可以转换为数字,则为字符串创建布尔值。