profHelper のソースコード
#!
# coding: utf-8
# Copyright (C) 2017 TOPS SYSTEMS
### @file profHelper.py
### @brief profiling log helper
###
### VPPL -i によるログ内に出力されるプロファイリングポイントを集計する
### UNIT@CONTER値
###
### Contact: izumida@topscom.co.jp
###
### @author: M.Izumida
### @date: March 31, 2017
###
## v01r01 Newly created
##
# Written for Python 2.7 (NOT FOR 3.x)
#=======================================================================
# インポート宣言
from __future__ import division
import sys
import re
import argparse
import os
import csv
from datetime import datetime
#=======================================================================
# バージョン文字列
versionSTR = "profHelper.py v01r01 Tops Systems (pgm by mpi)"
#=======================================================================
# 共通サブルーチン
#-------------------------------------------------------------------
def errPrint(mes):
"""errPrint.
エラー出力へのメッセージ表示
後の始末はその後で別に書くこと
"""
sys.stderr.write(mes)
sys.stderr.write('\n')
#-------------------------------------------------------------------
def stdExceptionHandler(mes):
"""standard Exception Handler.
エラーメッセージを送出し、デバッグのための情報を出力する
"""
errPrint("Exception Captured: " + str(mes))
errPrint("0:" + str(sys.exc_info()[0]))
errPrint("1:" + str(sys.exc_info()[1]))
errPrint("2:" + str(sys.exc_info()[2]))
#-------------------------------------------------------------------
def tryIntParse(st, dval, radix=10):
"""try Parse string to Integer
文字列stをパースして整数化できれば値を返す、できなければデフォルト値dvalを返す
"""
try:
work = int(st, radix)
except:
return dval
return work
#-------------------------------------------------------------------
def repExt(fname, newext):
"""Relpace Extension
fnameの拡張子部分をnewextでリプレースした文字列を返す
"""
tempName, ext = os.path.splitext(os.path.basename(fname))
return tempName + newext
#=======================================================================
# log ファイルリーダクラス
[ドキュメント]class logReader:
"""VPPL -i log Reader Class.
VPPL -i 形式のLOGを読み取って集計するクラス
"""
#--------------------------------------------------------------------
def __init__(self, ifnam, ofnam):
"""log Reader Constructor
コンストラクタ
"""
self.iFname = ifnam #<<! 読み込むLOGファイル名
self.oFname = ofnam #<<! 書き出すLOGファイル名
self.sumDic = dict() #<<! UNIT名->積算値の連想配列
self.foundCount = 0 #<<! prof pointの発見数
self.unitCount = 0 #<<! unit名の個数
self.errCount = 0 #<<! error個数
self.oldCount = 0 #<<! 1つ前のカウント値
#
self.p0 = re.compile('([0-9a-zA-Z]+)> ([0-9a-zA-Z]+)@([0-9]+)')
#デバッグ
self.debug = False #<<! デバッグモードフラグ
self.verbose = False #<<! バーボスモードフラグ
#--------------------------------------------------------------------
[ドキュメント] def read(self):
"""read log
ファイルからレコードをリードして処理するメソッド
読み取り成功すれば真
"""
nLine = 1
try:
with open(self.iFname, 'r') as f:
for line in f:
if self.rLine(line):
break
nLine += 1
except:
stdExceptionHandler("ERROR: in file reading = " + self.iFname + " line#=" + str(nLine))
return False
return True
#--------------------------------------------------------------------
[ドキュメント] def rLine(self, lin):
"""Read Line method
読み取った1行を処理するメソッド
継続読み取り時にFalseを返す。
処理終了時にTrueを返す。
"""
ppoint = self.p0.search(lin)
if ppoint:
self.foundCount += 1
coreName = ppoint.group(1)
unitName = ppoint.group(2)
curCount = ppoint.group(3)
if self.debug:
print unitName, curCount
curCount_i = tryIntParse(curCount, 0)
count = curCount_i - self.oldCount
self.oldCount = curCount_i
if unitName in self.sumDic:
self.sumDic[unitName] += count
else:
self.unitCount += 1
self.sumDic[unitName] = count
#--------------------------------------------------------------------
[ドキュメント] def write(self):
"""write result
集計結果の書き出し.
"""
if self.verbose:
print "Total # of ProfPoint(s): {0}".format(self.foundCount)
print "Total # of Unit(s): {0}".format(self.unitCount)
try:
with open(self.oFname, 'w') as f:
for uname, v in self.sumDic.items():
f.write(uname)
f.write(",")
f.write(str(v))
f.write("\n")
except:
stdExceptionHandler("Error: writing result file = " + self.oFname)
return False
return True
#=======================================================================
# メインプログラム
def main():
"""main.
メインプログラム
"""
#-----------------------------------------------------------------------
# コマンドラインオプション処理
#
parser = argparse.ArgumentParser(description='profHelper.')
parser.add_argument('--LOG', nargs=1, help='LOG file name.')
parser.add_argument('--CSV', nargs=1, help='CSV file name.')
parser.add_argument('-d', dest='debug', help='print debug information.', action='store_true', default=False)
parser.add_argument('-v', dest='verbose', help='Verbose mode.', action='store_true', default=False)
parser.add_argument('-V', dest='VERSION', help='Show Version, then exit', action='store_true', default=False)
args = parser.parse_args()
#-----------------------------------------------------------------------
# Version 表示
#
print versionSTR
if args.VERSION:
sys.exit(0)
#-----------------------------------------------------------------------
# ファイル名処理
#
if args.LOG is None:
errPrint('ERROR: NO input LOG file!!!')
sys.exit(1)
else:
logFname = args.LOG[0]
if not os.path.isfile(logFname):
errPrint('ERROR: LOG file, NOT EXIST.')
sys.exit(1)
if args.CSV is None:
csvFname = "exec_log_counts.csv"
else:
csvFname = args.CSV[0]
#-----------------------------------------------------------------------
# パラメータ処理
#-----------------------------------------------------------------------
# 実処理
#
log = logReader(logFname, csvFname)
log.verbose = args.verbose
log.debug = args.debug
#
if log.read():
if not log.write():
sys.exit(1)
else:
sys.exit(1)
#終了メッセージ
today = datetime.today()
print " "
print today.strftime("FINISH: %Y/%m/%d %H:%M:%S")
#-----------------------------------------------------------------------
# 正常終了
#
sys.exit(0)
#=======================================================================
# メインプログラムの起動
if __name__ == "__main__":
main()