溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

根據(jù)urlooker的推送數(shù)據(jù),生成應(yīng)用存活報表(反正感覺很傻~)

發(fā)布時間:2020-09-13 21:08:55 來源:網(wǎng)絡(luò) 閱讀:369 作者:就是一小白 欄目:系統(tǒng)運維

一、要求

? ? 最近公司大佬要求將應(yīng)用每天的存活狀態(tài),輸出成報表的形式,每天以郵件的方式發(fā)送給他們。報表里面要輸出:應(yīng)用名、應(yīng)用所在服務(wù)器IP、應(yīng)用掛掉的時間點、應(yīng)用掛掉的持續(xù)時間。


二、環(huán)境介紹

????我們公司用的監(jiān)控系統(tǒng),是小米的open-falcon,而app-alive的監(jiān)控是用小米推薦的urlooker,urlooker監(jiān)控的模式,是每分鐘將應(yīng)用狀態(tài)推送到open-falcon。而我們這邊又用自己拿框架開發(fā)的ops系統(tǒng),ops直接調(diào)用open-falcon的接口,在ops里面,可以看到應(yīng)用存活的狀態(tài),且ops.app_detail表記錄了應(yīng)用id(唯一標識)及應(yīng)用名。所以一開始我的想法是:去ops記錄應(yīng)用狀態(tài)的表直接查詢。結(jié)果去查詢才發(fā)現(xiàn),ops有兩張表是記錄跟應(yīng)用狀態(tài)有關(guān)的數(shù)據(jù)。一張記錄的是應(yīng)用down掉持續(xù)時間聚合后的信息,一張記錄的是1天、30天應(yīng)用的存活率。。。。這根本跟我要的東西不一樣,所以最后思考半天,我決定直接去urlooker拿取數(shù)據(jù)。


關(guān)于urlooker數(shù)據(jù)庫:

? ?有兩張表跟app-alive有關(guān):urlooker.strategy和 urlooker.item_status00,第一張表有兩個字段有用:urlooker.strategy.ops_cp_app_id(與ops.app_detail.id一一對應(yīng))和urlooker.strategy.environment(區(qū)分測試、預(yù)發(fā)布、release環(huán)境),第二張表urlooker.item_status00即是urlooker每分鐘push的數(shù)據(jù),這張表默認保存12小時的數(shù)據(jù)。



三、查詢urlooker數(shù)據(jù)庫獲取數(shù)據(jù)源

通過跨庫聯(lián)表查詢,獲取所需的數(shù)據(jù)源,我這里查詢的結(jié)果是所有 result不為0即應(yīng)用掛掉狀態(tài)的信息,并通過組內(nèi)排序輸出。


SELECT
????????ops.app_detail.app_name,
????????urlooker.item_status00.sid?AS?sid,
????????urlooker.strategy.ops_cp_app_id,
????????urlooker.item_status00.ip,
????????urlooker.strategy.note,
????????urlooker.item_status00.result,
????????ROUND(?urlooker.item_status00.push_time?)?AS?down_time,
????????FROM_UNIXTIME(?urlooker.item_status00.push_time?)?AS?new_time?
FROM
????????urlooker.item_status00
????????LEFT?JOIN?urlooker.strategy?ON?urlooker.item_status00.sid?=?urlooker.strategy.id
????????LEFT?JOIN?ops.app_detail?ON?ops.app_detail.id?=?urlooker.strategy.ops_cp_app_id?
WHERE
????????urlooker.strategy.environment?=?"release"?
????????AND?urlooker.item_status00.result?<>?"0"?
ORDER?BY
????????sid?DESC,
????????down_time?DESC;





本來我想直接通過sql取做定時任務(wù),但是關(guān)于數(shù)據(jù)源的計算及處理,實在不知道咋整(吃了沒技術(shù)的虧啊,應(yīng)該用存儲過程可以實現(xiàn))。所以直接將數(shù)據(jù)源導(dǎo)出,用shell去處理。






四、處理數(shù)據(jù)源


編寫shell腳本,處理數(shù)據(jù)源:

#?cat?send_app_alived.sh?
#!/bin/bash
DataInputPath=/home/app-alive/source.txt
DataOutputPath=/home/app-alive/$(date?+%F)-output.csv
#data?
mysql?-uops_ro?-pxxxx?-e?"source?/home/app-alive/select.sql"?>?$DataInputPath??2>/dev/null
app_id=$(awk?'{?print?$2}'?$DataInputPath?|grep?-v?sid|uniq)
if?[?!?-f?"$DataOutputPath"?];
then
??echo?"應(yīng)用名,服務(wù)器IP,應(yīng)用停止時間,停止持續(xù)時間"?>?$DataOutputPath
fi
for?id?in?$app_id
do
??down_time=$(awk?'{if($2=='$id')?print?$7}'?$DataInputPath)
??app_name=$(awk?'{if($2=='$id')?print?$1}'?$DataInputPath|uniq)
??app_ip=$(awk?'{if($2=='$id')?print?$4}'?$DataInputPath|uniq)
??down_time_num=$(awk?'{if($2=='$id')?print?$7}'?$DataInputPath|wc?-l)
??if?[?"$down_time_num"?-eq?"1"?];
??then
????G_time=$(date?-d?"1970-01-01?UTC?$down_time?seconds"?+"%Y-%m-%d?%H:%M")
????echo?"$app_name,$app_ip,$G_time,1分鐘"?>>?$DataOutputPath
??else
????sum=0
????count=0
????for?i?in?$down_time
????do
??????sum=$((i-sum))
??????if?[?$sum?-ne?-60?]?&&?[?$sum?-ne?$i?];
??????then
???????G_time=$(date?-d?"1970-01-01?UTC?$down_sum?seconds"?+"%Y-%m-%d?%H:%M")
???????echo?"$app_name,$app_ip,$G_time,${count}分鐘"?>>?$DataOutputPath
???????count=0
??????fi
??????if?[?$count?-eq?0?];
??????then
????????down_sum=$i
??????fi
??????count=$((count?+?1))
??????sum=$i
????done
????if?[?$count?-eq?1?];
????then
??????G_time=$(date?-d?"1970-01-01?UTC?$down_sum?seconds"?+"%Y-%m-%d?%H:%M")
??????echo?"$app_name,$app_ip,$G_time,1分鐘"?>>?$DataOutputPath
????fi
??fi
done


這個腳本處理完后,輸出的結(jié)果為:





# cat 2019-10-24-output.csv

用名,服務(wù)器IP,應(yīng)用停止時間,停止持續(xù)時間

app01,10.25.100.36,2019-10-24 02:21,1分鐘

app01,10.81.126.19,2019-10-24 02:17,1分鐘

app02,10.81.126.19,2019-10-24 10:43,14分鐘

......




但是這里輸出的只是12小時的數(shù)據(jù),所以加個計劃任務(wù):


59 11,23 * * * /usr/bin/bash /home/app-alive/send_app_alived.sh




五、python腳本發(fā)送郵件


網(wǎng)上隨便找個python腳本,修改下:

#?cat?sendmail.py
#?!/usr/bin/env?python
#?-*-?coding:?utf-8?-*-
import?smtplib
import?email.mime.multipart
import?email.mime.text
from?email.mime.text?import?MIMEText
from?email.mime.multipart?import?MIMEMultipart
from?email.mime.application?import?MIMEApplication
from?email.mime.multipart?import?MIMEMultipart
from?email.mime.base?import?MIMEBase
import?email
import?base64
import?time
import?os

class?send_mail:
def?__init__(self,?From,?To,?pw,?file_path,?file_header,?file_body):
#?發(fā)送人
self.From?=?From
#?收件人['aaa@a.com','bbb@a.com']
self.To?=?list(To)
#抄送人
#?self.Cc?=?list(Cc)
#?登錄郵件密碼base64.encodestring('明文')加密后密碼
self.pw?=?pw
#?文件具體路徑(路徑+文件名稱)
self.file_path?=?file_path
#?標題頭
self.file_header?=?file_header
#?內(nèi)容
self.file_body?=?file_body

def?login(self):
server?=?smtplib.SMTP('smtp.qq.com')
server.starttls()
#?pwd?=?base64.decodestring(self.pw)
server.login(self.From,?self.pw)
try:
receive?=?self.To
#receive.extend(self.Cc)
server.sendmail(self.From,self.To,self.atta())
finally:
server.quit()

def?atta(self):
main_msg?=?MIMEMultipart()
#?內(nèi)容
text_msg?=?MIMEText(self.file_body)
main_msg.attach(text_msg)
try:
contype?=?'application/octet-stream'
maintype,?subtype?=?contype.split('/',?1)

data?=?open(self.file_path,?'rb')
file_msg?=?MIMEBase(maintype,?subtype)
file_msg.set_payload(data.read())
data.close()
email.encoders.encode_base64(file_msg)
basename?=?os.path.basename(self.file_path.split('/')[-1])
file_msg.add_header('Content-Disposition',?'attachment',?filename=basename)
main_msg.attach(file_msg)
except?Exception?as?ret:
print(ret)

main_msg['From']?=?self.From
main_msg['To']?=?";".join(self.To)
#?main_msg['Cc']?=?";".join(self.Cc)

#?標題頭
main_msg['Subject']?=?self.file_header
main_msg['Date']?=?email.utils.formatdate()

fullText?=?main_msg.as_string()

return?fullText


if?__name__?==?'__main__':
fileTime?=?time.strftime("%Y-%m-%d",?time.localtime())
s?=?send_mail('9426096@qq.com',?['1224877@qq.com','xiang.yi@ai.com'],'jshntbmbejj',?"/home/app-alive/"+fileTime+"-output.csv",?'應(yīng)用存活記錄',?'')
s.login()

	
????print('發(fā)送成功!')





好了,就完成了。。。。雖然實現(xiàn)了,但是感覺好傻的樣子,open-falcon不好用啊,公司趕緊招個運維開發(fā)吧,我好難~~









向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI