Monit:如果匹配“xxx”,则在“检查文件...”上使用内容匹配

Monit:如果匹配“xxx”,则在“检查文件...”上使用内容匹配

大约一周前我在 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 脚本中然后得到它...!

谢谢你!

相关内容