监视 http 响应内容正则表达式行为

Monit http response content regex behavior

我正在使用 Logstash + Elasticsearch 堆栈来聚合来自几个相互关联的应用程序的日志。

我试图让 Monit 在单词 'ERROR' 被 return 编辑为来自 Monit 的 Elasticsearch REST 查询的一部分时发出警报,但是 'content' 正则表达式检查似乎没有为我工作。 (我正在通过 M/Monit 从 Monit 发送电子邮件和短信提醒。)

我知道我的 Monit 和 M/Monit 实例配置正确,因为我可以获得有关服务器 ping 和文件校验和更改等的警报。

我的 Monit Elasticsearch HTTP 查询如下所示:

check host elasticsearch_error with address 12.34.56.789
    if failed 
      url http://12.34.56.789:9200/_search?q=severity%3AERROR%20AND%20timestamp%3A>now-2d 
      and content = "ERROR" 
    then alert

顺便说一句,%20 转义 'space',%3A 转义 ':'

我的 logstash 只有一到两天前的错误日志条目。即,当我 运行

http://12.34.56.789:9200/_search?q=severity%3AERROR%20AND%20timestamp%3A>now-2d

在浏览器中,我在响应正文中看到错误(带有单词 'ERROR'),但是当我 运行

http://12.34.56.789:9200/_search?q=severity%3AERROR%20AND%20timestamp%3A>now-1d

我没有。 (注意一天的差异。)这是预期的行为。注意:我的响应正文是一个 JSON,子元素中的 "ERROR" 字符串向下几层。我不知道这是否会影响 Monit 处理正则表达式的方式。

当我 运行 上面的检查时,我看到

'elasticsearch_error' failed protocol test [HTTP] at 
INET[12.34.56.789:9200/_search
q=severity%3AERROR%20AND%20timestamp%3A>now-2d] 
via TCP -- HTTP error: Regular expression doesn't match:
regexec() failed to match

在日志中。好的。内容 == "ERROR" 为真。我可以从中发出警报(即使我发现 Monit 浏览器仪表板中的 Connection failed 消息有点烦人......应该类似于 Regex failure。)

问题

当我'monit reload'和运行检查

url http://12.34.56.789:9200/_search?q=severity%3AERROR%20AND%20timestamp%3A>now-1d

我仍然收到上述 regexec() failed to match 错误。注意,我在响应正文中 return 没有 "ERROR" 字符串。内容 == "ERROR" 为假。为什么这个检查失败了?任何有关此问题的线索都将不胜感激!

答案

原来这个问题是关于 Elasticsearch 查询的 URL 编码。

我在检查中使用 url http://12.34.56.789:9200/_search?q=severity:ERROR&timestamp:>now-36d 让 Monit 发出看起来像 12.34.56.789:9200/_search?q=severity:ERROR&timestamp:%3Enow-36d 的请求。注意编码的变化。这似乎有效。

monit 实际使用的 URL 可以通过使用 monit -vI 在调试模式下启动 monit 来查看。

附带问题

'content' 对象似乎尊重“=”、“==”和“!=”。文档中引用了“=”,但很多第三方示例使用“==”。什么是最正确的用法?

边题答案

M/Monit 团队的热心人士建议,“=”是 Monit 配置文件中“==”的别名。

我在上面的问题中添加了我找到的解决方案。