일주일 정도 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 스크립트로 래핑한 다음 얻었습니다...!
감사합니다!