二维码

使用Monit和RRDtool进行裸骨骼监视

1314 人阅读 | 时间:2020年01月03日 13:55

如何为低端系统提供强大的监视。

在运行关键系统时,有必要知道系统正在消耗哪些资源,当资源利用率达到特定水平时要发出警报,并有发展长期性能的趋势。Zabbix和Nagios是监视,警报和趋势系统性能的两个大型解决方案,它们各自提供了丰富的用户界面。但是,由于这些解决方案的要求,通常需要专用的硬件/ VM资源来承载监视解决方案。对于较小的服务器实现,存在用于提供基本监视,警报和趋势功能的选项。本文说明如何使用Monit完成基本和自定义的监视和警报。它还介绍了如何使用RRDtool监视系统性能的长期趋势。

初始监控配置

在许多流行的Linux发行版中,您可以从关联的软件存储库中安装Monit。安装后,您可以使用monitrc配置文件处理所有配置。该文件通常位于/ etc目录结构中,但是确切位置根据您的分发而有所不同。

配置文件分为两部分:全局和服务。全局部分允许对Monit应用程序进行自定义配置。Monit服务包含一个基于Web的前端,可以通过配置文件进行完全配置。尽管默认情况下该部分已被注释掉,但是您可以有选择地取消注释项目以进行精细的自定义。Web配置块如下所示:

set httpd port 2812 and
    use address localhost
    allow localhost
    allow admin:monit

第一行设置端口号,您可以在其中通过Web浏览器访问Monit。第二行设置用于访问Monit的主机名(HTTP主机头)。第三行设置可从其访问Monit应用程序的主机。请注意,如果当前有防火墙,也可以使用本地防火墙访问限制来执行此操作。第四行允许配置用于访问Monit的用户名/密码对。还有一部分允许SSL选项用于与Monit的加密连接。尽管建议在传递身份验证数据时启用SSL,但也可以通过现有Web服务器(例如nginx或Apache)对Monit进行反向代理,前提是该Web服务器上已配置了SSL。有关通过Apache反向代理Monit的更多信息,

您需要启用的下一项涉及配置电子邮件警报。要设置通过其将电子邮件中继到收件人的电子邮件服务器,请添加或启用以下行:

set mailserver mailserver.company.com

请注意,如果正在运行本地SMTP服务器,则mailserver.company.com本示例中的服务器名称 可能会替换为 localhost

下一个启用的块设置将发送的电子邮件警报消息的内容,其外观类似于以下内容:

set mail-format {
  from:    Monit <monit@$HOST>
  subject: Monit alert --  $EVENT $SERVICE
  message: $EVENT Service $SERVICE
                Date:        $DATE
                Action:      $ACTION
                Host:        $HOST
                Description: $DESCRIPTION
                Your faithful employee,
                Monit}

在此块中,使用不同的预定义变量来提供特定于警报的信息(以$符号表示)。您可以在“发件人”,“主题”或“消息”字段中修改文本,还可以根据需要向消息字段添加其他数据。

要完成警报功能,您可以通过添加以下行来配置将接收来自Monit的所有电子邮件警报的电子邮件地址:

set alert user@domain.com

此时,指定的电子邮件地址将接收Monit生成的所有警报。但是,到目前为止,尚未配置任何警报。要开始配置警报,首先让我们看一下前面提到的“服务”部分。该部分提供了本地计算机的一些基本监视功能,包括CPU,内存,交换,文件系统和基本网络监视。这些配置项均提供了阈值的定义。达到阈值后,可以采取措施,包括发送警报。例如,CPU /内存/交换监视的开箱即用警报如下所示:

check system $HOST
   if loadavg (1min) > 4 then alert
   if loadavg (5min) > 2 then alert
   if cpu usage > 95% for 10 cycles then alert
   if memory usage > 75% then alert
   if swap usage > 25% then alert

同样,请注意使用变量来定义要监视的主机。尽管此处定义的所有触发器都会产生警报,但也可以采取其他措施。有关这些设置的更多信息,请查阅Monit文档(请参阅参考资料)。

自定义Monit

