Monit: 「xxx」と一致する場合、「ファイルをチェック…」でコンテンツ MATCH を使用します

Monit: 「xxx」と一致する場合、「ファイルをチェック…」でコンテンツ MATCH を使用します

1 週間ほど前に 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....

monit ログでは次のことがわかります:

[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正規表現でサポートされていることがわかります)

つまり、要約すると:

MATCHルールをトリガーする行を参照する monit 変数 (メールの $DESCRIPTION など) はありますか?

($DESCRIPTION、$HOST などを試しましたが、これは電子メールでのみ機能するようです)

何度か Google で調べましたが (ここでも)、答えが見つかりません...

この問題が以前に解決されたと思われる場合は、遠慮なく正しい方向を指示してください。

アップデート:

申し訳ありませんが、これを実行しているのは次のマシンだということを言い忘れていました:

 Ubuntu 16.04 LTS and 
 Ubuntu 12

Monitのバージョンは次のとおりです:

これは Monit バージョン 5.25.1 です。SSL、IPv6、圧縮、PAM、大容量ファイルで構築されています。Copyright (C) 2001-2017 Tildeslash Ltd. 無断複写・転載を禁じます。

DevOps の推奨に従って、monit のバージョンをアップグレードしました。

そして使ってみたモニタの説明または$MONIT_説明成功ルールファイルがない場合は次のようになります。

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_説明実際の内容は次のとおりです。

[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

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']

しかし、Pythonから「MONIT_DESCRIPTION」にアクセスできなかったため、常に「key_error」が発生しました。

次に、次のような 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 スクリプトにラップして取得しました...!

ありがとう!

関連情報