系统监控仪表板

作者:John Ouellette

大约一年来,我的公司一直在努力推出监控解决方案。误报和不准确的下班后页面影响了士气并浪费了系统管理员的时间。在与一些同事讨论了我们真正需要监控的内容之后,归结为以下几点

  • Web 服务器——通过 HTTP,而不仅仅是物理服务器。

  • 磁盘空间。

  • SMTP 服务器的可用性——通过 SMTP,而不仅仅是物理服务器。

  • 这些事件的历史记录,用于诊断和查明问题。

本文解释了我开发的流程,以及我如何快速简单地设置磁盘、Web 和 SMTP 监控。保持监控过程简单意味着使用的所有工具都应该在最新的 Linux 发行版上可用,并且不应使用高级协议,例如 SNMP 或数据库技术。因此,我的所有脚本都使用 Bash shell、基本 HTML、一些适度的 Perl 和 wget 实用程序。所有这些监控脚本都共享相同的通用框架和安装步骤,并且可以从Linux Journal FTP 站点获得(请参阅在线资源)。

安装脚本涉及几个步骤。首先将脚本复制到 Web 服务器,并使用以下命令使其成为全局可执行文件chmod然后,在 Web 服务器的根目录下创建一个目录,脚本可以在其中写入其日志和历史记录。我为 monitor_web.sh 使用了 webmon。其他脚本类似:我为 monitor_smtp.sh 使用了 smtpmon,为 monitor_stats.pl 使用了 stats。monitor_disk.sh 与其他脚本不同,因为它是唯一一个安装在您要监控的每台服务器上的脚本。

接下来,在 cron 中调度脚本。您可以使用任何能够运行 wget、df -k 和 top 的用户运行每个脚本。用户还需要具有写入脚本主目录的能力。我建议创建一个名为 monitor 的本地用户,并通过该用户的 crontab 调度这些脚本。最后,如果您的 Linux 发行版上尚未安装 wget,请安装它。

我的第一个挑战是通过 HTTP 监控 Web 服务器,所以我选择了 wget 作为引擎并在其周围编写了脚本。生成的脚本是 monitor_web.sh。对于那些不熟悉 wget 的人,其作者将其描述为“一个使用 HTTP、HTTPS 和 FTP(最广泛使用的 Internet 协议)检索文件的免费软件包”(请参阅资源)。

安装后,monitor_web.sh 只需要用户、电子邮件收件人和要监控的 URL 这两个选择,这些都已清楚地标记出来。URL 必须符合 HTTP 标准并返回有效的http 200 OK字符串才能工作。它们可以是 HTTP 或 HTTPS,因为 wget 和 monitor_web.sh 都支持这两种协议。首次安装并运行后,用户可以访问 https:///webmon/webmon.html 并在 Web 浏览器中查看 URL、上次结果和历史记录,因为它们都是链接。

现在,让我们分解一下脚本;请参阅 LJ FTP 站点上提供的 monitor_web.sh。首先,我设置了系统实用程序和 wget 程序的所有变量。这些可能会在您的系统上更改。接下来,我们确保我们已连接到网络。这确保了如果监控 URL 的服务器脱机,Sendmail 不会排队大量警报,直到服务器重新联机。

当我在所有 URL 中循环时,我让 wget 连接两次,超时时间为五秒。我这样做两次是为了减少误报。如果网站宕机,脚本会为收件人生成电子邮件消息并更新网页。当站点恢复正常运行时,也会发送邮件。脚本只发送一条消息,这样我们就不会让收件人不堪重负。这是通过以下代码实现的

wget $URL  2>>   $WLOG

if (( $? != 0 ));then

  echo \<A HREF\="$URL"\>$URL\<\/A\> is down\

          $RTAG $EF.\
          $LINK Last Result $LTAG  >> $WPAGE

  if [[ ! -a down.$ENV ]];then

        touch /tmp/down.$ENV
        mail_alert down

  else
         echo Alert already sent for $ENV \
         - waiting | tee -a $WLOG
  fi

fi

如果您选择不使用图形,我已在脚本中包含绿色和红色文本的 HTML。同样,完整脚本可从 Linux Journal FTP 站点获得。

A System Monitoring Dashboard

图 1. 运行中的 monitor_web.sh。从 cron 运行脚本以根据需要重新生成此页面。

在处理完 Web 服务器之后,就该处理磁盘监控了。为了忠实于我们保持简单的理念,我选择创建一个脚本,该脚本将从 cron 运行,并根据以下输出向我的团队发出警报df -k结果是 monitor_disk.sh。脚本中第一个真正的代码块设置了文件系统列表

FILESYSTEMS=$(mount | grep -iv proc |\
grep -iv cdrom | awk'{print $3}')

我忽略了 proc,并注意不要报告 CD-ROM,以防我的队友将光盘放入驱动器中。然后,脚本将 Use% 的值与两个值 THRESHOLD_MAX 和 THRESHOLD_WARN 进行比较。如果 Use% 超过其中任何一个,脚本会向相应的收件人 RECIPIENT_MAX 或 RECIPIENT_WARN 生成电子邮件。请注意,我确保每个文件系统的 Use% 值都使用以下行解释为整数

