2 # -*- coding: utf-8 -*-
4 from ceilometerclient import client
5 from os import environ as env
6 import keystoneclient.v2_0.client as ksclient
10 from monitor.monitordriver import *
13 def cli_to_array(cli_query):
14 '''This converts from the cli list of queries to what is required
19 "[{field=this,op=le,value=34},{field=that,op=eq,value=foo}]"
24 op_lookup = {'!=': 'ne',
31 def split_by_op(string):
32 # two character split (<=,!=)
33 frags = re.findall(r'([[a-zA-Z0-9_.]+)([><!]=)([^ -,\t\n\r\f\v]+)',
36 #single char split (<,=)
37 frags = re.findall(r'([a-zA-Z0-9_.]+)([><=])([^ -,\t\n\r\f\v]+)',
42 queries = cli_query.split(';')
46 raise ValueError('incorrect seperator %s in query "%s"' %
47 ('(should be ";")', q))
49 raise ValueError('invalid query %s' % q)
52 opt['field'] = query[0]
53 opt['op'] = op_lookup[query[1]]
54 opt['value'] = query[2]
58 def meters_to_stats(meters):
59 stats = DashboardStatistics()
61 timestamp = datetime.datetime.strptime(m.duration_start,'%Y-%m-%dT%H:%M:%S')
62 stats.stat_list.append({'timestamp':timestamp, 'value':m.sum})
67 stats.average/=len(meters)
72 class CeilometerDriver(MonitorDriver):
73 def get_meter(self, meter, object_filter, keystone):
76 keystone['username']=env['OS_USERNAME']
77 keystone['password']=env['OS_PASSWORD']
78 keystone['auth_url']=env['OS_AUTH_URL']
79 keystone['tenant_name']=env['OS_TENANT_NAME']
81 ceilometer_client = client._get_ksclient(**keystone)
82 token = ceilometer_client.auth_token
84 ceilo_endpoint = client._get_endpoint(ceilometer_client, **keystone)
86 ceilometer = client.Client('2',endpoint = ceilo_endpoint, token = lambda: token)
88 cur_ts = datetime.datetime.fromtimestamp(time.time()-86400)
89 str_ts = cur_ts.strftime('%Y-%m-%dT%H:%M:%S')
91 filter=';'.join([object_filter,'timestamp>%s'%str_ts])
92 #query = cli_to_array("project_id=124de34266b24f57957345cdb43cc9ff;timestamp>2014-12-11T00:00:00")
93 query = cli_to_array(filter)
95 meters = ceilometer.statistics.list(meter,q=query,period=3600)
97 stats = meters_to_stats(meters)