--- /dev/null
+#!/usr/bin/python
+
+# Collect statistics from myops db on node downtimes.
+# For every node that goes down we need:
+# * node down time
+# * node reboot time
+# * node notice time
+# * node up time
+
+# then for each node, order events by time
+# for each event sequence extract sub-sequences like:
+# down xx up
+# for each such sub-sequence extract
+# time between down and up
+
+from monitor.database.info.model import *
+from math import *
+import sys
+from datetime import datetime
+
+def find_next(history_list, from_index, node_status):
+ list_len = len(history_list)
+ for i in range(min(list_len-1, from_index), 0, -1):
+ v = history_list[i]
+ if v.status == node_status:
+ return i
+
+ return 0
+
+def diff_time(t1, t2):
+ d = t1-t2
+ return d.days*60*60*24 + d.seconds
+
+times = []
+frequency = {}
+count = 0
+for index,node in enumerate(HistoryNodeRecord.query.all()):
+ frequency[node.hostname] = 0
+
+
+ #if index > 3: sys.exit(1)
+
+ if node.hostname == 'planetlab-02.kyushu.jgn2.jp':
+ for h in node.versions:
+ print h.last_checked, h.status
+
+ #print "--"
+ pairs = []
+ i = len(node.versions)
+ ret = find_next(node.versions, i, 'online')
+ if ret == 0:
+ print node.hostname
+ print node.status
+ print node.last_checked
+ print node.last_changed
+ #if count > 3: sys.exit(1)
+ count += 1
+ pairs.append((datetime.now(), node.versions[-1].last_checked))
+ else:
+
+ while i > 0:
+ i = find_next(node.versions, i, 'down')
+ i2 = find_next(node.versions, i, 'offline')
+ if i == 0 and i2 == 0:
+ break
+ h1 = node.versions[i]
+ #print i, h1.last_checked, h1.status
+ h2 = node.versions[i2]
+ #print i2, h2.last_checked, h2.status
+ i = i2
+ pairs.append((h1.last_checked,h2.last_checked))
+ frequency[node.hostname] += 1
+
+ # list of all times
+
+ for p in pairs:
+ times.append(diff_time(p[0],p[1]))
+
+##frequency
+def flip_key(hash):
+ fk = {}
+ for key in hash.keys():
+ if hash[key] not in fk:
+ fk[hash[key]] = []
+ fk[hash[key]].append(key)
+ return fk
+
+freq = flip_key(frequency)
+freq_list = freq.keys()
+freq_list.sort()
+for f in freq_list:
+ print f, len(freq[f]), freq[f]
+
+times.sort()
+bins = {}
+for i in range(0,200,1):
+ step = i/2.0
+ bins[step] = []
+
+for t in times:
+ t = t/60.0/60.0/24.0
+ b = floor(t*2)/2.0
+ bins[b].append(t)
+
+keys = bins.keys()
+keys.sort()
+total = 0
+for k in keys:
+ total += len(bins[k])
+ print k, len(bins[k]), total