大约一周前我在 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 正则表达式支持它们)
简而言之:
是否有任何监控变量(如邮件的 $DESCRIPTION)引用MATCH
触发规则的行?
(我尝试过 $DESCRIPTION、$HOST……等等,但这似乎只适用于电子邮件)
我多次在谷歌中搜索(也在这里搜索),但我找不到答案......
如果您认为之前已经解决了这个问题,请随时给我指明正确的方向。
更新:
抱歉,我忘了说我正在运行这个:
Ubuntu 16.04 LTS and
Ubuntu 12
Monit 版本是:
这是 Monit 版本 5.25.1,使用 ssl、ipv6、压缩、pam 和大文件构建,版权所有 (C) 2001-2017 Tildeslash Ltd. 保留所有权利。
根据 DevOps 建议,我升级了 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" } }
我想要的是监控描述实际内容如下:
[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']
但我总是得到'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 脚本中然后得到它...!
谢谢你!