許多企業(yè)在數(shù)據(jù)記載的各環(huán)節(jié)工作中,幾乎全靠手工完成,費時費力,易出差錯。
例如:在倉庫作業(yè)管理過程中,進(jìn)貨、退貨、出貨、盤點等日常活動全由手工完成,由于填寫瑣碎而復(fù)雜的表格及數(shù)據(jù)重復(fù)填寫,增加了工作量,所以工作容易出錯,效率低下。
面對這種情況,許多企業(yè)都要求引進(jìn)一套計算機管理系統(tǒng),但引進(jìn)了計算機系統(tǒng)之后,才發(fā)現(xiàn)只解決了問題的一半,因為有了計算機軟件的支持,只可以解決有條件放置計算機的工作場合,而無條件放置計算機的工作環(huán)節(jié)中的手工抄寫狀況仍不能解決。
即使計算機解決了部分手工抄寫狀況,但不能改變大量的打印表格的數(shù)據(jù)在下一個計算機作業(yè)點重新輸入時而引發(fā)的瓶頸現(xiàn)象 如果通過用PT923或LK934 采集器設(shè)備,再配置一套行之有效的作業(yè)流程,及時準(zhǔn)確的掌握每單中每個商品的情況。用PT923或LK934對物品進(jìn)行條碼掃描登記。還可以對物品查詢修改。
同時,物品信息通過MODEM直接上傳計算中心。采用采集器設(shè)備后數(shù)據(jù)記載的各環(huán)節(jié)實現(xiàn)了數(shù)據(jù)的自動登錄,避免了數(shù)據(jù)的從新錄入問題。
通過python腳本與linux命令結(jié)合的方式采集服務(wù)器性能數(shù)據(jù)。根據(jù)測試過程中服務(wù)器當(dāng)前的tcp鏈接數(shù)量來決定數(shù)據(jù)采集是否結(jié)束。
腳本主要有三個操作,第一個是性能數(shù)據(jù)初步采集,通過調(diào)用linux的sar和iostat命令,將數(shù)據(jù)寫入原始文件中。采集完成后,執(zhí)行性能指標(biāo)提取腳本,從原始指標(biāo)文件提取有效的數(shù)據(jù)寫入最終的文件中,并進(jìn)行打包操作。
代碼只是本人滿足工作所需而作,算不上很好,可以滿足工作所需,僅此而已
從原始文件提取數(shù)據(jù)的配置文件,根據(jù)服務(wù)器語言類型區(qū)分:
abstractConf_ch.xml—中文
abstractConf_en.xml—英文
配置文件主要是指明原始文件路徑并按照需求使用linux的cat、egrep、awk命令從文件中提取數(shù)據(jù)
《?xml version=‘1.0’ encoding=‘utf-8’?》
《abstract》
《res_file name=“res/CPU”》
《uniqflag》CPU《/uniqflag》
《object_file》result/cpu_status《/object_file》
《graphtitle》Cpu_Status《/graphtitle》
《linelabel》%user %system《/linelabel》
《x_y_label》Time(s) Cpu_Percent(%)《/x_y_label》
《cmd》cat %s | egrep -v “Linux|^$|%s” | awk ‘BEGIN {print “%s %s %s”}{if($2 !~/AM|PM/) print $3,$5}’ 》》 %s《/cmd》
《/res_file》
。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。
《/abstract》12345678910111213
獲取服務(wù)連接數(shù)量
# coding:utf-8
#__author__ = ‘Libiao’
import subprocess
class GetLinkingNumber(object):
def __init__(self):
pass
def getLinkingNumber(serlf,servers):
ret = []
if isinstance(servers,str):
num = subprocess.Popen(“netstat -tnap | grep tcp | grep %s | wc -l” %servers,stdout=subprocess.PIPE,shell=True).stdout
ret.append(int(num.readline().strip()))
elif isinstance(servers,dict):
num = subprocess.Popen(“netstat -tnap | grep tcp | grep %s | wc -l” %v,stdout=subprocess.PIPE,shell=True).stdout
ret.append(int(num.readline().strip()))
else:
pass
return ret123456789101112131415161718192021
需要由主程序執(zhí)行的linux命令
#!/bin/bash
sar -n DEV 10 》》res/NetWork &
iostat -x -d -k 10 》》res/Disk &
sar -r 10 》》res/Memory &
sar -q 10 》》res/System_load_average &
sar -u 10 》》res/CPU &
sar -b 10 》》res/TPS &12345678
數(shù)據(jù)采集代碼主方法
#-*- coding:utf-8 -*-
“”“
reated on 2015年10月16日
@author: LiBiao
”“”
import time,os
import subprocess
import multiprocessing
from write_log import writeLog
import del_old_file
from record_test_data import Record_Data
from server_memory_collect import serverMemoryCollect
from get_linking_number import GetLinkingNumber
#需要手動設(shè)置的參數(shù)
SERVERS_D = {‘1935’:‘srs-rtmp’,‘18080’:‘srs-hls’,‘80’:‘nginx’} #可以輸入srs或者nginx或者ATS
#間隔時間
INTERVAL_TIME = 10
class KPI_Collect(object):
def __init__(self):
self.getLinkNum = GetLinkingNumber()
self.TCP_COUNT = self.getLinkNum.getLinkingNumber(SERVERS_D)
self.tcpRecord = Record_Data(“res/linking_number”)
def getStr(self,alist):
ret = “”
for s in alist:
ret += str(s)
ret += ‘ ’
return [ret.rstrip(‘ ’)]
#通過調(diào)用collect.sh腳本來執(zhí)行服務(wù)器性能數(shù)據(jù)采集
def sys_kpi_collect(self):
flag = ‘1’
cmds = [‘。/collect.sh’]
popen = subprocess.Popen(cmds[0],stdout=subprocess.PIPE,shell=True)
pid = popen.pid
writeLog(‘INFO’,‘》》》》》 性能指標(biāo)采集進(jìn)程執(zhí)行中。。。。?!?/p>
self.to_stop_subprocess(flag,popen)
#停止sys_kpi_collect執(zhí)行的程序的popen句柄
def to_stop_subprocess(self,flag,popen):
curr_tcpnum = self.getLinkNum.getLinkingNumber(SERVERS_D)
self.tcpRecord.recordData([“srs&nginx Linking”,“%s %s %s” %tuple(SERVERS_D.values()),“Time(s) Numbers”])
self.tcpRecord.recordData(self.getStr(self.TCP_COUNT))
if flag is ‘1’:
loops = 0
while True:
if sum(curr_tcpnum) 《= sum(self.TCP_COUNT):
if loops == 15:
#15s內(nèi)當(dāng)前連接數(shù)小于初始化連接數(shù),退出程序
#刪除還存在于系統(tǒng)中的sar和iostat進(jìn)程
names = [‘sar’,‘iostat’]
cmd = “killall -9 %s %s” %tuple(names)
subprocess.call(cmd,shell=True)
#終止子進(jìn)程
popen.kill()
if subprocess.Popen.poll(popen) is not None:
break
else:
writeLog(“INFO”,r“》》》》》 等待子進(jìn)程終止”)
else:
loops += 5
time.sleep(5)
else:
loops = 0
time.sleep(INTERVAL_TIME)#等待INTERVAL_TIME時間
curr_tcpnum = self.getLinkNum.getLinkingNumber(SERVERS_D)
self.tcpRecord.recordData(self.getStr(curr_tcpnum))
writeLog(“INFO”,r“》》》》》 性能指標(biāo)采集完成”)
else:
while True:
if subprocess.Popen.poll(popen) is not None:
break
else:
writeLog(“INFO”,r“》》》》》 等待子進(jìn)程終止”)
writeLog(“INFO”,r“》》》》》 性能指標(biāo)采集完成”)
#判斷系統(tǒng)中是否還存留sar和iostat進(jìn)程
def is_process_exists(self,name):
cmd = “ps ax | grep %s | grep -v grep” %name
p = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
p.wait()
if p.stdout.readline():
return 1
return 0
def main_start(self):
start_times = 0.0
timeRecord = Record_Data(“res/timeConsum”)
for server,num in zip(SERVERS_D.values(),self.TCP_COUNT):
writeLog(“INFO”,r“》》》》》 初始 %s 服務(wù)連接數(shù) %d” %(server,num))
curr_tcpN = self.getLinkNum.getLinkingNumber(SERVERS_D)
time.sleep(10)
while True:
if not sum(curr_tcpN) 《= sum(self.TCP_COUNT):
start_times = time.time()
for server,num in zip(SERVERS_D.values(),curr_tcpN):
writeLog(“INFO”,r“》》》》》 指標(biāo)采集任務(wù)開始,當(dāng)前 %s 連接數(shù) %d” %(server,num))
#刪除舊的kpi文件
del_old_file.Del_Old_File(“res/”).del_old_file()
#單獨線程執(zhí)行其他服務(wù)(srs、nginx等)進(jìn)程內(nèi)存指標(biāo)采集任務(wù)
for port,server in SERVERS_D.items():
multiprocessing.Process(target=serverMemoryCollect,args=([port,server],INTERVAL_TIME,sum(self.TCP_COUNT),self.getLinkNum)).start()
#采集服務(wù)器系統(tǒng)kpi指標(biāo)
self.sys_kpi_collect()
writeLog(“INFO”,r“》》》》》 性能數(shù)據(jù)采集結(jié)束!”)
time_consum = time.time() - start_times
timeRecord.recordData([“%s” %str(time_consum)])
break
else:
time.sleep(1)
curr_tcpN = self.getLinkNum.getLinkingNumber(SERVERS_D)
if __name__ == ‘__main__’:
kpiCollect = KPI_Collect()
kpiCollect.main_start()
#-*- coding:utf-8 -*-
“”“
reated on 2015年10月16日
@author: LiBiao
”“”
import time
import subprocess
from write_log import writeLog
from record_test_data import Record_Data
#Record the memory of server used
def serverMemoryCollect(servers,intervaltime,tcpNum,getLinkObj):
getLinkNum = getLinkObj
memRecord = Record_Data(“res/%s” %(servers[1]+“:”+servers[0]))
cmd = “ps -ef | grep %s | grep -v grep | awk ‘{print $2}’” %servers[1]
f = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
writeLog(“INFO”,“》》》》》 %s 指標(biāo)采集進(jìn)程執(zhí)行中。。。。?!?%servers[1])
pids = [pid.strip() for pid in f.stdout]
heard = [servers[1],‘used’,‘Linking_Number Memory_Capacity(MB)’]
try:
memRecord.recordData(heard)
curr_tcpN = sum(getLinkNum.getLinkingNumber(servers[0]))
loops = 0
while True:
vrss = []
for p in pids:
cmd2 = “cat /proc/%s/status | grep VmRSS | awk ‘{print $2}’” %p
rss = subprocess.Popen(cmd2,stdout=subprocess.PIPE,shell=True).stdout
vrss.append(int(rss.readline().strip()))
memRecord.recordData([‘%s’ %str((sum(vrss)/1024))])
if curr_tcpN 《= tcpNum:
if loops == 15:
#15s之內(nèi),當(dāng)前連接數(shù)小于初始化連接數(shù),程序退出
break
else:
loops += 5
time.sleep(5)
else:
loops = 0
time.sleep(intervaltime)
curr_tcpN = sum(getLinkNum.getLinkingNumber(servers[0]))
writeLog(“INFO”,r“》》》》》 %s 進(jìn)程內(nèi)存采集完成” %servers[1])
except IOError as err:
writeLog(“INFO”,“File error: ” + str(err))
return 0
從原始數(shù)據(jù)文件提取有效數(shù)據(jù)并寫入新的文件
# -*- coding: utf-8 -*-
‘’‘
Created on 2015年9月14日
@author: LiBiao
’‘’
import os,time
import subprocess
import getCmds
import del_old_file
from write_log import writeLog
#需要手動配置的數(shù)據(jù)
#SERVER_NAME = [‘srs_2.0.0.’,‘nginx’]#‘nginx’ #可以輸入nginx或者srs
SERVERS_D = {‘1935’:‘srs-rtmp’,‘18080’:‘srs-hls’,‘80’:‘nginx’}
#系統(tǒng)語言編碼
LANG = “en_US.UTF-8”
#獲取系統(tǒng)當(dāng)前使用的語言
def getSysLANG():
popen = subprocess.Popen(‘echo $LANG’,stdout=subprocess.PIPE,shell=True)
return popen.stdout.read().strip()
# 根據(jù)系統(tǒng)語言編碼獲取對應(yīng)配置文件路徑
def getConfPath():
if getSysLANG() == LANG:
return “。/conf/abstractConf_en.xml”
return “。/conf/abstractConf_ch.xml”
class AbstractKPI(object):
def __init__(self,*args):
(self.cmds,) = args
def abstract_kpi(self):
for cmd in self.cmds:
# print cmd
subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
#獲取本機ip地址,用來產(chǎn)生區(qū)別于其他機器的數(shù)據(jù)
def get_local_ip():
try:
ip = os.popen(“ifconfig | grep ‘inet addr’ | awk ‘{print $2}’”).read()
ip = ip[ip.find(‘:’) + 1:ip.find(‘ ’)]
except Exception,e:
print e
return ip
#將最終采集數(shù)據(jù)打包
def to_tar():
ip = get_local_ip()
times = time.strftime(“%Y-%m-%d-%H-%M-%S”,time.localtime())
subprocess.call(“cp res/linking_number res/timeConsum ” +“res/%s ”*len(SERVERS_D.items()) %tuple([v + “:” + k for k,v in SERVERS_D.items()]) + “result/”,shell=True)
files = [“result/” + filename for filename in os.listdir(“result/”)]
cmd = ‘tar -cf SYS_KPI_’+ ip + “_” + times + ‘.tar’ + ‘ %s’*len(files) %tuple(files)
try:
subprocess.call(cmd,shell=True)
except Exception as err:
writeLog(“ERROR”,r“》》》》》 文件壓縮出現(xiàn)錯誤 %s” %str(err))
exit()
writeLog(“INFO”,r“》》》》》 指標(biāo)文件打包完成”)
#腳本主入口函數(shù)
def main_start():
#刪除舊的kpi文件
del_old_file.Del_Old_File(“result/”).del_old_file()
#獲取到配置文件路徑
confpath = getConfPath()
#調(diào)用getCmds獲取解析kpi文件的命令
cmds = getCmds.Get_Cmds(confpath).getcmds()
#從原始指標(biāo)文件提取有用的數(shù)據(jù)
AbstractKPI(cmds).abstract_kpi()
#將result目錄下的解析后的kpi文件打包
to_tar()
writeLog(“INFO”,r“》》》》》 指標(biāo)數(shù)據(jù)提取并打包完成”)
if __name__ == ‘__main__’:
main_start()
腳本中采集數(shù)據(jù)的命令是linux的,其實這并不是最合適的處理方式,之前只是為了滿足工作所需。目前正在使用python第三方模塊psutil中的一些方法來執(zhí)行服務(wù)器性能數(shù)據(jù)的采集,這樣的話,腳本就會更加符合python開發(fā)的模式。
-
采集器
+關(guān)注
關(guān)注
0文章
192瀏覽量
18180 -
數(shù)據(jù)采集器
+關(guān)注
關(guān)注
1文章
129瀏覽量
14897
發(fā)布評論請先 登錄
相關(guān)推薦
評論