返回介绍

9.4 Ganglia 与 Centreon 的无缝整合

发布于 2025-04-21 21:33:24 字数 16180 浏览 0 评论 0 收藏

通过前面的介绍,确定了以 Ganglia 作为数据收集模块,Centreon 作为监控报警模块的方案,这样,一个智能监控报警平台两大主要功能模块已经基本实现了。但现在的问题是,如何将收集到的数据传送给监控报警模块呢?这就是数据提取模块要完成的功能。

数据提取模块要完成的功能是:从数据收集模块中定时采集指定的数据,然后将采集到的数据与指定的报警阈值进行比较,如果发现采集到的数据大于或小于指定的报警阈值,那么就通过监控报警模块设置的报警方式进行故障通知。在这个过程中,只有采集数据在数据收集模块中完成,其他操作,例如:采集数据时间间隔、报警阈值设置、报警方式设置、报警联系人设置等都在监控报警模块中完成。

从数据提取模块完成的功能可以看出,此模块主要用来衔接数据收集模块和监控报警模块,进而实现 Ganglia 和 Centreon 的无缝整合。要实现数据提取模块的功能,方法有很多,最简单、最直接的方法就是编写监控脚本,这里提供几个常用的数据提取脚本,然后将脚本添加到 Centreon 中,下面介绍具体的操作过程。

9.4.1 数据提取脚本

这里提供两个数据提取脚本,一个是基于 Python 编写的,一个是基于 PHP 编写的,下面分别进行介绍。

(1)基于 Python 编写的脚本

这个脚本的原理是通过 Ganglia 提供的数据汇总端口来获取数据,然后将获取到的数据与指定的阈值进行对比,以判断服务是否异常。脚本内容如下:

#!/usr/bin/env python
import sys
import getopt
import socket
import xml.parsers.expat
class GParser:
    def __init__(self, host, metric):
    self.inhost =0
    self.inmetric = 0
    self.value = None
    self.host = host
    self.metric = metric
  def parse(self, file):
    p = xml.parsers.expat.ParserCreate()
    p.StartElementHandler = parser.start_element
    p.EndElementHandler = parser.end_element
    p.ParseFile(file)
    if self.value == None:
      raise Exception('Host/value not found')
    return float(self.value)
  def start_element(self, name, attrs):
    if name == "HOST":
      if attrs["NAME"]==self.host:
        self.inhost=1
    elif self.inhost==1 and name == "METRIC" and attrs["NAME"]==self.metric:
        self.value=attrs["VAL"]
  def end_element(self, name):
    if name == "HOST" and self.inhost==1:
        self.inhost=0
def usage():
  print """Usage: check_ganglia_metric \
-h|--host= -m|--metric= -w|--warning= \
-c|--critical= """
  sys.exit(3)
if __name__ == "__main__":
################################################################################
  ganglia_host = '127.0.0.1'
  ganglia_port = 8651
  host = None
  metric = None
  warning = None
  critical = None
  try:
    options, args = getopt.getopt(sys.argv[1:],
      "h:m:w:c:s:p:",
      ["host=", "metric=", "warning=", "critical=", "server=", "port="],
      )
  except getopt.GetoptError, err:
     print "check_gmond:", str(err)
     usage()
     sys.exit(3)
  for o, a in options:
    if o in ("-h", "--host"):
       host = a
    elif o in ("-m", "--metric"):
       metric = a
    elif o in ("-w", "--warning"):
       warning = float(a)
    elif o in ("-c", "--critical"):
       critical = float(a)
    elif o in ("-p", "--port"):
       ganglia_port = int(a)
    elif o in ("-s", "--server"):
       ganglia_host = a
  if critical == None or warning == None or metric == None or host == None:
    usage()
    sys.exit(3)
  try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ganglia_host,ganglia_port))
    parser = GParser(host, metric)
    value = parser.parse(s.makefile("r"))
    s.close()
  except Exception, err:
    print "CHECKGANGLIA UNKNOWN: Error while getting value \"%s\"" % (err)
    sys.exit(3)
if critical > warning:
   if value >= critical:
    print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value)
    sys.exit(2)
   elif value >= warning:
    print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value)
    sys.exit(1)
   else:
    print "CHECKGANGLIA OK: %s is %.2f" % (metric, value)
    sys.exit(0)
else: 
  if critical >= value: 
    print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value) 
    sys.exit(2) 
  elif warning >= value: 
    print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value) 
    sys.exit(1) 
  else: 
    print "CHECKGANGLIA OK: %s is %.2f" % (metric, value) 
    sys.exit(0)

