一、需求
計算業務日誌內乙個介面請求的響應時間和超過1.5秒的數量,這裡需要兩個結果,因為有時間戳,打算每分鐘執行一次指令碼,計算上一分鐘的日誌資訊。結果會傳到falcon後由grafana展示
下面就是展示的結果,這是乙個彙總圖,三個節點,每個節點2個值,一共展示6個監控指標的資料,左側是響應時間,右側是超過1.5秒的數量
二、分享指令碼內容如下
#!/usr/bin/env python
import os
import time
import commands
import requests
import json
import sys
import datetime
time = time.strftime(
"%y-%m-%d"
, time.localtime())
logtime =
(datetime.datetime.now(
)+datetime.timedelta(minutes=-1
)).strftime(
"%y-%m-%d %h:%m"
)hosts =
['node01'
,'node02'
,'node02'
]var = sys.ar**[1]
for host in hosts:
str1 =
"grep \"\" /home/***.log.|grep |awk -f = ''"
.format
(logtime=logtime,time=time,host=host,
str=
"end"
) str2 =
"grep \"\" /home/***.log.|awk -f = '$1~\"\" && $nf>1500'|wc -l"
.format
(logtime=logtime,time=time,host=host)
if var ==
"restime"
:str
= str1
elif var ==
"timeoutnum"
:str
= str2
print
strclass
monitor()
:def
__url
(self)
: value1 = commands.getoutput(
str)
value = value1.split(
".")[0
]if value.isdigit():
value = value
else
: value =
int(0)
return value
def__falcon
(self,value)
: payload_list =
ts =
int(time.time())
temp_dict =
print temp_dict
requests.post(
"", data=json.dumps(payload_list)
)def
go(self)
: result = self.__url(
) self.__falcon(result)
value = monitor(
) value.go(
)
三、說明time = time.strftime(
"%y-%m-%d"
, time.localtime(
))
這行是使用伺服器本地時間,格式為2019-01-01這樣的格式,用於匹配檔名字尾,如***.log.2019-01-01
logtime =
(datetime.datetime.now(
)+datetime.timedelta(minutes=-1
)).strftime(
"%y-%m-%d %h:%m"
)
這行是取當前時間上一分鐘的時間,格式是2019-01-01 12:00,用於後面匹配日誌時間戳,寫shell使用的是下面的方法實現
# date --date="-1 minute" +%y-%m-%d
2019-01-17
上面的時間函式是最近接觸的,後面很多運維工作需要這樣的方法
hosts =
['node01'
,'node02'
,'node02'
]
這行是hosts列表,假設現在有三個節點,那麼我需要知道每個節點的監控資料,後面採用for迴圈讀取列表內容
var = sys.ar**[
1]
讀取指令碼的第乙個引數,這裡針對兩個監控指標分別設定乙個引數,分別是restime、timeoutnum,代表響應時間和超時數量。
for host in hosts:
str1 =
"grep \"\" /home/***.log.|grep |awk -f = ''"
.format
(logtime=logtime,time=time,host=host,
str=
"end"
) str2 =
"grep \"\" /home/***.log.|awk -f = '$1~\"\" && $nf>1500'|wc -l"
.format
(logtime=logtime,time=time,host=host)
使用for迴圈讀取hosts列表,因為後面上報資料的時候要帶著節點資訊,所以每次處理日誌的時候需要搜尋日誌內的節點資訊和監控資料,下面就是兩個命令,目前分析日誌只會這麼用,囧!
if var ==
"restime"
:str
= str1
elif var ==
"timeoutnum"
:str
= str2
print
str
判斷引數,如果restime就用str1分析日誌,如果是timeoutnum就用str2分析日誌
value1 = commands.getoutput(
str)
value = value1.split(
".")[0
]
第一行是使用系統的命令,返回處理的結果
第二行是對取出的值進行分割,由於值是浮點數,所以用「.」分割取第一部分內容就是整數,這是split函式的用法,第一列[0],第二列[1],以此類推,當然如果不符合格式取出來有可能是其它資訊,後面會進行判斷
if value.isdigit():
value = value
else
: value =
int(0)
return value
這是乙個if判斷,看結果是否是整數。如果是整數value就不變,如果不是整數,那麼賦值為0,由於介面不是每分鐘都呼叫,所以一很多時候使用awk是報錯了,那麼這時候就認為沒有值,所以是0
temp_dict =
注意這裡endpoint的後面的host是個變數,就是上面for迴圈裡面取到的hosts值,這樣在falcon就可以區分出來各個節點的監控資料了
下面的內容就是falcon上報的方法,網上很多介紹就是照葫蘆畫瓢,這裡就不做介紹了
四、結果展示
cron裡面的配置,每分鐘一次上報到falcon
* * * * * cd /home/shell;python ***.py restime;python ***.py timeoutnum
一分鐘sed入門(一分鐘系列)
1.簡介 sed是一種行編輯器,它一次處理一行內容。2.sed呼叫方式 sed options command file s sed options f scriptfile file s 第一種直接在命令列中執行,第二種把命令寫到了指令碼中,二者無本質區別。示例 1 列印hello.txt的內容 ...
一分鐘看懂mysql 一分鐘,看懂易貨
從20世紀80年代開始,易貨公司在美國加拿大 澳大利亞等國興起,成為這些國家減少現金用量 增加銷售 減少庫存 開發新客戶 開闢新市場 促進經濟發展的重要產業。也成為了企業消化庫存商品 剩餘生產能力 無形資產的有效方式和在遭遇資金瓶頸時的新選擇。2015年以來,中國線下易貨店開始了矇眼狂奔,在河南南陽...
一分鐘管理
有效而優秀管理者的 三板斧 一分鐘管理 你和下屬一起設定 一分鐘目標 確保他們知道自己應該做什麼,以及好的工作表現是什麼樣的。之後,你會努力發現他們做對了什麼事,好對他們進行 一分鐘稱讚 最後,如果你們完全有能力做好某件事,卻沒能做好,你就對他們進行 一分鐘批評 一分鐘目標 1.擬定3 5 個目標,...