设为首页 收藏本站
查看: 1480|回复: 0

[经验分享] zabbix应用之Low-level discovery监控磁盘IO

[复制链接]

尚未签到

发表于 2015-11-23 13:04:23 | 显示全部楼层 |阅读模式

原文  http://qicheng0211.blog.iyunv.com/3958621/1599776



zabbix自带的“Template OS Linux”模板支持监控已挂载的磁盘空间利用率,是利用LLD(Low-level discovery)实现的,却没有对磁盘IO监控。本篇文章就介绍利用zabbix LLD功能监控磁盘IO的方法。


思路:首先创建Discovery rules,在agent端配置对应的UserParameter,调用编写好的shell脚本,动态查找出已经挂载的磁盘分区;然后创建Item prototypes,使用 vfs.dev.read[device,<type>,<mode>]和vfs.dev.write[device,<type>,<mode>] 来监控磁盘分区的IO,包括磁盘读写速率、每秒读写扇区数、每秒读写操作数;然后创建Graph prototypes,生成磁盘IO图表。



效果图:



DSC0000.jpg


DSC0001.jpg


DSC0002.jpg


DSC0003.jpg


下面给出具体监控步骤:



一、编写脚本查找已挂载的磁盘分区



1)在zabbix客户端创建查找磁盘分区的脚本 mount_disk_discovery.sh ,放到 /etc/zabbix/monitor_scripts 目录下,内容如下:


#!/bin/bash
#Function: low-level discovery mounted disk
#Script_name: mount_disk_discovery.sh
mount_disk_discovery()
{
  local regexp=&quot;\b(btrfs|ext2|ext3|ext4|jfs|reiser|xfs|ffs|ufs|jfs|jfs2|vxfs|hfs|ntfs|fat32|zfs)\b&quot;
  local tmpfile=&quot;/tmp/mounts.tmp&quot;
  :> &quot;$tmpfile&quot;
  # 过滤所有已挂载的文件系统
  ls /dev/mapper | grep -v control > &quot;$tmpfile&quot;
  local num=$(cat &quot;$tmpfile&quot; | wc -l)
  printf '{\n'
  printf '\t&quot;data&quot;:[ '
  while read line;do
    # 磁盘分区名称
    DEV_NAME=$(echo /dev/mapper/`(echo $line | awk '{print $1}')`)    # 文件系统名称,即磁盘分区的挂载点
    FS_NAME=$(echo $line | awk '{print $2}')
    # blockdev命令获取扇区大小,用于计算磁盘读写速率
    SEC_SIZE=$(sudo /sbin/blockdev --getss $DEV_NAME 2>/dev/null)
    printf '\n\t\t{'
    printf &quot;\&quot;{#DEV_NAME}\&quot;:\&quot;${DEV_NAME}\&quot;,&quot;
    printf &quot;\&quot;{#FS_NAME}\&quot;:\&quot;${FS_NAME}\&quot;,&quot;
    printf &quot;\&quot;{#SEC_SIZE}\&quot;:\&quot;${SEC_SIZE}\&quot;}&quot;
    ((num--))
    [ &quot;$num&quot; == &quot;0&quot; ] && break
    printf &quot;,&quot;
  done < &quot;$tmpfile&quot;
  printf '\n\t]\n'
  printf '}\n'
}
case &quot;$1&quot; in
  mount_disk_discovery)
    &quot;$1&quot;
    ;;
  *)
    echo &quot;Bad Parameter.&quot;
    echo &quot;Usage: $0 mount_disk_discovery&quot;
    exit 1
    ;;
esac


脚本首先过滤 /proc/mounts 中的磁盘类型,然后输出包含磁盘名称、文件系统名称和扇区大小的Json数据。


2)设置相关文件权限:


touch /tmp/mounts.tmp
chown zabbix:zabbix /tmp/mounts.tmp
chown -R zabbix:zabbix /etc/zabbix/monitor_scripts
chmod 755 /etc/zabbix/monitor_scripts/mount_disk_discovery.sh

3)测试一下:


[root@localhost ~]# /etc/zabbix/monitor_scripts/mount_disk_discovery.sh mount_disk_discovery
{
&quot;data&quot;:[
{&quot;{#DEV_NAME}&quot;:&quot;/dev/sda3&quot;,&quot;{#FS_NAME}&quot;:&quot;/&quot;,&quot;{#SEC_SIZE}&quot;:&quot;512&quot;},
{&quot;{#DEV_NAME}&quot;:&quot;/dev/sda2&quot;,&quot;{#FS_NAME}&quot;:&quot;/boot&quot;,&quot;{#SEC_SIZE}&quot;:&quot;512&quot;}
    ]
}

上面的数据表示,磁盘分区/dev/sda3挂载到了根目录,扇区大小为512B;/dev/sda1挂载到了/boot目录,扇区大小为512B。



二、配置zabbix客户端



1)编辑zabbix agent配置文件,设置Include目录:


Include=/etc/zabbix/zabbix_agentd.d/

agent启动时会自动加载Include目录下的配置文件。


2)在/etc/zabbix/zabbix_agentd.d/目录下建立 disk_lld.conf ,内容如下:


UserParameter=mount_disk_discovery,/bin/bash /etc/zabbix/monitor_scripts/mount_disk_discovery.sh mount_disk_discovery

表示:建立用户自定义参数 mount_disk_discovery ,当zabbix server向agent请求这个item key时,agent会调用/etc/zabbix/monitor_scripts/mount_disk_discovery.sh脚本,返回json数据。


3)由于zabbix agent的启动用户是zabbix,所以要授权zabbix用户无密码运行/sbin/blockdev命令。使用visudo命令,在/etc/sudoers里注释掉Defaults requiretty:


#Defaults requiretty

并在最后面加上:


zabbix ALL=(ALL)       NOPASSWD: /sbin/blockdev

这样在脚本里执行类&#20284;“sudo /sbin/blockdev --getss /dev/sda1”这样的指令就没问题了。


4)最后重启zabbix agent


/etc/init.d/zabbix-agent restart

5)测试一下:


我们从zabbix server上远程get一下mount_disk_discovery


DSC0004.jpg


如上图DEV_NAME、FS_NAME、SEC_SIZE都有&#20540;,说明客户端配置正确。



三、配置zabbix前台



1)登录zabbix前台,选择Configuration->Templates->Import,导入“Template Linux DiskIO”模板(见附件)。


2)进入主机配置界面,链接“Template Linux DiskIO”模板


DSC0005.jpg


至此,全部配置结束了,耐心等待监控数据的出现吧~


下面介绍下模板里LLD的配置。


3)模板的Discovery rule介绍


Discovery rule的Key为 mount_disk_discovery ,对应zabbix agent配置里的:


UserParameter=mount_disk_discovery,/bin/bash /etc/zabbix/monitor_scripts/mount_disk_discovery.sh mount_disk_discovery

每隔一段时间,server会向agent请求mount_disk_discovery,然后agent调用/etc/zabbix/monitor_scripts/mount_disk_discovery.sh脚本,返回json数据给server。


DSC0006.jpg


4)模板的Item prototypes介绍


DSC0007.jpg


其中Sectors和Operations的监控项都是Zabbix agent类型的。通过阅读zabbix C源码,我们会发现 zabbix agent是根据/proc/diskstats文件计算每秒Sectors和Operations,默认取一分钟内的平均&#20540; 。有兴趣的同学可以读一读src/libs/zbxsysinfo/linux/diskio.c。


磁盘读写speed监控项是Calculated类型的,通过每秒读写扇区数乘以扇区大小计算而来的,见下图:


DSC0008.jpg


5)模板的Graph prototypes介绍


模板对每个磁盘分区都建立三个图表,包括磁盘读写速率图表、读写扇区数图表、读写操作数图表。


DSC0009.jpg


附:客户端一键配置脚本


#!/bin/sh
#
# Filename:autoMonitorDiskIO.sh
# Date:2014/01/05
# Author:  Qicheng
# Website: http://qicheng0211.blog.iyunv.com/
# Description: 部署zabbix low-level discovery 监控磁盘IO
# Notes: 在被监控客户端运行此脚本,前提条件已经安装好zabbix agent
#
ROOT_UID=0
if [ &quot;$UID&quot; -ne &quot;$ROOT_UID&quot; ];then
  echo &quot;Error: Please run this script as root user.&quot;
  exit 1