在这个脚本中,需要修改的地方有两个,分别是 ganglia_host 和 ganglia_port。ganglia_host 表示 gmetad 服务所在服务器的 IP 地址,Ganglia 可以和 Centreon 安装到一起,也可以分开部署,当 Ganglia 和 Centreon 安装在一起时,这个值就是“127.0.0.1”。ganglia_port 表示 gmetad 收集数据汇总的交互端口,默认是 8651。

将此脚本命名为 check_ganglia_metric.py,然后放到 Centreon 存放 nagios 插件的目录下,默认为/usr/lib64/nagios/plugins,并授予可执行权限。接着介绍此脚本的用法。

在命令行直接执行 check_ganglia_metric.py 脚本,即可获得使用帮助:

[root@centreonserver plugins]# python check_ganglia_metric.py
Usage: check_ganglia_metric -h|--host= -m|--metric= -w|--warning= -c|--critical= 

下面分别介绍其中各个参数的意义。

- -h:表示从哪台主机上提取数据,后跟主机名或 IP 地址。这里需要注意的是,Ganglia 默认将收集的数据存放在 gmetad 配置文件中“rrd_rootdir”参数指定的目录下,如果被监控的主机没有主机名或主机名没有进行 DNS 解析,那么 Ganglia 就会用此主机的 IP 地址作为目录名来存储收集的数据,反之,就会以主机名作为存储数据的目录名称。因此,这里的“-h”参数就要以 Ganglia 存储 rrd 数据的目录名称为准。下面是 Ganglia 收集到的 rrd 数据的存储结构:

[root@centreonserver bestjob]# pwd
/data/rrdsdata/rrds/bestjob
[root@centreonserver bestjob]# ls
192.168.11.188       host0080.bestjob.com        host0078.bestjob.com
192.168.16.10        host0022.bestjob.com        host0065.bestjob.com
[root@centreonserver bestjob]# cd 192.168.11.188
[root@centreonserver 192.168.11.188]# ls
cpu_num.rrd     cpu_system.rrd   disk_free.rrd
load_five.rrd   mem_cached.rrd   mem_total.rrd
cpu_speed.rrd   cpu_user.rrd     disk_total.rrd
load_one.rrd    mem_free.rrd     part_max_used.rrd

- -m:表示要收集的指标值,例如 cpu_num、disk_free、cpu_user、disk_total、load_one、part_max_used 等,这些指标值可以在 Ganglia 存储 rrd 数据的目录中找到,也可以在 Ganglia 的 Web 界面中查找到。

- -w:表示警告的阈值,当此脚本收集的指标值低于或者高于指定的警告阈值时,此脚本就会发出报警通知,同时此脚本返回状态值 1。

- -c:表示故障阈值,当此脚本收集到的指标值低于或者高于指定的故障阈值时,此脚本就会发出故障通知,同时此脚本返回状态值 2。

下面演示一下此脚本的用法,这里以检测 host0080.bestjob.com 主机的磁盘剩余空间为例,其他指标值以此类推:

[root@centreonserver plugins]# ./check_ganglia_metric.py \
> -h host0080.bestjob.com -m disk_free -w 1000 -c 500
CHECKGANGLIA OK: disk_free is 3045.75
[root@centreonserver plugins]# echo $?
0
[root@centreonserver plugins]# ./check_ganglia_metric.py \
> -h host0080.bestjob.com -m disk_free -w 3045 -c 3000
CHECKGANGLIA WARNING: disk_free is 3043.68
[root@centreonserver nagios]# echo $?
1
[root@centreonserver plugins]# ./check_ganglia_metric.py \
> -h host0080.bestjob.com -m disk_free -w 3050 -c 3045    
CHECKGANGLIA CRITICAL: disk_free is 3044.55
[root@centreonserver plugins]# echo $?
2
[root@centreonserver plugins]# ./check_ganglia_metric.py \
> -h host0080.bestjob.com -m part_max_used -w 90 -c 95
    CHECKGANGLIA OK: part_max_used is 81.70

前三个例子主要用来检测磁盘的剩余空间。在检测磁盘剩余空间时使用的是“disk_free”这个指标,这个“disk_free”是 host0080.bestjob.com 主机所有磁盘剩余空间的总和,指标单位为 GB。脚本的执行过程为:如果剩余磁盘空间正常,将输出 OK 字样,同时输出剩余磁盘空间量,并返回状态值 0;如果检测磁盘处于 WARNING 状态,将返回状态值 1;如果检测磁盘处于 CRITICAL 状态,将返回状态值 2。这其实就是 nagios 下状态检测脚本的基本写法,nagios 就是通过脚本的返回状态值来判断服务处于何种状态。