初始配置完成后,您可以定义自定义警报。最好在monitrc文件之外定义自定义警报。您可以通过在monitrc文件中定义一个include目录来做到这一点,如下所示:

include /opt/monit-custom/*

此行包括/ opt / monit-custom文件夹中的所有配置文件。

接下来,让我们看一下两种监视类型:主机检查和程序检查。主机检查允许监视远程主机上运行的基于TCP的服务。尽管可以为更简单的服务进行基本的TCP端口连接测试,但是Monit还提供了对特定URL进行基于HTTP的内容检查的功能。考虑以下示例:

check host linuxjournal-website with address www.linuxjournal.com
    if failed
        port 443 protocol https
        with request / with content = "Become a Patron"
    then alert

主机检查的第一行定义了该主机在Monit中的标识符(linuxjournal-website)和将用于访问该主机的地址(www.linuxjournal.com)。在此示例中,主机定义中的触发器包含多个条件:必须使用https协议通过端口443访问触发器,并且在根URL上访问触发器时,响应主体中将显示文本“成为赞助人”。可以将该检查重新配置为使用端口80和http协议。

与主机监视一起,Monit允许定义基于脚本的监视器,这称为程序检查。一旦在Monit中配置了脚本,该脚本将定期执行,并根据脚本的退出代码采取措施。

这是一个脚本示例,可在SSL证书到期日期在指定的天数内时发出警报:

#!/bin/bashdomainexpiredate() {
    openssl x509 -text -in <(echo -n | \
    openssl s_client -connect $1:$2 2>/dev/null | \
    sed -n '/-*BEGIN/,/-*END/p') 2>/dev/null | sed -n 's/
 ↪*Not After : *//p'}daysleft() {
    echo "((($(date -d "$(domainexpiredate $1 $2)" +%s)-$(date
 ↪+%s))/24)/60)/60" | bc}defaultport() {
    if [ -z "$1" ]; then
        echo "443"
    else
        echo "$1"
    fi}[[ $(daysleft $2 $(defaultport $3)) -le $1 ]] && exit 1 ||
 ↪exit 0

该脚本使用两个参数执行:到期前的最短天数和服务器的主机名,端口号的可选第三个参数。这是脚本的示例执行:

$ checkcertexpire.sh 31 www.linuxjournal.com$ echo $?0

当使用两个必需的参数执行脚本时,没有控制台输出。执行后,如果回显了返回码(标识为$?),则该值为0,表示该域在31天内没有过期。在Monit中配置此项目需要满足以下条件:

check program linuxjournal-ssl with path
 ↪"/etc/monit/scripts/checkcertexpire.sh 31 www.linuxjournal.com"
    if status != 0 then alert

与主机检查相同,程序检查在Monit中有一个标识符(linuxjournal-ssl在本例中为)。在程序的第一行中,检查和标识符一起是要与命令行参数一起执行的脚本。请注意,触发器指示如果退出代码不为0,则应发送警报。

使用RRDtool收集数据

RRDtool是一个非常强大的工具,可让您长时间收集数据。RRDtool以其数据库格式(循环数据库)命名,将基于时间的数据保存到其数据库中,然后让您检索和绘制数据图。RRDtool可以绘制可通过命令显示给Shell脚本的任何数据的图形。

在捕获数据之前,您必须初始化数据库。对于此示例,让我们创建一个数据库来捕获五分钟的平均负载。这是初始化此特定数据库的命令:

rrdtool create loadavg_db.rrd --step 60
 ↪DS:loadavg:GAUGE:120:0:10000 RRA:MAX:0.5:1:1500

前两个参数指示loadavg_db.rrd 正在创建一个名为的数据库 --step参数定义了数据采样之间的预期时间间隔。在这种情况下,两次采样之间的间隔预计为60秒。