fi
# 自行修改为你的zabbix agent配置文件路径
AGENT_CONF=&quot;/etc/zabbix/zabbix_agentd.conf&quot;
mkdir -p /etc/zabbix/monitor_scripts
# 创建 low-level discovery mounted disk 脚本
cat > /etc/zabbix/monitor_scripts/mount_disk_discovery.sh << 'EOF'
#!/bin/bash
#Function: low-level discovery mounted disk
#Script_name: mount_disk_discovery.sh
mount_disk_discovery()
{
  local regexp=&quot;\b(btrfs|ext2|ext3|ext4|jfs|reiser|xfs|ffs|ufs|jfs|jfs2|vxfs|hfs|ntfs|fat32|zfs)\b&quot;
  local tmpfile=&quot;/tmp/mounts.tmp&quot;
  :> &quot;$tmpfile&quot;
  egrep &quot;$regexp&quot; /proc/mounts > &quot;$tmpfile&quot;
  local num=$(cat &quot;$tmpfile&quot; | wc -l)
  printf '{\n'
  printf '\t&quot;data&quot;:[ '
  while read line;do
    DEV_NAME=$(echo $line | awk '{print $1}')
    FS_NAME=$(echo $line | awk '{print $2}')
    SEC_SIZE=$(sudo /sbin/blockdev --getss $DEV_NAME 2>/dev/null)
    printf '\n\t\t{'
    printf &quot;\&quot;{#DEV_NAME}\&quot;:\&quot;${DEV_NAME}\&quot;,&quot;
    printf &quot;\&quot;{#FS_NAME}\&quot;:\&quot;${FS_NAME}\&quot;,&quot;
    printf &quot;\&quot;{#SEC_SIZE}\&quot;:\&quot;${SEC_SIZE}\&quot;}&quot;
    ((num--))
    [ &quot;$num&quot; == 0 ] && break
    printf &quot;,&quot;
  done < &quot;$tmpfile&quot;
  printf '\n\t]\n'
  printf '}\n'
}
case &quot;$1&quot; in
  mount_disk_discovery)
    &quot;$1&quot;
    ;;
  *)
    echo &quot;Bad Parameter.&quot;
    echo &quot;Usage: $0 mount_disk_discovery&quot;
    exit 1
    ;;
esac
EOF
touch /tmp/mounts.tmp
chown zabbix:zabbix /tmp/mounts.tmp
chown -R zabbix:zabbix /etc/zabbix/monitor_scripts
chmod 755 /etc/zabbix/monitor_scripts/mount_disk_discovery.sh
# 判断配置文件是否存在
[ -f &quot;${AGENT_CONF}&quot; ] || { echo &quot;ERROR: File ${AGENT_CONF} does not exist.&quot;;exit 1;}
include=`grep '^Include' ${AGENT_CONF} | cut -d'=' -f2`
# 在配置文件中添加自定义参数
if [ -d &quot;$include&quot; ];then
  cat > $include/disk_lld.conf << 'EOF'
UserParameter=mount_disk_discovery,/bin/bash /etc/zabbix/monitor_scripts/mount_disk_discovery.sh mount_disk_discovery
EOF
else
  grep -q '^UserParameter=mount_disk_discovery' ${AGENT_CONF} || cat >> ${AGENT_CONF} << 'EOF'
UserParameter=mount_disk_discovery,/bin/bash /etc/zabbix/monitor_scripts/mount_disk_discovery.sh mount_disk_discovery
EOF
fi
# 授权zabbix用户无密码运行/sbin/blockdev命令
chmod &#43;w /etc/sudoers
sed -i '/^Defaults\s\&#43;requiretty/s/^/#/' /etc/sudoers
grep -q '^zabbix ALL=(ALL).*blockdev' /etc/sudoers || echo 'zabbix ALL=(ALL)   NOPASSWD: /sbin/blockdev' >> /etc/sudoers
chmod 440 /etc/sudoers
# 重启agent服务
[ -f '/etc/init.d/zabbix-agent' ] && /etc/init.d/zabbix-agent restart || echo &quot;需手动重启zabbix agent服务.&quot;


本文出自 “启程的Linux博客” 博客,转载请与作者联系!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-142645-1-1.html 上篇帖子: zabbix的安装和配置 下篇帖子: 关于zabbix设置的进一步说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表