【问题标题】:Check if values of two string-type items are equal in a Zabbix trigger检查 Zabbix 触发器中两个字符串类型项的值是否相等
【发布时间】:2012-03-13 11:04:53
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: linux string monitoring mirroring zabbix


    【解决方案1】:

    解决方法:

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

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

    来自 Zabbix 手册,

    更改(浮点数、整数、字符串、文本、日志)
    返回上一个值和上一个值之间的差异。 对于字符串:
    0 - 值相等
    1 - 值不同

    【讨论】:

    • 谢谢,这看起来是朝着正确方向迈出的一步,但如果在我开始监视它们时值已经不同,则不会触发。一个较小的缺点是事件将在其中一个值更改时触发,但之后触发器将返回 OK(值不同但它们都没有更改)。
    【解决方案2】:

    我相信,并且我自己也在与这种确切的情况作斗争,正确的方法是通过计算项。

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

    获得该项目后,让计算为您提供一个可以触发的值。您可以在计算中使用任何触发函数以及心律失常操作。

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-15
        • 2015-10-30
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        • 1970-01-01
        • 2019-12-18
        • 1970-01-01
        相关资源
        最近更新 更多