#! /usr/bin/env python # Copyright Arvid Norberg 2008. Use, modification and distribution is # subject to the Boost Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) import os, sys, time, os stat = open(sys.argv[1]) line = stat.readline() while not 'second:' in line: line = stat.readline() keys = line.strip().split(':')[1:] axes = ['x1y2', 'x1y2', 'x1y1', 'x1y1', 'x1y1', 'x1y1', 'x1y1', 'x1y1', 'x1y2'] output_dir = 'session_stats_report' def gen_report(name, unit, lines): try: os.mkdir(output_dir) except: pass out = open('session_stats_%s.gnuplot' % name, 'wb') print >>out, "set term png size 1200,700" print >>out, 'set output "%s"' % (os.path.join(output_dir, 'session_stats_%s.png' % name)) print >>out, 'set xrange [0:*]' print >>out, 'set xlabel "time (s)"' print >>out, 'set ylabel "%s"' % unit print >>out, 'set y2label "Rate (B/s)"' print >>out, 'set y2range [0:*]' print >>out, 'set y2tics auto' print >>out, "set tics nomirror" print >>out, "set style data lines" print >>out, "set key box" print >>out, 'plot', column = 2 first = True for k in lines: try: column = keys.index(k) + 2 except: print '"%s" not found' % k continue; if not first: print >>out, ', ', axis = 'x1y1' if column-2 < len(axes): axis = axes[column-2] print >>out, ' "%s" using 1:%d title "%s" axes %s with steps' % (sys.argv[1], column, k, axis), first = False column = column + 1 print >>out, '' print >>out, "set term png size 300,150" print >>out, 'set output "%s"' % (os.path.join(output_dir, 'session_stats_%s_thumb.png' % name)) print >>out, 'set key off' print >>out, 'unset tics' print >>out, 'set format x ""' print >>out, 'set format y ""' print >>out, 'set xlabel ""' print >>out, 'set ylabel ""' print >>out, 'set y2label ""' print >>out, "replot" out.close() os.system('gnuplot session_stats_%s.gnuplot 2>/dev/null' % name); sys.stdout.write('.') sys.stdout.flush() def gen_html(reports): file = open(os.path.join(output_dir, 'index.html'), 'w+') print >>file, '', for i in reports: print >>file, '

%s

%s
' % (i[0], i[2], i[0], i[0]), print >>file, '', file.close() reports = [ ('torrents', 'num', '', ['downloading torrents', 'seeding torrents', 'checking torrents', 'stopped torrents', 'upload-only torrents', 'error torrents']), ('peers', 'num', '', ['peers', 'connecting peers', 'connection attempts', 'banned peers', 'max connections']), ('peers_list_size', 'num', '', ['num list peers']), ('overall_rates', 'Bytes / second', '', ['upload rate', 'download rate', 'smooth upload rate', 'smooth download rate']), ('disk_queue', 'Bytes', 'bytes queued up by peers, to be written to disk', ['disk write queued bytes', 'disk queue limit', 'disk queue low watermark']), ('peers_upload', 'num', 'number of peers by state wrt. uploading', ['peers up interested', 'peers up unchoked', 'peers up requests', 'peers disk-up', 'peers bw-up']), ('peers_download', 'num', 'number of peers by state wrt. downloading', ['peers down interesting', 'peers down unchoked', 'peers down requests', 'peers disk-down', 'peers bw-down']), ('peer_errors', 'num', 'number of peers by error that disconnected them', ['error peers', 'peer disconnects', 'peers eof', 'peers connection reset', 'connect timeouts', 'uninteresting peers disconnect', 'banned for hash failure']), ('waste', '% of all downloaded bytes', 'proportion of bytes wasted', ['% failed payload bytes', '% wasted payload bytes', '% protocol bytes']), ('average_disk_time_absolute', 'microseconds', 'running averages of timings of disk operations', ['disk read time', 'disk write time', 'disk queue time', 'disk hash time', 'disk job time', 'disk sort time']), ('disk_time', '% of total disk job time', 'proportion of time spent by the disk thread', ['% read time', '% write time', '% hash time', '% sort time']), ('disk_cache_hits', 'blocks (16kiB)', '', ['disk block read', 'read cache hits', 'disk block written', 'disk read back']), ('disk_cache', 'blocks (16kiB)', 'disk cache size and usage', ['read disk cache size', 'disk cache size', 'disk buffer allocations', 'cache size']), ('disk_readback', '% of written blocks', '', ['% read back']), ('disk_queue', 'num', '', ['disk queue size', 'disk read queue size']), # ('absolute_waste', 'num', '', ['failed bytes', 'redundant bytes', 'download rate']), ('connect_candidates', 'num', 'number of peers we know of that we can connect to', ['connect candidates']), #somewhat uninteresting stats ('peer_dl_rates', 'num', '', ['peers down 0', 'peers down 0-2', 'peers down 2-5', 'peers down 5-10', 'peers down 50-100', 'peers down 100-']), ('peer_dl_rates2', 'num', '', ['peers down 0-2', 'peers down 2-5', 'peers down 5-10', 'peers down 50-100', 'peers down 100-']), ('peer_ul_rates', 'num', '', ['peers up 0', 'peers up 0-2', 'peers up 2-5', 'peers up 5-10', 'peers up 50-100', 'peers up 100-']), ('peer_ul_rates2', 'num', '', ['peers up 0-2', 'peers up 2-5', 'peers up 5-10', 'peers up 50-100', 'peers up 100-']), ('piece_picker_end_game', '', 'blocks', ['end game piece picker blocks', 'piece picker blocks', 'piece picks', 'reject piece picks', 'unchoke piece picks', 'incoming redundant piece picks', 'incoming piece picks', 'end game piece picks', 'snubbed piece picks']), ('piece_picker', 'blocks', '', ['piece picks', 'reject piece picks', 'unchoke piece picks', 'incoming redundant piece picks', 'incoming piece picks', 'end game piece picks', 'snubbed piece picks']), ] print 'generating graphs\n[%s]\r[' % (' ' * len(reports)), for i in reports: gen_report(i[0], i[1], i[3]) print '' print 'generating html' gen_html(reports)