支持看守者中的多数据源

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/watcher/+spec/watcher-multi-datasource

问题描述

目前,看守者支持 Telemetry、Monasca 和 gnocchi 来收集集群指标。为每种数据源类型都存在一个辅助类,用于实现查询并提供结果。我们需要创建一个数据源抽象类,该类将定义所有指标能力方法的接口。各个数据源辅助类必须实现这些方法。

用例

作为管理员,我希望针对特定的数据源后端运行策略。

提议的变更

  1. 为所有数据源定义一个通用的抽象层。定义获取所有当前策略使用的指标的方法。它还包含一个指标映射,将策略指标需求映射到数据源指标名称。

    class DatasourceBase(object):
    
        METRIC_MAP=dict(datasource=dict(metric_name_watcher=
                                        metric_name_datasource,),)
    
        @abc.abstractmethod
        def get_host_cpu_usage(self, resource_id, period, aggregate,
                               granularity=None):
            raise NotImplementedError
    
        @abc.abstractmethod
        def get_instance_cpu_usage(self, resource_id, period, aggregate,
                                   granularity=None):
            raise NotImplementedError
    
  2. 将所有现有的数据源辅助类更新为 DatasourceBase 类的子类。在 ceilometer、monasca 和 gnocchi 类中实现 DatasourceBase 类的抽象方法。

  3. 支持从多个数据源收集指标数据。用户可以在 watcher.conf 中定义数据源优先级,我们可以通过将其类型更改为列表来使用现有的配置。

    [watcher_strategies.basic]
    datasource = ceilometer, gnocchi, monasca
    

    这可以通过两种方式完成

    1. 基于策略计算 datasource_backend 值。检查策略使用的计量单位是否在第一个优先的数据源中可用,如果可用,则为该审核请求的所有后续请求选择该后端。

    2. 基于指标计算 datasource_backend,即每次策略请求获取一些指标数据时,根据 conf 文件中设置的优先级以及所选数据源中指标的可用性来计算 datasource_backend 的值。

    第二种方案的开销是每次请求到达时都需要选择数据源,但优点是如果一个指标在一个数据源中不可用,它可以检查其他数据源。根据当前看守者策略的要求,第一种方案就足够了。

  4. 定义一个数据源管理器类来计算数据源后端。

    class DatasourceManager(object):
    
        def get_backend(self, metrics):
        ''' returns: object of DatasourceBase child
            class '''
    
  5. 更新现有策略以使用新的数据源类,使策略基类中的 datasource_backend 属性抽象化。

    class BasicConsolidation(base.ServerConsolidationBaseStrategy):
    
        @property
        def datasource_backend(self):
            self.datasource_backend = manager.DataSourceManager(
                config=self.config,
                osc=self.osc
                ).get_backend(self.METRIC_NAMES)
            return self._datasource_backend
    
       def get_node_cpu_usage(self, node):
           resource_id = "%s_%s" % (node.uuid, node.hostname)
           return self.datasource_backend.get_host_cpu_usage(
               resource_id = resource_id,
               period=self.period,
               aggregate = 'avg',
               granularity=None
               )
    

备选方案

如果我们保留现有的实现,每个策略都必须使用数据源驱动程序提供的特定接口。这使得策略的实现与特定的数据源高度耦合。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

使用多个数据源可能会降低整个 OpenStack 集群的性能。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

adi-sky17

工作项

  • 实现所有数据源驱动程序的基础类。

  • 定义获取现有策略使用的所有计量单位的抽象方法。

  • 在 ceilometer、monasca 和 gnocchi 类中实现抽象方法。

  • 更新现有策略以使用新的格式。

依赖项

测试

需要更新单元测试

文档影响

应更新插件文档。 https://docs.openstack.org/watcher/latest/contributor/plugin/strategy-plugin.html#querying-metrics

参考资料

历史