CloudKitty新增service计费(ceilometer)
这里,我们以loadbanlancer为例进行说明。
增加collector
- 增加默认配置
# 修改cloudkitty/collector/__init__.py
# 找到默认配置collect_opts,修改services的default值
collect_opts = [
...
cfg.ListOpt('services',
default=['compute',
'image',
'volume',
'router',
'volume.snapshot',
'network.bw.in',
'network.bw.out',
'network.floating',
#增加监听器的配置
'network.lb.listener'],
help='Services to monitor.'), ]
- 增加ceilormeter采集
# 修改cloudkitty/collector/ceilometer.py
class CeilometerCollector(collector.BaseCollector):
...
# 增加相关采集处理函数
# 注意这里函数的命名(以 'get_ + 服务名' 命名,并将 '.' 替换为 '_')
def get_network_lb_listener(self,
start,
end=None,
project_id=None,
q_filter=None):
# 获取采集统计数据
# 注意这里的采集资源名称 network.services.lb.limit.connections,需要和ceilormeter确认
active_lb_listeners_stats = self.resources_stats('network.services.lb.limit.connections',
start,
end,
project_id,
q_filter)
listener_data = []
for listener_stats in active_lb_listeners_stats:
listener_id = listener_stats.groupby['resource_id']
if not self._cacher.has_resource_detail('network.lb.listener',
listener_id):
raw_resource = self._conn.resources.get(listener_id)
listener = self.t_ceilometer.strip_resource_data(
'network.lb.listener',
raw_resource)
self._cacher.add_resource_detail('network.lb.listener',
listener_id,
listener)
listener = self._cacher.get_resource_detail('network.lb.listener',
listener_id)
# 对采集到的数据进行格式化转换
listener_data.append(self.t_cloudkitty.format_item(listener,
'connection',
# 注意这里的取值
listener_stats.max))
if not listener_data:
raise collector.NoDataCollected(self.collector_name,
'network.lb.listener')
# 对采集到的数据进行格式化转换
return self.t_cloudkitty.format_service('network.lb.listener',
listener_data)
增加transformer
# 编辑cloudkitty/transformer/ceilometer.py
class CeilometerTransformer(transformer.BaseTransformer):
...
# 增加转换配置
network_lb_listener_map = {
'name': ['name'],
'connection_limit':['connection_limit'],
'protocol_port': ['protocol_port'],
'protocol': ['protocol'],
'admin_state_up': ['admin_state_up'],
'loadbalancers': ['loadbalancers'],
}
...
# 增加转换函数
# 注意这里函数的命名(以 '_strip_ + 服务名' 命名,并将 '.' 替换为 '_')
def _strip_network_lb_listener(self, data):
# 这里调用通用的转换方法,也可根据需要自己写处理逻辑
# 注意这里的服务名(将 '.' 替换为 '_')
return self.generic_strip('network_lb_listener', data, 'listener_id')