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

我试图让Monit在从Monit的Elasticsearch REST查询中返回“ERROR”一词时发出警报,但“content”正则表达式检查似乎对我不起作用。 (我正在通过M / Monit从Monit发送电子邮件和SMS警报。)

我知道我的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

在日志中。好。内容==“错误”为true。我可以从中发出警报(即使我在Monit浏览器仪表板中发现Connection failed消息也有点烦人……应该类似于Regex failure。)

问题

当我“监视重新加载”并使用
url http://12.34.56.789:9200/_search?q=severity%3AERROR%20AND%20timestamp%3A>now-1d

我仍然收到如上所述的regexec() failed to match错误。注意,我在响应正文中没有返回“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 -vI在 Debug模式下启动monit来查看monit使用的实际URL。

附带问题

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

边问问题

M / Monit团队的有用人员建议“=”是Monit配置文件中“==”的别名。

最佳答案

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

关于regex - Monit http响应内容正则表达式行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28845373/

10-12 01:04