OpenSTAのTimers.csvを解析するクラス
OpenSTAの「Timer List」-「Export」で出力できるTimers.csvを解析するクラスを書きました。
- 処理時間をTimerごとに集計し、以下の値を算出します。
- 平均
- 最大
- 最小
- スループット
- 計測期間のうち、前後の指定された期間のログをカットする機能付きです。
require 'time' # タイマーごとの処理時間を集計する module OpenSTA class TimerResult def initialize( file, period=20*60, cut=1*60 ) @period = period @file = file @cut = cut @result = {} load end def each( &block ) @result.each( &block ) end def [](key) @result[key] end attr_reader :results private def load @tmp = {} open( @file, "r" ) {|f| # 最初の1行はヘッダなので無視 f.gets while( line = f.gets ) add_line( line.split(",,")) end } @tmp.each_pair {|k,v| avg = v[:sum].to_f / v[:count] @result[k.to_sym] = Result.new( avg, v[:max], v[:min], @ative_user/avg ) } end def add_line( values ) @date = Time.parse( "#{values[6]} #{values[7]}" ) @ative_user = values[4].to_i unless @ative_user unless @start @start = @date + @cut @end = @date + @period - @cut end return if @date < @start || @date > @end time = (values[5].to_f * 1000).to_i map = (@tmp[values[3]] ||= {:sum=>0,:max=>nil,:min=>nil,:count=>0}) map[:count] += 1 map[:sum] += time map[:max] = time if !map[:max] || map[:max] < time map[:min] = time if !map[:min] || map[:min] > time end end Result = Struct.new(:avg,:max,:min,:tp) end
利用例は以下。
result = OpenSTA::TimerResult.new( "Timers.csv" ) result.each {|r| puts "#{r[0]} : " + [ r[1].avg, r[1].max, r[1].min, r[1].tp ].map{|v| sprintf("%#.03f", v) }.join(", ") }
実行結果です。
T_LOGIN : 5.243, 30.000, 0.000, 1.907 T_LOGOUT : 44.822, 130.000, 20.000, 0.223 ...