在日常使用中,难免发现默认的绘图不太符合我们的需求,这时就可以根据自己的需要通过自定义模板来实现自己想要的绘图效果。
一、自定义模板官方说明
1、模板存放在两个位置
share/template.dist 存放PNP包中的模板
share/template 自定义的模板存放位置
如果显示localhost服务器上http服务的图形,那么PNP将会通过pnp4nagios安装目录下的var/perfdata/localhost/http.xml(这个文件是根据定义服务监控时使用的service_description(监控描述)参数值名自动生成的),在该文件中开头的<TEMPLATE>标签定义部分来决定使用哪个模板来渲染数据。
PNP将自动根据<TEMPLATE>的模板名+php后缀为模板文件名,例如:
localhost服务器上http服务对应的数据xml为:
cd /usr/local/pnp4nagios/var/perfdata
cat localhost/http.xml
<NAGIOS >
<DATASOURCE >
<TEMPLATE > check_http </ TEMPLATE >
<DS > 1 </ DS >
...
</ NAGIOS >
这里PNP将查找check_http.php的模板来渲染数据。
PNP查找模板的顺序如下(pnp4nagios安装目录的share下):
-
- templates/check_http.php
-
- templates.dist/check_http.php
-
- templates/default.php
-
- templates.dist/default.php
其中default.php模板占据特殊位置,因为每次找不到其他适用模板时都会使用它。
- templates.dist/default.php
2、创建自己的模板
PNP模板是PHP文件,在使用PHP函数include()执行PNP时会包含这些文件。这意味着将解释模板中的每个PHP代码,从而可以操纵所有值。
模板必须遵循如下原则:
- 1.必须是有效的php语句
- 2.模板不能产生任何输出
- 3.必须填充两个数组:$opt[]和$def[];这两个数组用于调用‘rrdtool graph‘,因此RRDtool支持的每个选项都是可能的。
这里我们使用相对简单的response.php模板,来描述其中最重要的选项:
<?php
#
$opt[1] = "--title \"Response Time For $hostname / $servicedesc\" ";
#
$def[1] = "DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE " ;
$def[1] .= "AREA:var1#00FF00:\"Response Times \" " ;
$def[1] .= "LINE1:var1#000000 " ;
$def[1] .= "GPRINT:var1:LAST:\"%3.4lg %s$UNIT[1] LAST \" ";
$def[1] .= "GPRINT:var1:MAX:\"%3.4lg %s$UNIT[1] MAX \" ";
$def[1] .= "GPRINT:var1:AVERAGE:\"%3.4lg %s$UNIT[1] AVERAGE \" ";
?>
注意:由于数字1和小写字母‘l‘在此php文件中看起来相似:格式"%3.4lg"包含一个小写字母L。
选项说明:
$opt[1] = "--title …" ==>为第一组数据设置RRDtool选项,这里是你在web图上看到的标题。嵌入式引号使用反斜杠()屏蔽。变量$hostname和$servicedesc是通过PNP调用确定的,也可用于模板。
$def[1] = "DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE "; ==>定义要从哪个RRD文件读取哪些数据。$RRDFILE[1]包含此服务的RRD文件的路径。$DS[1]引用RRD文件中的第一个数据系列。
$def[1] .= "AREA:var1#00FF00:\"Response Times \" "; ==>运算符".="会将更多数据附加到数组$def[1]。将使用来自变量的数据来绘制区域var1。颜色以十六进制符号#00FF00(红色,绿色,蓝色)定义。标签为"响应时间"。
$def[1] .= "LINE1:var1#000000 "; ==>刚绘制的区域完成后,将以黑色(#000000)绘制一条线(LINE1)。
$def[1] .= "GPRINT:var1:LAST:\"%3.4lg %s$UNIT[1] LAST \" ";
$def[1] .= "GPRINT:var1:MAX:\"%3.4lg %s$UNIT[1] MAX \" ";
$def[1] .= "GPRINT:var1:AVERAGE:\"%3.4lg %s$UNIT[1] AVERAGE \" ";
三行GPRINT线构成了图例。当前值使用printf语法格式化。
二、自定义模板使用
设置前默认已经配置好了pnp4nagios服务,并可以正常的出图了;
这里,我们利用默认的localhost的内存监控项来做演示;
设置前内存监控项的绘图结果如下:
接下来我们对它进行改造!!
~
1、查找内存监控项参数的数据xml文件名
查看nagios中localhost.cfg配置文件,找到目标服务配置信息,其定义如下:
less nagios/etc/objects/localhost.cfg
define service{
use local-service,srv-pnp ; Name of service template to use
host_name localhost
service_description Mem Usage
check_command check_local_mem!80!90
}
其中service_description的配置为Mem Usage,那么该内存服务的数据xml文件就该是:Mem_Usage.xml (空格用下划线替换)
2、查找内存监控项使用的绘图模板名
查看pnp4nagios中的check_command.xml文件
说明:这里pnp4nagios安装在/usr/local下
cd /usr/local/pnp4nagios/var/perfdata/localhost/
head -n 10 Mem_Usage.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<NAGIOS>
<DATASOURCE>
<TEMPLATE>check_local_mem</TEMPLATE>
<RRDFILE>/usr/local/pnp4nagios/var/perfdata/localhost/Mem_Usage_Used.rrd</RRDFILE>
<RRD_STORAGE_TYPE>MULTIPLE</RRD_STORAGE_TYPE>
<RRD_HEARTBEAT>8460</RRD_HEARTBEAT>
<IS_MULTI>0</IS_MULTI>
<DS>1</DS>
<NAME>Used</NAME>
其中<TEMPLATE>标签中的值为check_local_mem,那么内存监控项使用的绘图php设置文件为check_local_mem.php
3、查找并修改模板
cd /usr/local/pnp4nagios/share/templates
ls -l
total 8
-rw-r--r--. 1 nagios nagios 1091 Jul 8 2018 check_local_mem.php
-rw-r--r--. 1 nagios nagios 672 Jul 8 2018 Nouse_check_mem.php
发现已经存在check_local_mem.php模板了,那么就直接修改;如果不存在就新建。
vim check_local_mem.php
<?php
#
# Copyright (c) 2006-2010 Joerg Linge (http://www.pnp4nagios.org)
# Plugin: check_load
#
$opt[1] = "--vertical-label Memory -l0 --title \"Memory for $hostname / $servicedesc\" ";
#
#
#
$def[1] = rrd::def("var1", $RRDFILE[1], $DS[1], "AVERAGE");
$def[1] .= rrd::def("var2", $RRDFILE[2], $DS[2], "AVERAGE");
$def[1] .= rrd::def("var3", $RRDFILE[3], $DS[3], "AVERAGE");
$def[1] .= rrd::def("var4", $RRDFILE[4], $DS[4], "AVERAGE");
if ($WARN[1] != "") {
$def[1] .= "HRULE:$WARN[1]#FFFF00 ";
}
if ($CRIT[1] != "") {
$def[1] .= "HRULE:$CRIT[1]#FF0000 ";
}
$def[1] .= rrd::line2("var2", "#006400", "Free ") ;
$def[1] .= rrd::gprint("var2", array("LAST", "AVERAGE", "MAX"), "%6.2lf");
$def[1] .= rrd::area("var4", "#00FF00", "Buffers") ;
$def[1] .= rrd::gprint("var4", array("LAST", "AVERAGE", "MAX"), "%6.2lf");
$def[1] .= rrd::area("var3", "#EA8F00", "Cached : ") ;
$def[1] .= rrd::gprint("var3", array("LAST", "AVERAGE", "MAX"), "%6.2lf");
$def[1] .= rrd::line1("var1", "#EACC00", "Used ") ;
$def[1] .= rrd::gprint("var1", array("LAST", "AVERAGE", "MAX"), "%6.2lf");
?>
编辑后保存即可看到新样式的结果,不需要重启nagios服务。
注意:要确保模板的属主为nagios
修改后的绘图效果如下:
是不是感觉清爽都了~~
完毕!