Révision 232d40c0

b/papers/2014/reservation/experiments/kadeploy_graph
1
#!/usr/bin/env python
2

  
3
from os.path import join
4

  
5
import sys; sys.path.insert(0, join('src', 'python'))
6

  
7
from lib.kadeploy import plot_graphs
8

  
9
plot_graphs()
b/papers/2014/reservation/experiments/src/python/lib/kadeploy.py
1
__author__ = 'Marcos Assuncao'
2

  
3
import pytz
4
import sys
5
from argparse import ArgumentParser
6
import matplotlib.pyplot as plt; plt.rcdefaults()
7
import numpy as np
8
from matplotlib import rc
9
from pylab import *
10
from scipy.stats import gaussian_kde
11
rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
12
rc('text', usetex=True)
13
plt.rcParams.update({'font.size': 14})
14
from datetime import datetime
15

  
16
TZINFO = pytz.timezone("Europe/Paris")
17

  
18
class DeploymentStat:
19

  
20
    def __init__(self, host, start, step1_dur, step2_dur, step3_dur, success):
21
        self._host = host
22
        self._start = start
23
        self._step1_dur = step1_dur
24
        self._step2_dur = step2_dur
25
        self._step3_dur = step3_dur
26
        self._success = success
27
        self._retry_1 = 0
28
        self._retry_2 = 0
29
        self._retry_3 = 0
30

  
31
    @property
32
    def hostname(self):
33
        return self._host
34

  
35
    @property
36
    def start(self):
37
        return self._start
38

  
39
    @property
40
    def step_1_duration(self):
41
        return self._step1_dur
42

  
43
    @property
44
    def step_2_duration(self):
45
        return self._step2_dur
46

  
47
    @property
48
    def step_3_duration(self):
49
        return self._step3_dur
50

  
51
    @property
52
    def success(self):
53
        return self._success
54

  
55
    @property
56
    def num_retries_step_1(self):
57
        return self._retry_1
58

  
59
    @num_retries_step_1.setter
60
    def num_retries_step_1(self, r):
61
        self._retry_1 = r
62

  
63
    @property
64
    def num_retries_step_2(self):
65
        return self._retry_2
66

  
67
    @num_retries_step_2.setter
68
    def num_retries_step_2(self, r):
69
        self._retry_2 = r
70

  
71
    @property
72
    def num_retries_step_3(self):
73
        return self._retry_3
74

  
75
    @num_retries_step_3.setter
76
    def num_retries_step_3(self, r):
77
        self._retry_3 = r
78

  
79
    @property
80
    def has_retries(self):
81
        return (self.num_retries_step_1 > 0 or
82
                self.num_retries_step_3 > 0 or
83
                self.num_retries_step_3 > 0)
84

  
85
def parse_date(str_date):
86
    d = datetime.strptime(str_date, "%Y-%m-%d %H:%M:%S")
87
    d = TZINFO.localize(d)
88
    return d
89

  
90
def parse_kdeploy_opt():
91
    parser = ArgumentParser(description='Plot Kadeploy deployment graphs.')
92
    parser.add_argument('--input', dest='input', type=str, required=True,
93
                        help='the input request trace file')
94
    parser.add_argument('--output', dest='output', type=str, required=True,
95
                        help='the output directory')
96
    parser.add_argument('--start-date', dest='start_date', type=parse_date, required=True,
97
                        help='the start date of the log (i.e. YYYY-MM-DD HH:mm:ss)')
98
    parser.add_argument('--cluster', dest='cluster', type=str, required=True,
99
                        help='the name of the cluster')
100

  
101
    args = parser.parse_args()
102
    return args
103

  
104
def parse_log(log, cluster):
105
    f = open(log, 'r')
106

  
107
    deployments = []
108
    for line in f:
109
        fields = line.split(',')
110
        hostname = fields[2]
111

  
112
        if cluster in hostname:
113
            hostname = hostname.split('.')[0]
114
            start = datetime.fromtimestamp(int(fields[3]), TZINFO)
115
            step1_dur = int(fields[4])
116
            step2_dur = int(fields[5])
117
            step3_dur = int(fields[6])
118
            success = "true" in fields[10]
119
            dep = DeploymentStat(hostname, start, step1_dur, step2_dur, step3_dur, success)
120
            retry_1 = int(fields[7])
121
            retry_2 = int(fields[8])
122
            retry_3 = int(fields[9])
123
            dep.num_retries_step_1 = retry_1
124
            dep.num_retries_step_2 = retry_2
125
            dep.num_retries_step_3 = retry_3
126
            deployments.append(dep)
127

  
128
    f.close()
129
    return deployments
130

  
131

  
132
def plot_deployment_time(deployments, cluster, year, out_dir):
133
    values = []
134
    for d in deployments:
135
        if d.success and not d.has_retries:
136
            values.append(int(d.step_1_duration + d.step_2_duration + d.step_3_duration))
137
            # values.append(int(d.step_3_duration))
138
            # values.append(int(d.step_1_duration))
139

  
140
    title = 'Deployment on Cluster %s (%d)' % (cluster, year)
141
    out_file = out_dir + ("/deployment_%s_%d.pdf" % (cluster, year))
142
    hist_graph(values, title, 'Deployment Time (seconds)', '', out_file)
143

  
144

  
145
def hist_graph(values, title, x_label, y_label, out_file):
146
    ar1 = np.array(values)
147
    fig, ax = plt.subplots()
148

  
149
    num_bins = 20
150
    n, bins, patches = plt.hist(ar1, bins=num_bins, histtype='bar',
151
                                normed=True, facecolor='#708090', alpha=0.5, rwidth=0.8)
152
    plt.subplots_adjust(left=0.15)
153

  
154
    max = round(bins[len(bins) - 1])
155
    density = gaussian_kde(ar1)
156
    xs = np.linspace(0,max,300)
157
    density.covariance_factor = lambda : .25
158
    density._compute_covariance()
159
    plt.plot(xs,density(xs), 'r--')
160

  
161
    ax.set_xlabel(x_label)
162
    ax.set_ylabel(y_label)
163
    ax.set_title(title)
164

  
165
    ax.get_xaxis().tick_bottom()
166
    ax.get_yaxis().tick_left()
167

  
168
    plt.show()
169
    # plt.savefig(out_file)
170

  
171
def plot_graphs():
172
    opts = parse_kdeploy_opt()
173
    deployments = parse_log(opts.input, opts.cluster)
174
    plot_deployment_time(deployments, opts.cluster, opts.start_date.year, opts.output)

Formats disponibles : Unified diff