|
10 | 10 | import systemlog
|
11 | 11 |
|
12 | 12 | try:
|
13 |
| - (options, arguments) = getopt(sys.argv[1:], 'i:s:etu', |
14 |
| - ['interval', 'scale', 'events', 'events-only', 'show-unknown']) |
| 13 | + # I am bad at picking single-letter switches, and feel bad |
| 14 | + (options, arguments) = getopt(sys.argv[1:], 'i:s:eturm:', |
| 15 | + ['interval', 'scale', 'events', 'events-only', 'show-unknown', 'sort', 'min-size']) |
15 | 16 | except GetoptError, error:
|
16 | 17 | sys.stderr.write('%s\n' % str(error))
|
17 | 18 | sys.exit(1)
|
|
24 | 25 | allevents = False
|
25 | 26 | eventsonly = False
|
26 | 27 | unknowns = False
|
| 28 | +sort = False |
| 29 | +minsize = 0 |
| 30 | + |
27 | 31 | for opt, arg in options:
|
28 | 32 | if opt in ('-i', '--interval'):
|
29 | 33 | interval = int(arg)
|
|
35 | 39 | eventsonly = True
|
36 | 40 | if opt in ('-u', '--show-unknown'):
|
37 | 41 | unknowns = True
|
| 42 | + if opt in ('-r', '--sort'): |
| 43 | + sort = True |
| 44 | + if opt in ('-m', '--min-size'): |
| 45 | + minsize = int(arg) |
38 | 46 |
|
39 | 47 | if arguments:
|
40 | 48 | log = fileinput.input(arguments[0])
|
41 | 49 | else:
|
42 | 50 | log = fileinput.input()
|
43 | 51 |
|
44 |
| -stages = {} |
45 |
| -data = defaultdict(lambda: defaultdict(int)) |
| 52 | +stages = defaultdict(int) |
46 | 53 | enum = 0
|
| 54 | +data = defaultdict(lambda: defaultdict(int)) |
47 | 55 | for event in systemlog.parse_log(log):
|
48 | 56 | stage = event['thread_name'] + ' ' + event['source_file']
|
49 | 57 | if stage[0:3].isupper() or event['thread_name'] == 'main': # skip rmi, handshaking, streams, etc
|
|
60 | 68 | else:
|
61 | 69 | stage = event['event_category'] + ' ' +event['event_type']
|
62 | 70 |
|
63 |
| - if stage not in stages: |
| 71 | + if not stage in stages and not sort: |
64 | 72 | stages[stage] = enum
|
65 | 73 | enum += 1
|
| 74 | + |
66 | 75 | ts = int(event['date'].strftime('%s')) / interval
|
67 | 76 | if event['event_type'] == 'pause':
|
68 | 77 | data[ts][stage] += event['duration'] / 1000
|
69 | 78 | elif event['event_type'] == 'messages_dropped':
|
70 |
| - if 'internal_timeout' in event: |
| 79 | + if 'internal_timeout' in event and event['internal_timeout'] != None: |
71 | 80 | data[ts][stage] += event['internal_timeout'] + event['cross_node_timeout']
|
72 | 81 | else:
|
73 | 82 | data[ts][stage] += event['messages_dropped']
|
|
82 | 91 | else:
|
83 | 92 | data[ts][stage] += 1
|
84 | 93 |
|
| 94 | +if sort: |
| 95 | + enum = 0 |
| 96 | + for stage in reversed(sorted(stages.keys())): |
| 97 | + stages[stage] = enum |
| 98 | + enum += 1 |
| 99 | + size=max(stages[stage]*scale, minsize) |
85 | 100 | fig, ax = plt.subplots()
|
86 | 101 | colors = cm.rainbow(np.linspace(0, 1, len(stages)))
|
87 | 102 | for ts, info in data.iteritems():
|
|
0 commit comments