lundi, mars 13, 2006

Transformer des logs du garbage collector en fichier csv

Voici un petit script qui permet de transformer les logs obtenus en passant les paramètres "-verbose:gc -Xloggc:/temp/jvm.log" à la jvm en java pour voir l'utilisation de la mémoire.
Les logs obtenus ressemblent à ça:
0.000: [GC 508K->138K(1984K), 0.0042681 secs]
0.074: [GC 650K->251K(1984K), 0.0030702 secs]
0.198: [GC 763K->305K(1984K), 0.0035574 secs]
0.272: [GC 817K->465K(1984K), 0.0033527 secs]
0.320: [GC 976K->523K(1984K), 0.0020841 secs]
...
0.557: [Full GC 1489K->1015K(2112K), 0.0256656 secs]
...
Cette version est plus compacte mais moins facile à lire (à mon avis) que la seconde, on split la ligne en utilisant plusieurs séparateurs: K ou [GC ou ( ou -> ...
def change_to_csv(csv_file, line)
  puts(line)
  # 0.000: [GC 508K->138K(1984K), 0.0042681 secs]
  # 0.563: [Full GC 1488K->1005K(2112K), 0.0253077 secs]
  array = line.split(/(:)|( \[GC )|( \[Full GC )|(->)|(\))|(K)|(\()/)
  time = array[0]
  puts("time: " + time)
  before_gc = array[4]
  puts("before_gc: " + before_gc)
  after_gc = array[8]
  puts("after_gc: " + after_gc)
  
  csv_file << (time + ";" + before_gc + ";" + after_gc + ";\n")
end

File.open("jvm.csv", File::CREAT|File::RDWR) do |csv_file|
  csv_file << ("time;before_gc;after_gc;\n")
  IO.foreach("jvm.log") { |line| change_to_csv(csv_file, line) } 
end
La seconde version où on split au fur et à mesure (par dicotomie en quelque sorte):
def change_to_csv(csv_file, line)
  puts(line)
  # 0.000: [GC 508K->138K(1984K), 0.0042681 secs]
  # 0.563: [Full GC 1488K->1005K(2112K), 0.0253077 secs]
  split_time = line.split(':')
  time = split_time[0]
  puts("time: " + time)
  rest = split_time[1]
  split_gc = rest.split('->')
  before_gc = split_gc[0].split('GC ')[1].split('K')[0]
  puts("before_gc: " + before_gc)
  after_gc = split_gc[1].split('K')[0]
  puts("after_gc: " + after_gc)
  
  csv_file << (time + ";" + before_gc + ";" + after_gc + ";\n")
end

File.open("jvm.csv", File::CREAT|File::RDWR) do |csv_file|
  csv_file << ("time;before_gc;after_gc;\n")
  IO.foreach("jvm.log") { |line| change_to_csv(csv_file, line) } 
end
Dans les deux cas on cherche un fichier jvm.log et on fait un fichier jvm.csv qui resemble à ça:
time;before_gc;after_gc;
0.000;508;138;
0.073;650;251;
0.200;763;305;
0.274;817;465;
0.322;976;523;
0.379;1035;537;
0.408;1049;722;
0.426;1234;802;
0.433;1298;837;
...
Il y a plus qu'à le passer dans excel et hop de jolies courbes!
Rem: je l'ai écrit rapidement, on peut surement faire plus élégant, mais mon but était l'efficacité et pour ça ruby est génial ;)
Technorati tags:

Aucun commentaire: