正式数据源接口¶
https://blueprints.launchpad.net/watcher/+spec/formal-datasource-interface
不同的策略向数据源方法的参数传递不同的值,而这些值应该统一,正如数据源基类所暗示的那样。形式化数据源基类将确保所有策略都能工作,而无需考虑底层数据源。此外,方法返回类型也应统一。
问题描述¶
Watcher 策略依赖于特定的数据源才能工作,而策略应该无论底层数据源如何都能工作。这些不兼容性是由于向方法参数传递不同类型的值造成的。这些问题大多是过去没有数据源基类时的遗留问题。
用例¶
作为最终用户,我希望策略无论我部署了什么数据源都能工作。
作为开发者,我希望更容易地开发或改进新的策略,同时尽量减少我对底层数据源的关注。
提议的变更¶
数据源基类已更改,并添加了注释以描述参数的预期值和单位。对于某些参数,其值可以是预定义选项之一,则在基类中维护一个选项列表。
新的列表将是 AGGREGATES 和 RESOURCE_TYPES。 AGGREGATES 包含可以传递给 aggregate 参数的所有可能选项。
AGGREGATES 的可能选项是 mean、min 和 max。 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_by 和 dimensions 已删除。
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_metrics 和 check_availability 方法由 API 用于在执行 state 调用时返回有关策略的信息。
备选方案¶
接受某些策略仅适用于特定数据源。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
所有策略和一些数据源都需要进行调整才能与新的 DataSourceBase 兼容,这将需要开发工作。
实现¶
负责人¶
- 主要负责人
<Dantali0n>
工作项¶
根据新的接口规范更改 DataSourceBase。
在 DataSourceBase 中编写注释以记录接口。
调整现有数据源以使其与新接口一起工作。
更改单元测试以使其与新接口一起工作。
依赖项¶
无
测试¶
当前的单元测试需要采用才能与新的数据源基类一起工作。由于删除了 dimensions 参数,Monasca 测试用例将需要进行最多的更改。
除了单元测试之外,数据源的正确功能还在工作环境中进行检查,例如 devstack。
文档影响¶
无
参考资料¶
无
历史¶
无