正式数据源接口

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

不同的策略向数据源方法的参数传递不同的值,而这些值应该统一,正如数据源基类所暗示的那样。形式化数据源基类将确保所有策略都能工作,而无需考虑底层数据源。此外,方法返回类型也应统一。

问题描述

Watcher 策略依赖于特定的数据源才能工作,而策略应该无论底层数据源如何都能工作。这些不兼容性是由于向方法参数传递不同类型的值造成的。这些问题大多是过去没有数据源基类时的遗留问题。

用例

作为最终用户,我希望策略无论我部署了什么数据源都能工作。

作为开发者,我希望更容易地开发或改进新的策略,同时尽量减少我对底层数据源的关注。

提议的变更

数据源基类已更改,并添加了注释以描述参数的预期值和单位。对于某些参数,其值可以是预定义选项之一,则在基类中维护一个选项列表。

新的列表将是 AGGREGATESRESOURCE_TYPESAGGREGATES 包含可以传递给 aggregate 参数的所有可能选项。

AGGREGATES 的可能选项是 meanminmax。 Mean 将取代每个 avg 实例,并且是首选,因为它不太含糊。

AGGREGATES = ['mean', 'min', 'max', 'count']

许多不同的参数在不同的方法之间共享,并且它们共享相同类型的值。这些参数是

  • resource_id

  • 周期 (period)

  • 粒度 (granularity)

  • 聚合 (aggregate)

resource_id 已重命名为 resource,应该为特定资源的检索对象,但应向数据源传递更多关于该资源的信息。 RESOURCE_TYPES 列表解决了所需的环境信息。它包含所有可能的资源类型,这将允许数据源访问其检索数据所需的对象属性。

RESOURCE_TYPES = ['compute_node', 'instance', 'bare_metal', 'storage']

资源类型需要访问资源对象的正确属性,因为对象属性的名称因对象而异。

"""Demonstration accessing the same data from different objects"""
if resource_type == 'compute_node':
  hostname = resource.hypervisor_hostname
elif resource_type == 'instance':
  hostname = resource.name

raw_kwargs = dict(
  name=meter_name,
  start_time=start_timestamp,
  end_time=end_timestamp,
  dimensions={'hostname': hostname},
)

资源的名称基于辅助类中的名称,以简化访问这些 API。 ironic_helper 中的方法名称将被更改,以更好地适应其他辅助程序中的名称,例如 cinder_helper

period 用于指定用于聚合指标的时间量(以秒为单位)。

granularity 用于指定时间序列之间的间隔(以秒为单位)。

aggregate 参数已经涵盖,因为值是从 AGGREGATES 中选择的。

statistic_aggregation 方法不再使用 METRIC_MAP 字典中的 meter_name 值作为标识符,而是将使用键。数据源仍然可以使用 METRIC_MAP 的值来确定如何从其数据库中检索指标。参数 aggregation 已重命名为 aggregate,以匹配其他方法使用的名称。参数 group_bydimensions 已删除。

DataSourceBase 中大多数方法的定义现在将如下所示。

def statistic_aggregation(self, resource=None, resource_type,
                          meter_name=None, period=300,
                          granularity=300, aggregate='mean')

def get_host_cpu_usage(self, resource, resource_type, period, aggregate,
                       granularity=None)

def get_host_memory_usage(self, resource, resource_type, period, aggregate,
                          granularity=None)

预期的值和返回类型将在 DataSourceBase 中使用代码块进行记录。

@abc.abstractmethod
def get_host_cpu_usage(self, resource, resource_type, period, aggregate,
                      granularity=None):
    """ Get the amount of cpu usage for the host

    :param resource: The object returned by clients such as Server or
    Hypersivor when calling nova.servers.get or nova.hypervisors.get
    :param resource_type: The Type of the resource object selected from
    RESOURCE_TYPES.
    :param period: The amount of seconds back in time metrics are aggregated
    over.
    :param aggregate: The method to aggregate data selected from AGGREGATES.
    :param granularity: Interval between collected data in seconds.
    :return: Percentage of total cpu usage represented by float between 0-100
    """

并非所有数据源都能实现所有这些不同的选项。例如,某些数据源不支持粒度,并且大多数数据源不支持 count 聚合。这些不兼容性应该通过合理的替代方案和警告来满足,但应避免抛出错误。

最后,list_metricscheck_availability 方法由 API 用于在执行 state 调用时返回有关策略的信息。

备选方案

接受某些策略仅适用于特定数据源。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

所有策略和一些数据源都需要进行调整才能与新的 DataSourceBase 兼容,这将需要开发工作。

实现

负责人

主要负责人

<Dantali0n>

工作项

  • 根据新的接口规范更改 DataSourceBase。

  • 在 DataSourceBase 中编写注释以记录接口。

  • 调整现有数据源以使其与新接口一起工作。

  • 更改单元测试以使其与新接口一起工作。

依赖项

测试

当前的单元测试需要采用才能与新的数据源基类一起工作。由于删除了 dimensions 参数,Monasca 测试用例将需要进行最多的更改。

除了单元测试之外,数据源的正确功能还在工作环境中进行检查,例如 devstack。

文档影响

参考资料

历史