Monit: "xxx"와 일치하는 경우 "파일 확인..."에서 콘텐츠 MATCH를 사용합니다.

Monit: "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 정규식에서 지원되는 것으로 확인됨)

간단히 말해서:

MATCH규칙을 트리거하는 행을 참조하는 monit 변수(예: 메일의 경우 $DESCRIPTION)가 있습니까 ?

($DESCRIPTION, $HOST... 등을 시도했지만 이메일에서만 작동하는 것 같습니다)

Google을 여러 번(그리고 여기에서도) 찾아보았지만 답을 찾을 수 없습니다...

이 문제가 이전에 해결되었다고 생각하시면 저에게 올바른 방향을 알려주시기 바랍니다.

업데이트:

죄송합니다. 다음에서 실행 중이라고 말하는 것을 잊어버렸습니다.

 Ubuntu 16.04 LTS and 
 Ubuntu 12

모니터 버전은 다음과 같습니다.

이것은 Monit 버전 5.25.1입니다. SSL, ipv6, 압축, pam 및 대용량 파일로 구축됨 Copyright (C) 2001-2017 Tildeslash Ltd. All Rights Reserved.

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

하지만 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 스크립트로 래핑한 다음 얻었습니다...!

감사합니다!

관련 정보