telegraf 使用 inputs.exec插件收集监控数据

telegraf (v1.5.2)虽然好用但是默认情况下并不能帮你收集好所有你需要的数据,比如io数据,默认情况下只收集了iotime, iops_in_process, weighted_io_time, read, write等相关数据,并不能收集到每个盘的iops, await, svctm, util 等数据,最近正好有这个需求,查了下官网telegraf可以支持用户自定义脚本收集监控数据上传到infulxdb,下面直奔主题吧

1,自己写脚本收集好每块盘的iops, await, svctm, util , collect_iostat.sh脚本内容如下

#/bin/bash

devname=(`lsblk| grep 'disk'|awk '{print $1}'`)
dirname=(`lsblk| grep 'disk'|awk '{if ($7=="") print "/";else print $7}'`)
#当时想用字典格式存储这些目录名,后来改为变量方式,shell的[ ] { } * @ $特殊字符会让你抓狂
#declare -A devdict
devnum=`expr ${#devname[@]} - 1`
for i in `seq 0 $devnum`;do
  if [-z "${dirname[$i]}" ];then
    eval ${devname[$i]}="/"
  else
    eval ${devname[$i]}="${dirname[$i]}"
  fi
  #devdict+=([${devname[$i]}]="${dirname[$i]}")
done
#echo ${!devdict[*]}
#echo ${devdict[*]}

ioarry=`iostat -x | grep sd|awk '{print "datadir=${"$1"}@r="$4",w="$5",await="$10",svctm="$11",util="$12}'`
for i in ${ioarry[@]};do
  eval temp="${i}"
  #替换特殊字符@,shell中空格会截断为两个元素
  temp=${temp/@/ }
  echo "exec,${temp}"
  #保证最后输出如下格式,第一个字端是measurements名,如果inputs.exec插件中有配置name_suffix会自动加上后缀
  #输出格式为measurements名, 逗号, tag keys(逗号分隔),空格,filed keys(逗号分隔)
  #数据格式输出不匹配会导致telegraf解析不了数据上到influxdb失败,调试的时候卡了很久,没细看官网给自己挖的坑 
  #exec,datadir=/data/data11 r=4.1,w=6.1,await=0.83,svctm=1.35,util=1.46" 
done 
#echo ${devdict[@]}

2,telegraf.conf文件中新增[[inputs.exec]]的插件

[[inputs.exec]]
  ##Commands array
  commands = ["bash /appcom/telegraf/collect_iostat.sh",]
  timeout='5s'
  ##measurements 的后缀
  name_suffix="_collectiostat"
  data_format="influx"

3,可以telegraf --debug一下结果

4,启动telegraf后,去influxdb中查看结果即可

 

posted @ 2019-05-26 16:32  .狂飙的蜗牛  阅读(4191)  评论(0编辑  收藏  举报