我正在使用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×tamp:>now-36d
来让Monit发出看起来像12.34.56.789:9200/_search?q=severity:ERROR×tamp:%3Enow-36d
的请求。注意编码的变化。这似乎有效。可以通过使用
monit -vI
在 Debug模式下启动monit来查看monit使用的实际URL。附带问题
“内容”对象似乎尊重“=”,“==”和“!=”。文档中引用了“=”,但是许多第三方示例都使用“==”。最正确的用法是什么?
边问问题
M / Monit团队的有用人员建议“=”是Monit配置文件中“==”的别名。
最佳答案
我在上面的问题中添加了找到的解决方案。
关于regex - Monit http响应内容正则表达式行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28845373/