import repository from arizona
[raven.git] / tools / phonehome / reporthistory.py
1 import os, sys, time
2 import report
3
4 glo_stats = {}
5 glo_timestamp_table = {}
6 glo_colnames = ["telapsed_combined", "telapsed", "telapsedfrominitstart", "tinstallelap", "tbenchelap", "tinitscriptelap", "goodcount"]
7
8 def genstats(timestamp):
9    global glo_colnames
10    global glo_stats
11    global glo_timestamp_table
12
13    count = len(report.glo_good_results)
14    if (count < 200):
15       print str(timestamp) + " ignored due to too low success count ( " + str(count) + ")<br>"
16       return
17
18 #   stats = report.compute_stats("telapsed_combined")
19 #   if (stats) and (stats[0] > 20000):
20 #      print str(timestamp) + " ignored due to too high telaped_combined ( " + str(stats[0]) + ")<br>"
21 #      return
22
23    colstats = []
24
25    for colname in glo_colnames:
26       stats = report.compute_stats(colname)
27       if stats:
28          if (colname == "telapsed_combined") and (stats[0] > 20000):
29              print str(timestamp) + " ignored in telapsed_combined graph due too high mean ( " + str(stats[0]) + ")<br>"
30              colstats.append(-2)
31          elif (colname == "telapsed") and (stats[0] > 20000):
32              print str(timestamp) + " ignored in telapsed graph due too high mean ( " + str(stats[0]) + ")<br>"
33              colstats.append(-2)
34          elif (colname == "telapsedfrominitstart") and (stats[0] > 20000):
35              print str(timestamp) + " ignored in telapedfrominitstart graph due too high mean ( " + str(stats[0]) + ")<br>"
36              colstats.append(-2)
37          else:
38             if not glo_stats.get(colname, None):
39                glo_stats[colname] = {}
40             glo_stats[colname][timestamp] = stats
41             colstats.append(stats[1])
42
43    glo_timestamp_table[timestamp] = colstats
44
45 def printcol(name, val):
46    print "<td>" + str(val) + "</td>",
47
48 def print_timestamp(name, val):
49    global glo_slicename
50    global glo_name
51
52    link = "report.php?slice=" + glo_slicename + "&name=" + glo_name + \
53           "&timestamp=" + val
54
55    print "<td><a href=\""+link+"\">" + str(val) + "</a></td>",
56
57 def reportstats():
58    global glo_colnames
59    global glo_timestamp_table
60
61    keys = glo_timestamp_table.keys()
62    keys.sort()
63
64    print "<table>"
65
66    print "<tr><td>timestamp</td><td>ctime</td>",
67    for colname in glo_colnames:
68        print "<td>" + colname + "</td>",
69    print "</tr>"
70
71    for timestamp in keys:
72        colstats = glo_timestamp_table[timestamp]
73
74        print "<tr>",
75
76        print_timestamp("timestamp", timestamp)
77        printcol("ctime", time.ctime(float(timestamp)))
78
79        for i,colname in enumerate(glo_colnames):
80            printcol(colname, colstats[i])
81
82        print "</tr>"
83
84    print "</table>"
85
86 def write_graph(colindex):
87    global glo_colnames
88    global glo_timestamp_table
89
90    keys = glo_timestamp_table.keys()
91    keys.sort()
92
93    try:
94        f = open("/tmp/history.dat", "w")
95    except:
96        print "failed to write histogram data file"
97        return
98
99    for timestamp in keys:
100        colstats = glo_timestamp_table[timestamp]
101
102        if (colstats[colindex]>=0):
103           ltime = time.localtime(float(timestamp))
104           timefmt = str(ltime[0]) + "/" + str(ltime[1]) + "/" + str(ltime[2])
105
106           f.write(str(timefmt) + " " + str(colstats[colindex]) + "\n")
107
108    f.close()
109
110 def report_graph(colname, colindex, title, pngname):
111    write_graph(colindex)
112
113    f = open("/tmp/history.gnuplot", "w")
114    f.write('set output "' + pngname + '"\n')
115    f.write('set term png\n')
116    f.write('set ylabel "' + colname + ' (seconds)"\n')
117    f.write('set xlabel "date"\n')
118    f.write('set xdata time\n')
119    f.write('set timefmt "%Y/%m/%d"\n')
120    f.write('plot "/tmp/history.dat" using 1:2 with linespoints\n')
121    f.close()
122
123    os.system("gnuplot < /tmp/history.gnuplot")
124
125    print '<h2>' + title + '</h2>'
126    print '<br><img src="' + os.path.basename(pngname) + '"><br>'
127
128 def reportgraphs():
129    global glo_colnames, glo_name, glo_slicename
130
131    for i,colname in enumerate(glo_colnames):
132        pngname = "/repository/phonehome/history_" + glo_name + "_" + glo_slicename + "_" + colname + ".png"
133
134        report_graph(colname, i, "historical graph of " + colname, pngname)
135
136 def main():
137    global glo_name
138    global glo_slicename
139
140    name = "smbphonehome_tar"
141    slicename = "arizona_stork_install"
142    timestamp = None
143
144    if len(sys.argv)>1:
145        slicename = sys.argv[1]
146
147    if len(sys.argv)>2:
148        name = sys.argv[2]
149
150    # some of the names are a  little misleading, so fix them up
151    if name == "smbphonehome_tar":
152        title = "install"
153    elif name == "cpubench":
154        title = "sieve"
155    else:
156        title = name
157
158    glo_name = name
159    glo_slicename = slicename
160
161    print "<h1>" + str(title) + " history report for " + slicename + "</h1>"
162
163    # a suffix for use in the name of the png file
164    if timestamp:
165       timestamp_suffix = "_" + timestamp
166    else:
167       timestamp_suffix = ""
168
169    candidateName = "/repository/phonehome/" + name + "_" + slicename + ".txt"
170    for file in os.listdir("/repository/phonehome"):
171       fullName = os.path.join("/repository/phonehome", file)
172
173       if fullName.startswith(candidateName):
174          carat = fullName.find("^")
175          if carat>=0:
176             timestamp = fullName[carat+1:]
177             if (timestamp != "yesterday") and (not timestamp.endswith("~")):
178                report.reset()
179                report.read(name, slicename, timestamp)
180                genstats(timestamp)
181
182    reportstats()
183    reportgraphs()
184
185 if __name__ == "__main__":
186    main()