【发布时间】:2016-05-02 13:33:02
【问题描述】:
对于主机(使用除 0 或 1 以外的插件返回码:Centreon blog post)似乎可以维护最后一个已知状态,但对于服务则不行。
所以问题是,如何开发一个在不需要时不会改变服务状态的插件?
我正在从文件中检索状态,但如果文件太旧,我不想获取它。所以在这种情况下,当我的 Python 插件正在扫描文件时,我希望它不会干扰当前状态。
编辑:我想到的解决方法。
- 在不退出系统的情况下退出 Python 插件(有可能吗??)
- 以“未知”状态退出插件。可能没问题,但在这种情况下,我们失去了之前在 Centreon 的地位。如果这以后是一个“关键”的,可能不是最好的主意。
- ??
...或要求新功能 ;)
编辑 2:更多信息。
Python 插件是通用的,用于从 xml 文件中检索信息。这些 xml 文件是根据 Nagios 插件的所有需求构建的:
<?xml version="1.0"?>
<Data>
<CheckDate>1461939688</CheckDate>
<Status>WARNING</Status>
<Text>Warning on 3 disks</Text>
<PerfData>'Disk 1'=34;10;50;0;</PerfData>
<PerfData>'Disk 2'=21;10;50;0;</PerfData>
<PerfData>'Disk 3'=11;10;50;0;</PerfData>
<PerfData>'Disk 4'=0;10;50;0;</PerfData>
<PerfData>'Disk 5'=3;10;50;0;</PerfData>
</Data>
我正在比较给定的日期以确保信息不会太旧。
所以基本上,我的 Python 插件只是一个 xml 解析器,用于检索数据并生成标准的 Nagios 输出。我们可以称它为“xml to Nagios”转换器!这是输出:
TEST WARNING: Errors on 3 disks | 'Disk 1'=34;10;50;0; 'Disk 2'=21;10;50;0; 'Disk 3'=11;10;50;0; 'Disk 4'=0;10;50;0; 'Disk 5'=3;10;50;0;
$ echo $?
1
这似乎没用(为什么不编写插件而不是使用 xml 文件?),但是:
- 我们正在从许多来源检索信息,但并非所有人都知道 Nagios 系统
- 这允许生成速度非常慢的插件 输出。否则,Centreon 服务器会产生超时。
所以,我不确定整个代码是否相关,只是我正在让它有一个正确的退出“Nagios 兼容”:
def return_status(status):
if status == 'OK':
return 0
elif status == 'WARNING':
return 1
elif status == 'CRITICAL':
return 2
elif status == 'UNKNOWN':
return 3
还有:
sys.exit(return_status(status)),状态为允许状态之一:“OK”、“WARNING”等。
【问题讨论】:
-
使用自定义插件,退出代码是您的选择。一个更好的代码示例将有助于更好地了解您正在检查的内容和方式。
-
谢谢,JonB,我已经编辑了我的帖子。问题是,除 0、1、2 或 3 之外的退出代码将在 Centreon 中产生“关键”状态,而对于主机它不会改变任何东西(这也是我希望服务的状态)。
-
如果
<CheckDate>1461939688</CheckDate>太旧,您基本上想覆盖<Status>WARNING</Status>并返回上一次检查中的任何状态,从而冒着认为您想多了的风险?我还认为,如果 XML 文件中的日期太旧,您会想知道这一点,以便调查原因。 -
这个想法是在 Centreon 中保持上次检查的状态和日期不变(对于主机来说似乎是可能的,请参阅博客链接)。覆盖当前状态会更改检查日期,这不是一个可接受的选项,因为它会让我们认为已经执行了检查,但事实并非如此(它也会在图表中添加一个错误值)。毕竟,“未知”状态可能是最好的选择,因为我们确实必须调查为什么 xml 文件没有改变。
标签: python monitoring nagios