| #!/usr/bin/python |
| # -*- coding: utf-8 -*- |
| |
| from ceilometerclient import client |
| from os import environ as env |
| import keystoneclient.v2_0.client as ksclient |
| import re |
| import datetime |
| import time |
| from monitor.monitordriver import * |
| from core.models import * |
| |
| def object_to_filter(model_name, pk): |
| filter_dict = { |
| 'Slice':[Slice, 'tenant_id', 'project_id'], |
| 'Sliver':[Sliver, 'instance_id', 'resource_id'], |
| 'Site':[Site, 'tenant_id', 'project_id'] |
| } |
| |
| mod,field,tag = filter_dict[model_name] |
| obj = mod.objects.get(pk=pk) |
| return '%s=%s'%(tag,mod[field]) |
| |
| |
| def cli_to_array(cli_query): |
| '''This converts from the cli list of queries to what is required |
| by the python api. |
| so from: |
| "this<=34;that=foo" |
| to |
| "[{field=this,op=le,value=34},{field=that,op=eq,value=foo}]" |
| ''' |
| if cli_query is None: |
| return None |
| |
| op_lookup = {'!=': 'ne', |
| '>=': 'ge', |
| '<=': 'le', |
| '>': 'gt', |
| '<': 'lt', |
| '=': 'eq'} |
| |
| def split_by_op(string): |
| # two character split (<=,!=) |
| frags = re.findall(r'([[a-zA-Z0-9_.]+)([><!]=)([^ -,\t\n\r\f\v]+)', |
| string) |
| if len(frags) == 0: |
| #single char split (<,=) |
| frags = re.findall(r'([a-zA-Z0-9_.]+)([><=])([^ -,\t\n\r\f\v]+)', |
| string) |
| return frags |
| |
| opts = [] |
| queries = cli_query.split(';') |
| for q in queries: |
| frag = split_by_op(q) |
| if len(frag) > 1: |
| raise ValueError('incorrect seperator %s in query "%s"' % |
| ('(should be ";")', q)) |
| if len(frag) == 0: |
| raise ValueError('invalid query %s' % q) |
| query = frag[0] |
| opt = {} |
| opt['field'] = query[0] |
| opt['op'] = op_lookup[query[1]] |
| opt['value'] = query[2] |
| opts.append(opt) |
| return opts |
| |
| def meters_to_stats(meters): |
| stats = DashboardStatistics() |
| for m in meters: |
| timestamp = datetime.datetime.strptime(m.duration_start,'%Y-%m-%dT%H:%M:%S') |
| stats.stat_list.append({'timestamp':timestamp, 'value':m.sum}) |
| stats.sum+=m.sum |
| stats.average+=m.sum |
| stats.unit = 'ns' |
| |
| stats.average/=len(meters) |
| return stats |
| |
| |
| |
| class CeilometerDriver(MonitorDriver): |
| def get_meter(self, meter, obj, pk, keystone=None): |
| if (not keystone): |
| keystone = {} |
| keystone['username']=env['OS_USERNAME'] |
| keystone['password']=env['OS_PASSWORD'] |
| keystone['auth_url']=env['OS_AUTH_URL'] |
| keystone['tenant_name']=env['OS_TENANT_NAME'] |
| keystone['os_cacert']=env['OS_CACERT'] |
| |
| ceilometer_client = client._get_ksclient(**keystone) |
| token = ceilometer_client.auth_token |
| |
| ceilo_endpoint = client._get_endpoint(ceilometer_client, **keystone) |
| #ceilometer = client.get_client(2, username=keystone['username'], password=keystone['password'], tenant_name=keystone['tenant_name'], auth_url=keystone['auth_url']) |
| |
| ceilometer = client.Client('2',endpoint = ceilo_endpoint, token = lambda: token) |
| |
| cur_ts = datetime.datetime.fromtimestamp(time.time()-86400) |
| str_ts = cur_ts.strftime('%Y-%m-%dT%H:%M:%S') |
| |
| object_filter = object_to_filter(obj, pk) |
| filter=';'.join([object_filter,'timestamp>%s'%str_ts]) |
| #query = cli_to_array("project_id=124de34266b24f57957345cdb43cc9ff;timestamp>2014-12-11T00:00:00") |
| query = cli_to_array(filter) |
| |
| meters = ceilometer.statistics.list(meter,q=query,period=3600) |
| |
| stats = meters_to_stats(meters) |
| return stats |
| |