接着看最后一个例子,这个例子用到了“part_max_used”这个指标。这个指标表示磁盘分区的最大使用率,单位是百分比,它用来输出系统中磁盘分区使用率的最大值。这个指标非常有用,经常用来判断系统中某个磁盘分区是否已满。在这个例子中,指定 WARNING 状态的阈值是 90%,CRITICAL 状态的阈值是 95%,也就是当系统磁盘最大使用率达到 95%时将发出 CRITICAL 报警。

最后,登录 Ganglia 的 Web 界面,查看 host0080.bestjob.com 主机的“disk_free”和“part_max_used”状态图,检查一下通过 Python 脚本输出的值是否和 Ganglia 生成的状态图一致,如图 9-3 所示。

从图 9-3 可以看出,通过 Python 提取到的数值和 Ganglia 生成的状态图基本一致,如果要查看更详细的统计,可以单击上图进入详细统计页面。在这个详细页面中,可以查看每小时、每天、每周的磁盘状态统计图。另外,通过图 9-3 还可以发现,统计的指标值“disk_free”和“part_max_used”就在状态图的左上角,并配有指标含义解释。

图 9-3 Ganglia 生成的磁盘状态图

(2)基于 PHP 编写的脚本

这个脚本的原理是通过调用 Ganglia 的 Ganglia Web 页面来获取信息,因此它的功能十分强大,几乎可以获取 Ganglia 收集的任何数据。脚本内容如下:

