Guest User

Untitled

a guest
Oct 21st, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.66 KB | None | 0 0
  1. // 開発環境
  2. // Groovy Version: 1.8.6
  3. // JVM: 1.6.0_24 Vendor: Sun Microsystems Inc.
  4. // OS: Ubuntu Linux
  5. def enc = 'EUC-JP'
  6.  
  7. if(args.size() < 1){
  8. println new String("第一引数にログファイル名を指定してください".bytes,enc)
  9. return
  10. }
  11.  
  12. def report = [:]
  13. def timeRange = new TimeRange()
  14.  
  15. // ログ情報にない集計範囲の情報を出力
  16. while(timeRange.checkLimit()){
  17. report[timeRange.startTime.format("HH:mm")] = new ReportRecord()
  18. timeRange.nextRange()
  19. }
  20.  
  21. new File(args[0]).newReader(enc).eachLine() {line ->
  22.  
  23. // レコードの読み込み
  24. def logInfo = line.split('\t')
  25. Date date = new Date(logInfo[0])
  26. def time = logInfo[2] as Integer
  27.  
  28. // どの集計時刻に集計されるか特定する
  29. def hour = date.hours as String
  30. def minutes = (date.minutes/5) as Integer
  31. minutes = minutes * 5 as String
  32. def key = "${hour.padLeft(2,"0")}:${minutes.padLeft(2,"0")}"
  33.  
  34. // ログの応答時間を追加する
  35. def reportRecord = report[key]
  36. reportRecord.values << time
  37. }
  38.  
  39. // 集計結果を出力
  40. report.each {k,v ->
  41. def row = "$k\t${v.getResult()}" as String
  42. println new String(row.bytes,enc)
  43. }
  44.  
  45. // 集計時刻の範囲を表現するクラス
  46. class TimeRange {
  47. // 集計時刻
  48. Date startTime
  49. Date endTime
  50. // 完了時間
  51. Date limit
  52.  
  53. TimeRange(){
  54. // 集計を行う時間00:00から23:59で初期化
  55. endTime = new Date()
  56. endTime.setHours(0)
  57. endTime.setMinutes(0)
  58. endTime.setSeconds(0)
  59. nextRange()
  60. use( [org.codehaus.groovy.runtime.TimeCategory] ){
  61. limit = endTime + 1.days
  62. }
  63. }
  64.  
  65. /** whileループ判定に使う完了時間のチェック */
  66. boolean checkLimit(){
  67. return endTime < limit
  68. }
  69.  
  70. // 集計時刻の範囲を次にすすめる
  71. void nextRange(){
  72. startTime = endTime
  73. use( [org.codehaus.groovy.runtime.TimeCategory] ){
  74. endTime = startTime + 5.minute
  75. }
  76. }
  77. }
  78.  
  79. // レポートの集計情報を表現するクラス
  80. class ReportRecord {
  81. // 集計する応答時間
  82. def values = []
  83.  
  84. // 集計時刻単位の集計レコードを出力
  85. String getResult(){
  86. def counter = [0,0,0]
  87. def average = 0
  88.  
  89. if (values.size() != 0){
  90. counter[0] = (values.findAll{it < 1000}.size())
  91. counter[1] = values.findAll{it > 1000 && it < 5000 }.size()
  92. counter[2] = values.findAll{it > 5000}.size()
  93. average = Math.floor(values.sum() / values.size()) as Integer
  94. }
  95. return "${counter[0]}\t${counter[1]}\t${counter[2]}\t$average"
  96. }
  97. }
Add Comment
Please, Sign In to add comment