2

我正在使用 Zabbix 监控应用程序,并定义了一个返回字符串值的自定义项。由于我的项目的值实际上是校验和,它们将只包含字符[0-9a-f]。为了冗余,我的应用程序的两个镜像副本在两台服务器上运行。我想创建一个触发器,该触发器将从两台机器中获取项目值并在它们不相同时触发。

暂时让我们忘记值改变的那一刻(它不是原子操作,因此系统可能会在短时间内看到不一致的状态,这不是真正的错误),因为我可以通过查看几个来解决它以前的值。

关键是:如何编写一个 Zabbix 触发器表达式,它可以比较两个项目的字符串值是否相等(实际上是两个镜像主机上的相同项目)?

根据精美手册和我在实践中确认的那样,标准运算符=#处理数值,所以我不能只写自然的{host1:myitem[param].last(0)} # {host2:myitem[param].last(0)}. change()or等函数diff()只能比较同一项目在不同时间点的值。诸如此类的函数regexp()只能将项目的值与常量字符串/正则表达式进行比较,而不能与另一个项目的值进行比较。这是非常有限的。

我可以将比较逻辑移动到我的自定义项执行的脚本中,但它有点凌乱且不优雅,所以如果可能的话,我希望在我的 Zabbix 触发器中包含这个逻辑。

也许尽管有上面列出的限制,有人可以想出一个解决方法吗?

4

3 回答 3

2

解决方法:

{host1:myitem[param].change(0)} # {host2:myitem[param].change(0)}

当只有一个服务器看到自先前接收到的值以来的修改时,将触发一个事件。

来自 Zabbix 手册,

change (float, int, str, text, log)
返回上一个值和上一个值之间的差异。对于字符串:
0 - 值相等
1 - 值不同

于 2012-03-13T21:25:11.010 回答
1

我相信,并且我自己也在为这种确切的情况而苦苦挣扎,正确的方法是通过计算项目。

您想创建一个新的项目,而不是触发器(还没有!),它对多个项目值(字符串差异、范围内的数字等)执行计算比较。

一旦你有了那个项目,让计算给你一个可以触发的值。您可以在计算中使用任何触发函数以及心律失常操作。

现在到这个问题(我已经提交了一个功能请求,因为这是非常有限的),大多数触发器表达式计算为一个数字或 0/1 布尔值。

我想我有一个解决我的问题的方法,那就是我正在从网页跟踪版本号:例如 v2.0.1,我相信我可以在计算项目中使用字符串内涵和正则表达式,以便将我的字符串值转换为多个数字价值观。因为这些将是轻而易举的比较。

但同样,这是令人费解和痛苦的。

如果您需要我的建议,请让您自己或开发人员查看触发器表达式的代码,看看您是否可以提交补丁添加一个触发器函数以进行简单的字符串比较。(差异、长度、可能转换为数值(使用二进制和/或十六进制组合)等)

我正在尝试自己开发一个补丁,但我没有时间,因为我有太多的监控要实施,虽然 zabbix 很强大,但它有几个巨大的缺陷。我仍然相信它是目前最好的监控系统。

简单的答案:创建一个 UserParameter 直到有人编写补丁。

于 2014-10-22T22:02:43.677 回答
0

您可以更改您的项目以返回数字而不是字符串。因为您的项目是仅使用[0-9a-f]字符的校验和,所以它们是用十六进制编写的数字。因此,您需要将校验和转换为十进制数。

因为校验和是一个大数字,所以在转换之前,您需要将数字(无符号)类型的十六进制数限制为 8 个字符。或者,如果您想要更高的精度,您可以使用 float (但这会更有效):

Numeric (unsigned) - 64 位无符号整数
Numeric (float) - 浮点数
可以存储负值。
允许的范围(对于 MySQL):-999999999999.9999 到 999999999999.9999 (double(16,4))。

我希望 Zabbix 具有.hashedUnsigned()计算字符串哈希并将其作为数字返回的函数。这样的函数应该很容易编写。

于 2017-02-20T10:29:40.343 回答