Эх сурвалжийг харах

summarize stats into 15-minute intervals

raylu 11 жил өмнө
parent
commit
88a63e80dd
2 өөрчлөгдсөн 26 нэмэгдсэн , 4 устгасан
  1. 24 3
      api/server.py
  2. 2 1
      web/static/js/stats.js

+ 24 - 3
api/server.py

@@ -114,6 +114,10 @@ def get_raw(split, query, environ):
 
 def get_stats(split, query, environ):
 	raw = get_raw(split, query, environ)
+	try:
+		interval = int(query.get('interval', 1))
+	except ValueError:
+		raise HTTPException(400, 'interval must be integer')
 	last_val = fileio.gen_template(-1)
 	stats = defaultdict(dict)
 	for date, data in raw.items():
@@ -139,7 +143,7 @@ def get_stats(split, query, environ):
 							if d > 0:
 								array[i] = array[i] * subfields['num_cpus'][i] * 100 / sums[i]
 					stats[field].setdefault(subfield, {})
-					stats[field][subfield][date] = array
+					stats[field][subfield][date] = average(array, interval)
 			elif field == 'mem':
 				# translate total to free, subtract buffers and cached from used
 				field_data = {}
@@ -157,7 +161,7 @@ def get_stats(split, query, environ):
 					field_data['cached'][i] = subfields['cached'][i]
 				for subfield, array in field_data.items():
 					stats[field].setdefault(subfield, {})
-					stats[field][subfield][date] = array
+					stats[field][subfield][date] = average(array, interval)
 			elif field == 'net':
 				field_data = {}
 				for subfield in ['bit/s_in', 'bit/s_out', 'err_in', 'err_out', 'drop_in', 'drop_out']:
@@ -175,7 +179,7 @@ def get_stats(split, query, environ):
 						field_data[subfield][i] = subfields[subfield.replace('_', '')][i]
 				for subfield, array in field_data.items():
 					stats[field].setdefault(subfield, {})
-					stats[field][subfield][date] = array
+					stats[field][subfield][date] = average(array, interval)
 	return stats
 
 def post_datum(split, query, environ):
@@ -266,4 +270,21 @@ def load_json_body(environ):
 		raise HTTPException(400, 'post body was not a JSON dictionary')
 	return body
 
+def average(array, interval):
+	if interval == 1:
+		return array
+	averaged = []
+	accum = num_values = 0
+	for i, v in enumerate(array):
+		if v is not None:
+			accum += v
+			num_values += 1
+		if (i + 1) % interval == 0:
+			if num_values > 0:
+				averaged.append(accum / num_values)
+			else:
+				averaged.append(None)
+			accum = num_values = 0
+	return averaged
+
 main()

+ 2 - 1
web/static/js/stats.js

@@ -41,7 +41,7 @@ window.addEvent('domready', function() {
 	var split = document.location.pathname.split('/');
 	var url = 'http://localhost:8892/v1/' + split[2] + '/stats/' + split[3];
 	new Request.JSON({
-		'url': url + '?start=2014-04-19&end=2014-04-19',
+		'url': url + '?start=2014-04-20&end=2014-04-20&interval=15',
 		'onSuccess': graph_stats,
 	}).get();
 
@@ -110,6 +110,7 @@ window.addEvent('domready', function() {
 			'renderer': field == 'net' ? 'multi' : 'area',
 			'stroke': true,
 			'series': series,
+			'interpolation': 'step-after',
 		});
 		new Rickshaw.Graph.Legend({
 			'graph': graph,