CloudKitty新增service计费(ceilometer)

这里,我们以loadbanlancer为例进行说明。

增加collector

  1. 增加默认配置
# 修改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.'), ]
  1. 增加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')