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中查看結果即可