|
|
@@ -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()
|