監控:如果符合“xxx”,則對“檢查檔案...”使用內容 MATCH

監控:如果符合“xxx”,則對“檢查檔案...”使用內容 MATCH

我在 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腳本中然後得到它...!

謝謝你!

相關內容