-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnetreceive-plot
119 lines (97 loc) · 3.82 KB
/
netreceive-plot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Kontron Europe GmbH
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
from __future__ import print_function
import argparse
import copy
import dateutil.parser
import json
import numpy
import sys
from collections import OrderedDict
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
def plot(filename, data, stats, props):
all_data = [[1,2,3],[1,2,3],[1,2,3]]
labels = []
for k,v in data.items():
all_data.append(v)
labels.append(k)
plt.figure(figsize=(10,8))
plt.suptitle(props['plottitle'], fontsize=14, fontweight='bold')
plt.ylabel('Mbit/s')
for k,v in data.items():
average = sum(data[k])/float(len(data[k]))
plt.semilogy(data[k], label='{} (avg: {})'.format(k, average))
legend = plt.legend(loc='upper right', shadow=True, fontsize='x-large')
plt.savefig(filename)
plt.close()
def update_data(data, d):
for m in d:
name = m['filter-name']
value = m['bandwidth']
data[name].append(value)
def main(args=None):
parser = argparse.ArgumentParser(
description='trace')
parser.add_argument('--title', dest='plottitle', type=str,
default='Bandwidth',
help='Set plot title.')
parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
help='Input file (default is STDIN).', default=sys.stdin)
parser.add_argument('outfile', type=str, help='Output file.')
args = parser.parse_args(args)
data = OrderedDict()
props = dict(plottitle=args.plottitle)
stats = None
try:
for line in args.infile:
line = line.strip()
if not line:
continue
try:
j = json.loads(line)
except ValueError as e:
print(e, file=sys.stderr)
pass
try:
if j['type'] == 'bandwidth-data':
ts_start = j['object']['timestamp-start']
ts_end = j['object']['timestamp-end']
d = j['object']['data']
if not data:
data = OrderedDict()
for m in j['object']['data']:
data[m['filter-name']] = list()
update_data(data, d)
except KeyError as e:
print(e, file=sys.stderr)
pass
except KeyboardInterrupt as e:
pass
plot(args.outfile, data, stats, props)
if __name__ == '__main__':
main()