监视 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×tamp:>now-36d
让 Monit 发出看起来像 12.34.56.789:9200/_search?q=severity:ERROR×tamp:%3Enow-36d
的请求。注意编码的变化。这似乎有效。
monit 实际使用的 URL 可以通过使用 monit -vI
在调试模式下启动 monit 来查看。
附带问题
'content' 对象似乎尊重“=”、“==”和“!=”。文档中引用了“=”,但很多第三方示例使用“==”。什么是最正确的用法?
边题答案
M/Monit 团队的热心人士建议,“=”是 Monit 配置文件中“==”的别名。
我在上面的问题中添加了我找到的解决方案。
我正在使用 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×tamp:>now-36d
让 Monit 发出看起来像 12.34.56.789:9200/_search?q=severity:ERROR×tamp:%3Enow-36d
的请求。注意编码的变化。这似乎有效。
monit 实际使用的 URL 可以通过使用 monit -vI
在调试模式下启动 monit 来查看。
附带问题
'content' 对象似乎尊重“=”、“==”和“!=”。文档中引用了“=”,但很多第三方示例使用“==”。什么是最正确的用法?
边题答案
M/Monit 团队的热心人士建议,“=”是 Monit 配置文件中“==”的别名。
我在上面的问题中添加了我找到的解决方案。