我正在运行一些 Zabbix Web 场景来收集某些网站的信息,并且某些 API 的 401 和 404 状态代码是可以接受的,我想在触发器表达式中采用这些。目前它们被认为是“关闭”,因为它们与 200 响应代码不匹配。
我在 Zabbix 中创建了一个 Web 场景,它接受以下响应代码:200、401、404(目前托管一些 API,所以这些很常见)
当我只允许 200 状态代码时,此检查工作正常。为此检查,我添加了 2 条关于 401 和 404 状态代码的“或”语句。由于某种原因,这会使触发器感到困惑,并且每次检查都“失败”
我为 200 状态代码检查设置了这样的触发器表达式:(这很好用!)
{Template App Nginx by Zabbix agent:web.test.error["Web Check Status 200, 401, 404"].last()}=0 or {Template App Nginx by Zabbix agent:web.test.fail["Web Check Status 200, 401, 404"].last()}>0 or {Template App Nginx by Zabbix agent:web.test.rspcode["Web Check Status 200, 401, 404","Web Check Status 200, 401, 404"].last()}<>200
对于 2 个新的状态代码,我将其更改为:
{Template App Nginx by Zabbix agent:web.test.error["Web Check Status 200, 401, 404"].last()}=0 or {Template App Nginx by Zabbix agent:web.test.fail["Web Check Status 200, 401, 404"].last()}>0 or {Template App Nginx by Zabbix agent:web.test.rspcode["Web Check Status 200, 401, 404","Web Check Status 200, 401, 404"].last()}<>200 or {Template App Nginx by Zabbix agent:web.test.rspcode["Web Check Status 200, 401, 404","Web Check Status 200, 401, 404"].last()}<>401 or {Template App Nginx by Zabbix agent:web.test.rspcode["Web Check Status 200, 401, 404","Web Check Status 200, 401, 404"].last()}<>404
现在我如何理解表达式的逻辑如下:
警报如果:
web.test.error 等于 0
或 web.test.fail 大于 0
或 web.test.rspcode 不等于 200
或 web.test.rspcode 不等于 401
或 web.test.rspcode 不等于 404
我的方法正确吗?我该如何解决这个问题?
创建另一个触发器是不够的(我认为),因为原始触发器仍然会失败。
问题1:
项目
web.test.error
以字符串形式返回场景的最后一条错误消息。所以,你的表情永远不会触发,因为这个项目永远不会是0。将其更改为
和逻辑运算符AND。这将解决第一个问题。
问题2:
你不需要这
item.rspcode<>200 or item.rspcode<>401 or item.rspcode<>404
部分。您已经在 Web 场景中指定了预期的响应代码。你的情况会发生什么:item.rspcode<>401
并且item.rspcode<>404
是TRUE。触发器正在触发。item.rspcode<>200
并且item.rspcdoe<>404
是TRUE。触发器正在触发。item.rspcode<>200
并且item.rspcode<>401
是TRUE。触发器正在触发。从您的触发器表达式中删除上述部分。它应该解决问题2。
TL;博士
像这样做: