[英]Monit http response content regex behavior
我正在使用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
轉義為'空格', %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
來讓12.34.56.789:9200/_search?q=severity:ERROR×tamp:%3Enow-36d
發出看起來像12.34.56.789:9200/_search?q=severity:ERROR×tamp:%3Enow-36d
的請求12.34.56.789:9200/_search?q=severity:ERROR×tamp:%3Enow-36d
。 注意編碼的變化。 這似乎有效。
可以通過使用monit -vI
在調試模式下啟動monit -vI
來monit -vI
使用的實際URL。
附帶問題
“內容”對象似乎尊重“ =”,“ ==”和“!=”。 文檔中引用了“ =”,但是許多第三方示例都使用“ ==”。 最正確的用法是什么?
旁題答案
M / Monit團隊的有用人員建議“ =”是Monit配置文件中“ ==”的別名。
我在上面的問題中添加了找到的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.