3

jmeter を使用していくつかの負荷テスト結果を生成しており、適切にフォーマットされた csv ファイルを出力していますが、今は ruby​​ でいくつかの計算を行う必要があります。csv ファイルの冒頭の例:

threadName,grpThreads,allThreads,URL,Latency,SampleCount,ErrorCount
Thread Group 1-1,1,1,urlXX,240,1,0
Thread Group 1-1,1,1,urlYY,463,1,0
Thread Group 1-2,1,1,urlXX,200,1,0
Thread Group 1-3,1,1,urlXX,212,1,0
Thread Group 1-2,1,1,urlYY,454,1,0
.
.
.
Thread Group 1-N,1,1,urlXX,210,1,0

ここで、統計を取得するために、各スレッド グループの最初の行を読み取り、Latency フィールドを加算してから、スレッド グループの数で割り、平均レイテンシを取得する必要があります。次に、すべてのスレッド グループの 2 行目まで繰り返します。

私はおそらく、スレッド グループごとにいくつかの一時的な並べ替えられた csv ファイルを作成する必要があると考えていました (URL がヒットされる順序は、スレッド グループ内で常に同じです)。次に、それらを入力として使用し、最初の行を追加し、計算を行います。行がなくなるまで 2 行目を追加します。

しかし、スレッドグループの量が変化して以来、私はルビを書くことができなかったので、それを柔軟に扱うことができました...どんなコード例でも本当に感謝しています:)

4

1 に答える 1

1

[更新] - これはあなたが望むものですか?

これはどうですか?おそらく非効率的ですが、あなたが望むことはできますか?

CSV = File.readlines("data.csv")
CSV.shift # minus the header.

# Hash where key is grp name; value is list of HASHES with keys {:grp, :lat}
hash = CSV.
  map {|l| # Turn every line into a HASH of grp name and it's lats.
    fs = l.split(","); {:grp => fs[0], :lat => fs[4]} 
  }.
  group_by{|o| o[:grp]}

# The largest number of lines we have in any group
max_lines = hash.max_by{|gname, l| l.size}.size

# AVGS is a list of averages. 
# AVGS[0] is the average lat. for all the first lines,
# AVGS[1] is the average lat. for all second lines, etc.
AVGS = 
(0..(max_lines-1)).map{|lno| # line no
  total = # total latency for the i'th line...
    hash.map {|gname, l|
      if l[lno] then  l[lno][:lat].to_i
      else 0 end
    }
  total.reduce{|a,b| a+b} / (hash.size)
}

# So we have 'L' Averages - where L is the maximum number of
# lines in any group. You could do anything with this list
# of numbers... find the average again?
puts AVGS.inspect

次のようなものを返す必要があります。

[217/*avg for 1st-liners*/, 305 /*avg for 2nd liners*/]
于 2012-11-29T09:55:36.593 に答える