我們都知道Zabbix是一個非常強大的監控工具,我們公司呢也在用Zabbix監控所有網站的狀態。
最近有一個需求,就是我們需要生成一份報告,報告里要包含前一天一整天的時間節點和對應的響應時間,這樣的報告用來統計網站的可用性達到了什么水准。
Zabbix本身自帶報告功能,可是都是圖像的,並沒有數據格式的。雖然沒有提供數據格式的報表,但是Zabbix提供了一套API,可以根據需求獲取對應的數據(JSON格式),於是我就寫了個腳本,用來把每個監控的網址的監控數據輸出到一個CSV文件中。(后續可以用Excel做一個宏去把所有收集到的CSV文件集合成一個XLS文件,這個Excel文件可以下載到:)
PS:服務器上面沒有任何高級編程語言的編譯工具或者運行環境,所以一切數據都用shell腳本去處理。用shell處理Json,蛋疼的不是一點點。。。。。。也有可能是我shell水平過差。。。如果有更好的想法的話請建議一下。謝謝
腳本如下:
1 #!/bin/bash 2 3 ##獲取api的授權碼,后面獲取需要的信息的時候要用到。 4 5 ##先根據官方方法獲取授權,之后會有一段輸出信息,其中包含授權碼,用awk處理一下就能得到那串碼了。 6 authjson=`curl -l -X POST -H 'content-type: application/json' -d '{"jsonrpc":"2.0","method":"user.authenticate","params":{"user":"Admin","password":"zabbix"},"id":1}' http://127.0.0.1/zabbix/api_jsonrpc.php` 7 authstr=`echo $authjson | awk -F "[,:\"]" '{print $11}'` 8 echo $authstr 9 10 ##報告的初始時間和結束時間(前一天的0點到24點) 11 from=`date "+%Y-%m-%d 00:00:00" -d"-1day"` 12 echo $from 13 now=`date "+%Y-%m-%d 00:00:00"` 14 15 ##轉換為Linux時間格式,Zabbix只支持這種格式。 16 from=`date -d "$from" '+%s'` 17 now=`date -d "$now" '+%s'` 18 19 ##每隔監控的網址在數據庫中都有對應的一條記錄,現在直接從數據庫中獲取所有的網址對應的ID。 20 21 ##getID.sql的內容如下: 22 23 ##select items.itemid from items join hosts on (items.hostid=hosts.hostid) where items.description like '%response time%' and hosts.host like '%WebSite%' and items.status=0; (sql文件可以根據實際情況編寫,只要能得到所有受監控網址的ID就好。) 24 25 26 mysql --user=root --password=zabbix zabbix < getMalaysiaID.sql > /etc/scripts/outputMYID.txt 27 28 29 ##mysql命令獲取到的ID是有一個表頭的,去掉。 30 sed '1d' /etc/scripts/outputMYID.txt > /etc/scripts/outputMYID_Daily.txt 31 32 ##清理以前的臨時文件 33 rm -rf /etc/scripts/dailyreports/tmpjson/*.txt 34 35 ##獲取每一個ID對應的網址的歷史監控記錄,Json格式,用時間段來做限定。 36 for i in `cat /etc/scripts/outputMYID_Daily.txt` 37 do 38 jsonstr="{\"jsonrpc\": \"2.0\",\"method\":\"history.get\",\"params\":{\"history\":0,\"itemids\":[\"$i\"],\"time_from\":\"$from\",\"time_till\":\"$now\",\"output\":\"extend\"},\"auth\": \"$authstr\",\"id\": 1}" 39 gethistory="curl -l -X POST -H 'Content-Type: application/json' -d '"$jsonstr"' http://127.0.0.1/zabbix/api_jsonrpc.php" 40 echo $gethistory > /etc/scripts/tmp.sh 41 chmod a+x /etc/scripts/tmp.sh 42 /etc/scripts/tmp.sh > /etc/scripts/dailyreports/tmpjson/$i.txt 43 done 44 45 ##新建一個文件夾!- - 46 now=`date "+%Y%m%d"` 47 mkdir /etc/scripts/dailyreports/dailyreports$now 48 49 ##處理獲取到的Json數據了 50 for i in `ls /etc/scripts/dailyreports/tmpjson/` 51 do 52 rm /etc/scripts/dailyreports/tmp/* 53 54 ##獲取所有的響應時間的記錄 55 56 cat /etc/scripts/dailyreports/tmpjson/$i | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | grep value | grep -o '[0-9]\.[0-9]*' > /etc/scripts/dailyreports/tmp/values 57 58 ##獲取所有的時間節點的記錄 59 cat /etc/scripts/dailyreports/tmpjson/$i | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | grep clock | grep -o '[0-9]*' > /etc/scripts/dailyreports/tmp/clocks_org 60 61 ##獲取到的時間節點要處理成人看的格式。 62 for c in `cat /etc/scripts/dailyreports/tmp/clocks_org` 63 do 64 date -d@$c '+%Y-%m-%d %H:%M:%S' >> /etc/scripts/dailyreports/tmp/clocks_new 65 done 66 67 ##設置新文件的文件名 68 itemidstr=`echo $i | awk -F [.] '{print $1}'` 69 itemname=`mysql --user=root --password=zabbix zabbix -e "select key_ from items where itemid=$itemidstr;" | awk -F [\[,] '{print $2}'` 70 71 ##創建一個報告文件,並且加入表頭 72 echo "Monitored URL:,$itemname," > /etc/scripts/dailyreports/dailyreports$now/$itemidstr.csv 73 echo "Clock,Response Time(s)," >> /etc/scripts/dailyreports/dailyreports$now/$itemidstr.csv 74 75 ##把時間節點的記錄跟響應時間的記錄合成一個文件,並且追加到剛剛的報告文件里。 76 paste -d "," /etc/scripts/dailyreports/tmp/clocks_new /etc/scripts/dailyreports/tmp/values /dev/null >> /etc/scripts/dailyreports/dailyreports$now/$itemidstr.csv 77 78 done 79 80 ##清理臨時文件 81 rm -rf /etc/scripts/dailyreports/tmpjson/*.txt 82 83 ##把所有獲得的報告都收集起來,然后把寫好宏的Excel文件也收集到一起,打包發給需要的人。 84 85 ##到時候在excel文件里會有一堆說明,點擊哪兒哪兒的按鈕就可以得到一份合適的Excel的報告啦。 86 mkdir /etc/scripts/dailyreports/dailyreports$now/csv 87 mv /etc/scripts/dailyreports/dailyreports$now/*.csv /etc/scripts/dailyreports/dailyreports$now/csv/ 88 cp /etc/scripts/dailyreports/README.xls /etc/scripts/dailyreports/dailyreports$now/ 89 cd /etc/scripts/dailyreports/ 90 zip -r dailyreports$now.zip dailyreports$now/ 91 92 cd /root/sendEmail-v1.51 93 94 ./sendEmail –f sender@sender.com -t receiver@receiver.com -u KLDC DMZ1 Daily SLA Report for WebHosting -m KLDC DMZ1 Daily SLA Report For WebHosting -s 192.168.169.23:25 -a /etc/scripts/dailyreports/dailyreports$now.zip 95 96 97 rm -rf /etc/scripts/dailyreports/dailyreports*