让我们分别看看另外两个参数。这两个参数中的第一个以开头, DS并定义了一个名为的数据集loadavg请注意,此数据集的选项用冒号分隔。GAUGE关键字说,当读取数据时,它会被写入到数据库是(不变)。120以秒为单位的超时等待数据写入到数据库中。如果未在该窗口内将数据写入数据库,则将零写入数据库以指示数据馈送中的错误。010000是最小的,并且可以被写入数据库最大值。以开头的参数 RRA 定义循环归档值。这定义了可以在数据库中存储多少值以及它们将存储多长时间。的 MAX 表示该变量包含一个值,不应以任何方式对其进行修改。0.5表示初始分辨率值。这是一个标准值,不应更改。1识别多少个步骤应存储的最终值时进行平均。在这种情况下,数据库中存储的每个值只有一个步进值。最后一个参数 1440是数据库中将存储多少步。由于步长为60秒,因此此配置将提供25个小时的数据存储在数据库中。

现在数据已初始化,您可以捕获数据并将其存储在数据库中。为了保持准确的定期数据收集,最好创建一个crontab条目,并以所需的时间间隔收集数据。对于此示例,您将使cron作业每分钟运行一次。要收集数据并将其放入数据库,请使用以下命令:

rrdtool update loadavg_db.rrd --template loadavg N:$(cat
 ↪/proc/loadavg | sed 's/^\([0-9\.]\+\) .*$/\1/g')

为了执行数据收集,使用了update参数以及数据库名称。--template参数允许您指定变量名称以填充数据。这与loadavg初始化数据库时定义的变量相同N参数定义的数据被放入loadavg变量。在这种情况下,命令替换的结果将被放入数据库中,这将是五分钟的平均负载。可以将此命令放置在crontab中,以便每分钟执行一次。crotab条目如下所示:

* * * * * /path/to/rrdtool-script.sh

由于所有时间字段都包含星号,因此指定的脚本将每分钟运行一次。填充数据库后,可以使用以下命令呈现图形:

rrdtool graph loadavg_graph-$(date +"%m-%d-%Y").png \-w 785 -h 120 -a PNG \--slope-mode \--start -86400 --end now \--font DEFAULT:7: \--title "5-minute load average" \--watermark "`date`" \--vertical-label "load average" \--lower-limit 0 \--right-axis 1:0 \--x-grid MINUTE:10:HOUR:1:MINUTE:120:0:%R \--alt-y-grid --rigid \DEF:loadaverage=loadavg_db.rrd:loadavg:MAX \LINE1:loadaverage#0000FF:"load" \GPRINT:loadaverage:LAST:"Cur\: %5.2lf" \GPRINT:loadaverage:AVERAGE:"Avg\: %5.2lf" \GPRINT:loadaverage:MAX:"Max\: %5.2lf" \GPRINT:loadaverage:MIN:"Min\: %5.2lf\t\t\t"

第一行调用RRDtool图形函数以及要创建的图像文件名。在这种情况下,图像文件名将包含当前日期。所有参数都以--设置图形的外观和感觉开始,包括标签,轴配置,图像格式和提取数据的时间范围。有关这些参数的详细信息,请参见RRDtool文档。

以开头的行DEF:loadaverage定义了一个名为的图形变量loadaverage,该变量将具有loadavg您在数据库中创建变量的值 以开头的线 LINE指定图线的颜色和图例中要使用的标签。这些GPRINT线表示要在图形底部打印的各种统计详细信息。在这种情况下,将显示最后记录的值以及时间范围内的平均值,最小值和最大值。请注意,%5.2lf会将要打印的值指定为浮点数,小数点左边最多5位,右边最多2位。

为了便于捕获每日图形,您还可以将此命令添加到crontab中以每天运行,并输入以下内容:

0 0 * * * /path/to/rrdtool-graph.sh

这将每天在午夜运行图形脚本。现在可以将图像放置在可通过浏览器访问的文件夹中,以方便查看。

尽管存在许多提供健壮的图形用户界面的监视解决方案,但是这些解决方案提供了基本的监视和趋势功能,同时使用最少的系统资源,并提供了用于分发收集的数据的基本框架。

资源资源

Andy Carlson在过去的15年中一直在IT部门工作,负责网络和服务器管理以及偶尔的编码工作。他很庆幸自己选择了自己热爱,成长和学习的职业。他目前与妻子,三个女儿和儿子一起住在俄亥俄州辛辛那提。他的家人目前正在国际上收养两个孩子。他喜欢弹吉他,编码和与家人和朋友共度时光。


©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×