我在 StackOverflow 上問了這個問題大約一周,但還沒有答案,可能是不可能的,但不知道在哪裡尋找答案,我希望有人可以在這裡提供幫助。
我正在使用 monit 掃描日誌中的錯誤,然後將這些警報推送到名為 DataDog 的監控系統中...
一切似乎都按預期工作,但現在我需要找出引起警報的原因。
使用一個非常簡單的規則,我可以捕獲日誌中引發此錯誤的行並運行特定的腳本來發出警報;直到這裡一切都好:
montirc file
:
check file testmonit with path /var/log/testmonit.log
if MATCH "(ERROR.*)" then
exec "/usr/bin/python /opt/scripts/bin/dd_notify.py test-error"
這個配置實現了我想要的,它實際上引發了我想要的警報
但現在我需要知道「是什麼引起了這個警報」;例如,如果日誌中出現此行:
ERROR failure to complete process due lock file....
在監控日誌上我可以看到:
[UTC Mar 6 11:59:08] error : 'testmonit' content match [ERROR failure to complete process due lock file....]
[UTC Mar 6 11:59:08] info : 'testmonit' exec: /usr/bin/python
這是完美的......我想要的是捕獲這個:
[ERROR failure to complete process due lock file....]
要將這個字串發送到我的監控系統(DataDog)中,我找不到任何實際上允許我使用匹配 content
,或群組(我可以看到 MATCH 正規表示式支援)
簡而言之:
是否有任何 monit 變數(例如郵件的 $DESCRIPTION)引用MATCH
觸發規則的行?
(我嘗試過 $DESCRIPTION、$HOST...等,但這似乎只適用於電子郵件)
我多次查看谷歌(也在這裡)但我找不到答案...
如果您認為這個問題之前已解決,請隨時為我指出正確的方向。
更新:
抱歉,我忘了說我正在運行此程式:
Ubuntu 16.04 LTS and
Ubuntu 12
監控版本是:
這是 Monit 版本 5.25.1 使用 ssl、ipv6、壓縮、pam 和大檔案建置 版權所有 (C) 2001-2017 Tildeslash Ltd。
根據 DevOps 的建議,我升級了 monit 版本。
並嘗試使用MONIT_DESCRIPTION或者$MONIT_DESCRIPTION沒有成功的規則文件是這樣的:
check file pd-error with path /var/log/testmonit.log if CONTENT = "ERROR" then exec "/usr/bin/python /opt/scripts/bin/dd_notify.py pd_error " $MONIT_DESCRIPTION
我想要的是傳遞已匹配的內容作為 dd_notify.py 程式的附加參數;
但我得到的是(這是執行的結果dd_notify.py
):
{ "ALARM": { "pd_error": 67 }, "MESSAGES": { "pd_error": "$MONIT_DESCRIPTION" } }
我想要的是$MONIT_DESCRIPTION內容其實是:
[UTC Apr 3 21:53:22] debug : 'pd-error' Pattern 'ERROR' match on content line [Apr 3 21:52:30 ams01 MainProcess[1376]: cel ery.worker.job ERROR Task tasks.telemetry.gather_and_send_telemetry_info[f090d579-9ec2-40e5-9fb2-91436eb4fc8a] fail]
但我現在沒有任何運氣......我在這裡想念什麼?
謝謝。
答案1
Jsut 嘗試使用 Monit 5.23.0,並且有一個環境變數。
MONIT_DESCRIPTION=content match:
[ERROR failure to complete process due lock file....]
[ERROR failure to complete process due lock file....]
Monit 將輸出每次出現的匹配內容
此外,Monit 5.16.0 中的語法已更改,但舊版本仍然有效。變更日誌可在此處取得:https://mmonit.com/monit/changes/
另請注意,您可以更改 Monit 的各種限制https://mmonit.com/monit/documentation/monit.html#LIMITS
如果您願意升級,Monit 提供了預編譯的通用二進位文件,我使用它們來獲得比 Ubuntu 儲存庫中的版本更新的版本。
答案2
感謝 DevOps 讓我走上了正確的道路來解決這個問題,我終於成功地完成了我想做的事情,並且還可以解釋(根據我的理解)為什麼它之前對我不起作用
正如 DevOps 所說,有一個變數 MONIT_DESCRIPTION 實際上包含錯誤字串,但該變數僅在 bash 環境中「可存取」。
正如我正在做的:
check file pd-error with path /var/log/testmonit.log
if CONTENT = "ERROR" then exec "/usr/bin/python /opt/scripts/bin/dd_notify.py pd_error "
從 dd_notify.py 我試著做:
錯誤= os.environ['MONIT_DESCRIPTION']
但我總是收到“key_error”,因為“MONIT_DESCRIPTION”無法從 python 訪問
然後我嘗試使用 bash 包裝器呼叫我的程序,例如:
check file pd-error with path /var/log/testmonit.log
if CONTENT = "ERROR" then exec "/bin/bash /opt/scripts/bin/wrapper.sh"
在「wrapper.sh」程式碼上我有:
/usr/bin/python /opt/scripts/bin/dd_notify.py pd_error
然後我得到了我正在尋找的東西:
{
"ALARM": {
"pd_error": 294
},
"MESSAGES": {
"pd_error": "content match:\nMay 16 18:07:08 ams01 MainProcess[1358]: celery.worker.job ERROR Task fds.realtime.tasks.telemetry.gather_and_send_telemetry_info[abe35540-55ef-40db-984a-
12287f5648ab] raised unexpected: ConnectionError()#012Traceback (most recent call last):#012 File \"/usr/lib/python2.7/dist-packages/celery/app/trace.py\", line 240, in trace_task#012
R = retval = fun(*args, **kwargs)#012 File \"/usr/lib/python2.7/dist-packages/celery/app/trace.py\", line 438, in __protected_call__#012 return self.run(*args, **kwargs)\n...\n"
}
}
這太棒了!
所以基本上我無法從Python訪問monit環境變數...所以我包裝到一個bash腳本中然後得到它...!
謝謝你!