cabot/app/cabotapp/graphite.py
2014-01-05 17:24:04 +00:00

91 lines
2.2 KiB
Python

from os import environ as env
from django.conf import settings
import requests
import logging
graphite_api = settings.GRAPHITE_API
user = settings.GRAPHITE_USER
password = settings.GRAPHITE_PASS
auth = (user, password)
def get_data(target_pattern):
resp = requests.get(
graphite_api + 'render', auth=auth,
params={
'target': target_pattern,
'format': 'json',
'from': '-10min'
}
)
resp.raise_for_status()
return resp.json
def get_matching_metrics(pattern):
print 'Getting metrics matching %s' % pattern
resp = requests.get(
graphite_api + 'metrics/find/', auth=auth,
params={
'query': pattern,
'format': 'completer'
},
headers={
'accept': 'application/json'
}
)
resp.raise_for_status()
return resp.json
def get_all_metrics(limit=None):
"""Grabs all metrics by navigating find API recursively"""
metrics = []
count = 0
def get_leafs_of_node(nodepath):
for obj in get_matching_metrics(nodepath)['metrics']:
if int(obj['is_leaf']) == 1:
metrics.append(obj['path'])
else:
get_leafs_of_node(obj['path'])
get_leafs_of_node('')
return metrics
def parse_metric(metric, mins_to_check=5):
"""
Returns dict with:
- num_series_with_data: Number of series with data
- num_series_no_data: Number of total series
- max
- min
- average_value
"""
ret = {
'num_series_with_data': 0,
'num_series_no_data': 0,
'error': None,
'all_values': [],
'raw': ''
}
try:
data = get_data(metric)
except requests.exceptions.RequestException, e:
ret['error'] = 'Error getting data from Graphite: %s' % e
ret['raw'] = ret['error']
logging.error('Error getting data from Graphite: %s' % e)
return ret
all_values = []
for target in data:
values = [float(t[0]) for t in target['datapoints'][-mins_to_check:] if t[0] is not None]
if values:
ret['num_series_with_data'] += 1
else:
ret['num_series_no_data'] += 1
all_values.extend(values)
if all_values:
ret['max'] = max(all_values)
ret['min'] = min(all_values)
ret['average_value'] = sum(all_values)/len(all_values)
ret['all_values'] = all_values
ret['raw'] = data
return ret