typeset -i  UTILIZED=$(df -k $FS | tail -1 | \
awk '{print $5}' | cut -d"%" -f1)

设置了一个邮件列表,其中包含我的团队成员的电子邮件地址和值班人员的电子邮件地址,以接收关键电子邮件和页面。您可能需要对您的邮件服务器软件执行相同的操作,或者您可以简单地将您的组或寻呼机用作两个地址。

由于我们的文件系统往往很大,大约 72GB–140GB,我已将关键警报设置为 95%,因此我们在收到警报时仍有一些时间来解决问题。您可以使用 THRESHOLD_MAX 和 THRESHOLD_WARN 变量设置您自己的阈值。此外,我们的数据库服务器运行一些磁盘密集型作业,并且可能会生成大量存档日志文件,因此我认为每 15 分钟监控一次是一个不错的频率。对于文件系统活动较少的服务器,每小时一次就足够了。

我们的第三个脚本 monitor_smtp.sh 监控我们的 SMTP 服务器发送邮件的能力。它与前两个脚本类似,只是找到了一种直接连接到用户定义的 SMTP 服务器的方法,以便我可以循环遍历服务器列表并发送一封邮件。这就是 smtp.pl 的用武之地。它是一个 Perl 脚本(清单 1),它使用 NET::SMTP 模块将邮件发送到 SMTP 地址。大多数最新的发行版都已经安装了此模块(请参阅“我是否安装了该 Perl 模块?”边栏)。Monitor_smtp.sh 根据 smtp.pl 执行的传输是否成功来更新定义的网页。没有尝试向我们的组发出警报,因为这是一个故障排除工具,如果服务器宕机,它无法依赖 SMTP 发送邮件,这很讽刺。monitor_smtp.sh 的未来版本可能包含轮循功能,并且能够通过已知的正常工作的 SMTP 服务器发送警报。

清单 1. smtp.pl 测试通过 SMTP 服务器发送的邮件。

#!/usr/bin/perl -w
#
# Title  :   smtp.pl
# Author :   John_Ouellette@yahoo.com
# Files  :   smtp.pl
# Pupose :   Send email through SMTP server
#            Called from monitor_smtp.sh
#
# Submit as

use Net::SMTP;

my $rcpt   = $ARGV[2] || 'mygroup@somewhere';
my $sender = $ARGV[1] || 'root@host01';
my $host   = $ARGV[0];


#Start Script

my $smtp =Net::SMTP->new($host, Debug => 1);
my $input="test msg for server $host";

$smtp->mail("$sender");
$smtp->to("$rcpt");
$smtp->data();
$smtp->datasend("To: $rcpt\n") ;
$smtp->datasend("From: $sender\n") ;
$smtp->datasend("Subject: $host test\n") ;
$smtp->datasend("$input");
$smtp->dataend();
$smtp->quit;

我是否安装了该 Perl 模块?

检查是否安装了任何 Perl 模块的简单方法是从命令行发出以下命令

$ perl -e "use Net::SMTP";

如果没有任何输出,则说明您已安装该模块。如果您缺少该模块,您会收到如下错误

$perl -e "use Net::OTHER";
Can't locate Net/OTHER.pm in @INC (@INC contains:
/usr/lib/perl5/5.8.3/i386-linux-thread-multi /usr/lib/perl5/5.8.3
/usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at -e line
1.
BEGIN failed--compilation aborted at -e line 1.

此错误表明缺少有问题的模块。

最后,我们来看一下我们的统计脚本 monitor_stats.pl。此脚本登录到每台主机并运行以下命令

df -k
swapon -s
top -n 1 | head -n 20
hostname
uptime

然后,它在浏览器中显示结果(图 2)并将结果保存在日志中,再次按文件系统上的日期排序。它充当一个简单的仪表板,提供每台服务器的快速统计信息。

这种监控设计的好处是三方面的

  1. 我们拥有 CPU、磁盘和交换使用率的历史记录,并且可以轻松查明可能发生问题的位置。

  2. 减少了为每台服务器提取此信息的繁琐打字工作。这在下班前解决潜在问题,避免晚上被呼叫时非常方便。

  3. 管理层可以快速了解我们的工作情况。

我们在此脚本中使用了不安全的 rsh 协议来向您展示如何快速设置它,但我们建议您使用 SSH 和正确分发的密钥来提高安全性。

A System Monitoring Dashboard

图 2. 运行中的 monitor_stats.pl

结论

通过使用这个新的系统监控仪表板,我的团队的生产力得到了提高,并且他们对监控的信心也大大增强,因为我们不再浪费时间追查误报。系统性能的历史记录在诊断问题时确实节省了时间。最后,简单的安装使具有基本技能的用户可以在一个工作日内解决复杂的系统管理问题。

本文资源: /article/8269

John Ouellette 是一位拥有九年 Microsoft Windows NT 和 UNIX 经验的系统管理员。他认为命令行是王者,并且热爱意大利式茄子鸡排。可以通过 john_ouellette@yahoo.com 联系他。

加载 Disqus 评论