CloudKitty新增service计费(gnocchi)
这里,我们以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.'), ]
- 增加gnocchi采集
# 修改cloudkitty/collector/gnocchi.py
class GnocchiCollector(collector.BaseCollector):
...
# 修改相关属性定义
retrieve_mappings = {
'compute': 'instance',
...
# 新增service查询定义(要和gnocchi中的resource对应)
'network.lb.listener': 'network_lb_listener',
}
metrics_mappings = {
'compute': [
('vcpus', 'max'),
('memory', 'max'),
('cpu', 'max'),
('disk.root.size', 'max'),
('disk.ephemeral.size', 'max')],
...
# 新增指标定义(要和gnocchi中的指标对应)
'network.lb.listener': [
('network.services.lb.limit.connections', 'max')],
}
units_mappings = {
'compute': (1, 'instance'),
'image': ('image.size', 'MB'),
'volume': ('volume.size', 'GB'),
...
# 增加指标单位定义
'network.lb.listener': ('network.services.lb.limit.connections', 'connection'),
}
# 修改资源处理函数,根据需要进行处理,一般不需要修改(本例子就没有修改此函数)
def resource_info(self, resource_name, start, end, project_id,
q_filter=None):
qty, unit = self.units_mappings.get(resource_name, self.default_unit)
resources = self.get_resources(resource_name, start, end,
project_id=project_id,
q_filter=q_filter)
formated_resources = list()
for resource in resources:
resource_data = self.t_gnocchi.strip_resource_data(
resource_name, resource)
mappings = self.metrics_mappings[resource_name]
self._expand_metrics([resource_data], mappings, start, end)
resource_data = self.t_gnocchi.strip_metrics_data(
resource_name, resource_data)
resource_data.pop('metrics', None)
# Convert network.bw.in, network.bw.out and image unit to MB
if resource.get('type') == 'instance_network_interface':
resource_data[qty] = (
decimal.Decimal(resource_data[qty]) / units.M)
elif resource.get('type') == 'image':
resource_data[qty] = (
decimal.Decimal(resource_data[qty]) / units.Mi)
elif resource.get('type') == 'network':
resource_data[qty] = (
decimal.Decimal(resource_data[qty]) / units.k)
data = self.t_cloudkitty.format_item(
resource_data, unit,
decimal.Decimal(
qty if isinstance(qty, int) else resource_data[qty]))
# NOTE(sheeprine): Reference to gnocchi resource used by storage
data['resource_id'] = data['desc']['resource_id']
formated_resources.append(data)
return formated_resources
增加transformer
# 编辑cloudkitty/transformer/gnocchi.py
class GnocchiTransformer(transformer.BaseTransformer):
...
# 增加转换配置,主要目的是将在存储中的属性或指标名称转换成我们需要的
# 属性的转换配置
network_lb_listener_map = {
'name': ['display_name', 'name'],
}
# 指标的转换配置
network_lb_listener_metrics_map = {
'connection_limit': ['network.services.lb.limit.connections']
}