#!/usr/bin/php
<?php
################################################################################
$GANGLIA_WEB="/var/www/html/ganglia";
################################################################################
define("CACHEDATA", 1);
define("CACHEFILE",     "/tmp/nagios/ganglia_metrics");
define("CACHETIME",     45); // How long to cache the data in seconds
if ( $argc !=5 ) {
   echo( "Usage:  $argv[0] <hostname> <metric> <less|more|equal|notequal> 
<critical_value> ie.
        $argv[0] server1 disk_free less 10
        less, more and equal specify whether we mark metric critical if it is less,
 more or equal than critical value
Exiting ....\n");
   exit(3);
}
# To turn on debug set to 1
$debug = 0;
$host = $argv[1];
$metric_name = $argv[2];
$operator = $argv[3];
$critical_value = $argv[4];
global $metrics;
if(CACHEDATA == 1 && file_exists(CACHEFILE)){
        // check for the cached file
        // snag it and return it if it is still fresh
        $time_diff = time() - filemtime(CACHEFILE);
        $expires_in = CACHETIME - $time_diff;
        if( $time_diff < CACHETIME){
                if ( $debug == 1 ) {
                echo("DEBUG: Fetching data from cache. Expires in " . $expires_in . " seconds.\n");
                }
                $metrics = unserialize(file_get_contents(CACHEFILE));
        }
}
if ( ! is_array( $metrics ) ) {
  if ( $debug == 1 ) {
                  echo("DEBUG: Querying GMond for new data\n");
  }
  include_once "$GANGLIA_WEB/conf.php";
  # Set up for cluster summary
  $context = "cluster";
  include_once "$GANGLIA_WEB/functions.php";
  include_once "$GANGLIA_WEB/ganglia.php";
  include_once "$GANGLIA_WEB/get_ganglia.php";
  # Put the serialized metrics into a file
  file_put_contents(CACHEFILE, serialize($metrics));
}
# Get a list of all hosts
$ganglia_hosts_array = array_keys($metrics);
$host_found = 0;
# Find a FQDN of a supplied server name.
for ( $i = 0 ; $i < sizeof($ganglia_hosts_array) ; $i++ ) {
 if ( strpos(  $ganglia_hosts_array[$i], $host ) !== false  ) {
 $fqdn = $ganglia_hosts_array[$i];
 $host_found = 1;
 break;
 }
}
# Host has been found in the Ganglia tree
if ( $host_found == 1 ) {
  # Check for the existence of a metric
  if ( isset($metrics[$fqdn][$metric_name]['VAL']) ) {
    $metric_value = $metrics[$fqdn][$metric_name]['VAL'];
  } else {
    echo($metric_name . " UNKNOWN - Invalid metric request for this host. Please
 check metric exists.");
    exit(3);
  }
  $ganglia_units = $metrics[$fqdn][$metric_name]['UNITS'];
  if ( ($operator == "less" && $metric_value > $critical_value) || ( $operator == "more" && $metric_value < $critical_value ) || ( $operator == "equal" && trim($metric_value) != trim($critical_value) ) || ( $operator == "notequal" && trim($metric_value) == trim($critical_value) ) ) {
   print $metric_name . " OK - Value = " . $metric_value . " " . $ganglia_units;
   exit (0);
  } else {
    print $metric_name . " CRITICAL - Value = ". $metric_value . " " . $ganglia_units;
    exit (2);
  } 
} else {
   echo($metric_name . " UNKNOWN - Hostname info not available. Likely invalid hostname");
   exit(3);
}
?>

在这个脚本中,需要修改的是“$GANGLIA_WEB”变量的值,此变量用来指定 Ganglia Web 的程序路径,这里是/var/www/html/ganglia,可根据环境进行修改。另外,此脚本调用了 Ganglia Web 程序中的 functions.php、ganglia.php、get_ganglia.php、conf.php 四个 PHP 文件,要确保这四个文件的路径正确。

将此脚本命名为 check_ganglia_metric.php,然后放到 Centreon 中存放 nagios 插件的目录下,默认为/usr/lib64/nagios/plugins,并授予可执行权限。接下来介绍此脚本的用法。

在命令行直接执行 check_ganglia_metric.php 脚本,即可获得使用帮助:

[root@centreonserver plugins]# ./check_ganglia_metric.php
Usage: check_ganglia_metric.php <hostname> <metric> <less|more|equal|notequal> <critical_value>

下面分别介绍其中各个参数的含义。

- hostname:表示从哪台主机上提取数据,与 check_ganglia_metric.py 脚本的“-h”参数含义相同,这里不再解释。

- metric:表示要收集的指标值,与 check_ganglia_metric.py 脚本的“-m”参数含义相同,也不再说明。

- less|more|equal|notequal:表示判断的标准,分别表示小于、大于、等于、不等于,是与指定阈值对比的一个条件。

- critical_value:表示故障阈值,当满足指定的阈值条件时,将进行 CRITICAL 状态的报警。

下面演示一下此脚本的用法,这里以检测 host0080.bestjob.com 主机的磁盘、内存信息为例,操作过程如下:

[root@centreonserver plugins]# ./check_ganglia_metric.php \
> host0080.bestjob.com disk_free less 10
disk_free OK - Value = 2610.908 GB 
[root@centreonserver plugins]# ./check_ganglia_metric.php \
> host0080.bestjob.com part_max_used more 95
part_max_used OK - Value = 84.6 %
[root@centreonserver plugins]# ./check_ganglia_metric.php \  
> host0080.bestjob.com mem_free less 100000
mem_free OK - Value = 668912 KB

首先看第一个例子,利用 disk_free 这个指标检测主机 host0080.bestjob.com 主机剩余的磁盘空间,其中的告警阈值为 10,单位是 GB,表示磁盘剩余空间低于 10GB 时将发出报警通知。从输出结果发现此主机的磁盘剩余空间还有 2610.908GB,因此检测结果为 OK 状态。从这个例子可以看出,这个 PHP 脚本在输出结果的同时还输出了结果对应的单位,这个功能非常有用。

其次看第二个例子,通过 part_max_used 这个指标检测主机 host0080.bestjob.com 磁盘分区的最大使用率,其中告警阈值 95 是个百分比,意思是当磁盘占用率超过 95%时将发出报警。而通过检测结果发现此主机最大磁盘占用率为 84.6%,因此,检测结果为 OK 状态。

最后看第三个例子,通过 mem_free 指标检测 host0080.bestjob.com 空闲的物理内存量,从输出结果可知,此主机剩余内存高于指定的告警阈值。

9.4.2 实现 Ganglia 与 Centreon 完美整合

上面介绍了两个常用的数据抽取脚本及其用法,这两个脚本各有优缺点,在实际应用中可以配合使用。要实现对主机的监控报警,最简单的方法是将上面例子中的操作命令写到一个脚本中,然后将这个脚本放到系统守护进程中,定期执行脚本检测即可,但是这种方法不够灵活,无法设定详细的联系人和联系人组,并且维护也不方便。

由于 Centreon 底层调用的是 nagios,因此将这些脚本作为 nagios 的插件,即可实现灵活的报警设置和便捷的管理。接下来以 check_ganglia_metric.php 脚本为例,演示如何将此脚本集成到 Centreon 平台中,将其他脚本集成到 Centreon 的方法与此完全相同。

Ganglia 和 Centreon 可以分开独立部署在两台服务器上,也可以部署在一台服务器上,这里设定 Ganglia 和 Centreon 部署在一台服务器上。结合前面介绍的 Centreon 知识,在监控服务器的 Centreon Web 界面,选择“Configuration→Commands→Checks”,然后单击“Add”新建一个 Command,如图 9-4 所示。

图 9-4 创建一个名为 check_ganglia_php 的 Command

在图 9-4 中,创建了一个名为 check_ganglia_php 的 Command,选择“Command Type”为“Check”。接着重点看“Command Line”的内容,其中,“$USER1$”就是 Centreon 服务器上 nagios 监控插件的路径,默认是“/usr/lib64/nagios/plugins”,前面已经把这个监控脚本放到了此路径下,这里直接引用即可。在这个脚本对应的参数中定义了三个参数变量“$ARG1$”、“$ARG2$”和“$ARG3$”,分别用于指定 Ganglia metric、警告条件和 CRITICAL 阈值。这里建议将每个参数变量的作用都在“Argument Descriptions”选项中做个描述,以保证在添加服务时不容易出错。

这样,就将 check_ganglia_metric.php 脚本作为一个命令集成到 Centreon 中了。接下来演示如何通过这个脚本检测一批主机的磁盘空间最大占用率。首先在 Centreon Web 界面选择“Configuration→Services→Services by host group”,单击“Add”添加一个主机组服务,如图 9-5 所示。

图 9-5 添加一个名为 check_disk_group 的主机组服务

这里先看一下“Service Configuration”标签中的几个选项:“Description”就是监控服务的名称,这里定义为“check_disk_group”;“Service Template”是指定服务的模板,这里仍然选择“generic-service”;“Check Command”选项用来指定服务检查的命令,从下拉菜单中选择刚才创建的命令“check_ganglia_php”即可;最后一个选项“Args”就是刚才创建 check_ganglia_php 命令时指定的三个变量,根据每个变量的含义,依次填写 Ganglia metric、警告条件和 CRITICAL 阈值。

接下来看报警通知的设置,如图 9-6 所示。

在图 9-6 中,“Notification Enabled”选项表示是否启用报警通知,这里选择“Yes”。“Implied Contacts”选项表示指定报警联系人,如果某些服务仅需要通知很少的人员,可以在这里指定对应的报警联系人。如果报警联系人很多,一个一个添加就显得非常麻烦,后续的增加、删除报警联系人都非常繁琐,此时可以使用“Implied Contact Groups”选项,将不同类型的联系人分组,然后指定需要接收报警信息的联系人组即可,这样整个联系人组下的所有人员都能收到报警邮件了。

图 9-6 check_disk_group 服务中报警通知的设置

此外,“Notification Interval”选项用来设置发送报警通知的时间间隔,这个值应该大于或等于图 9-5 中为“Normal Check Interval”选择的值。“Notification Period”表示报警周期,建议选择 7×24 的生成环境。“Notification Type”表示发送什么类型的报警通知,经常选择的有 Warning、Critical、Recovery 等,可以根据具体环境来选择。最后一个选项“First notification delay”表示发生故障后推迟多久发送报警通知,如果输入 0,那么表示故障发生后立刻发送报警通知,可根据情况进行设置。

下面继续看“Relations”标签,如图 9-7 所示。

图 9-7 指定需要监控的主机组

如果需要监控很多主机的同一个服务时,向主机一个一个添加服务就变得十分烦琐,此时通过添加主机组的方式,一次性完成主机组下所有主机的监控,简单而灵活。

“Relations”标签可以用来指定要监控的主机组,在图 9-7 左边的主机组列表中选择要监控的主机组即可,这里选择 bestjob.com 主机组。在完成所有设置后,单击“Save”保存退出,check_disk_group 服务添加完成。

至此,已经完成 check_ganglia_metric.php 脚本和 Centreon 的集成,其实也就是 Ganglia 和 Centreon 的集成,而这个脚本就是两者集成的桥梁而已。

在完成所有配置后,需要重启 Centreon 服务,这样所有的配置和修改才能生效。在重启 Centreon 服务后,查看 check_disk_group 服务的运行状态,如图 9-8 所示。

从图 9-8 中可以看出,bestjob.com 主机组中包含了四台主机,每台主机的磁盘最大占用率都处于正常状态,并且输出了目前磁盘最大占用率的比值。由此可知,check_ganglia_metric.php 脚本集成到 Centreon 后工作正常,完美实现了从 Ganglia 采集数据,在 Centreon 中设置报警规则的监控、报警一体化过程。

图 9-8 check_disk_group 服务运行状态

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。