基于文件的指标映射

https://blueprints.launchpad.net/watcher/+spec/file-base-metric-map

问题描述

Watcher 支持加载来自各种数据源的指标,但是它使用的指标存储在代码库中,不允许灵活地更改这些名称。因此,客户/管理员/用户被迫使用 Watcher 期望的命名方案。此外,如果某个指标已经在不同的名称下被使用,这也会阻碍 Watcher 的易集成性。

用例

作为 Watcher 用户,我希望 Watcher 能够选择当前使用的数据源中定义的指标名称。

作为 Watcher 用户,我希望 Watcher 能够根据需要更改指标名称。

提议的变更

应在 watcher.conf 的 watcher_decision_engine 部分添加一个 metric_map_path 选项

允许 Watcher 加载一个 YAML 文件,该文件包含一个从 Watcher 期望的内部指标名称到数据源中实际使用的指标名称的映射。

该文件是可选的,只需要包含用户期望覆盖的指标名称。

可以在 DataSourceManager 类的 __init__ 方法中调用一个方法。

例如

[watcher_decision_engine]
# ...
metric_map_path = /etc/watcher/metricmap.yaml
# ...
monasca:
  - instance_cpu_usage: VM_CPU
gnocchi:
  - instance_cpu_usage: cpu_vm_util
class DataSourceManager(object):
    def __init__(self):
        #...
        # 1. Initial loading is necessary to initialize the correct defaults
        self.metric_map = {
            mon.MonascaHelper.NAME: mon.MonascaHelper.METRIC_MAP,
            gnoc.GnocchiHelper.NAME: gnoc.GnocchiHelper.METRIC_MAP,
            ceil.CeilometerHelper.NAME: ceil.CeilometerHelper.METRIC_MAP
        }
        new_metric_map = self.metrics_from_file():
        # 2. overide the loaded default by using yaml
        # update self.metric_map recursively using new_metric_map

    def get_backend(self, metrics):
        #...
        if not no_metric:
            ds = getattr(self, datasource)
            # 3. Pass the re-loaded metric map to the datasource
            ds.METRIP_MAP.update(self.metric_map[ds.NAME])
            return ds

    def metrics_from_file(self):
        """Load metrics from the config.metric_map_path"""
        if not os.path.exists(config.metric_map_path or ''):
            return {}
        with open(config.metric_map_path, 'r') as f:
            try:
                return yaml.safe_load(f.readall())
            except yaml.YAMLERROR as e:
                log.info('Could not load %(s): %s' % (
                    config.metric_map_path, str(e)))
                return {}

关于实现的注释

步骤 1:如果默认值永远不存储在 Python 文件中,可以避免此加载。但这超出了本规范的范围,因为这将使 YAML 文件成为必需文件。

步骤 2:self.metric_map 是一个嵌套字典,因此需要特殊处理才能递归更新到数据源。

步骤 3:此加载可以移动到我们已经定义的单个 getter 中,通过将 METRIC_MAP 字典设为类变量,来实现“指标映射通信的 API”。

备选方案

与其直接在数据源中更新 METRIC_MAP,不如将映射传递给每个数据源类,但这会将更改传递到其他类和文件,并且这种责任委托并不能带来任何合理的优势。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

应在“watcher_decision_engine”部分添加一个配置选项,但这并非必需,而是一个“好拥有”功能,因为这可能导致潜在的名称冲突。

用户/管理员可以在配置中配置一个新参数,但这并非强制性配置。

性能影响

其他部署者影响

由于文件创建/存在是可选的,因此没有影响

开发人员影响

实现

负责人

主要负责人

<sumitjami>

工作项

  • 添加配置选项 ‘metric_map_file’

  • 在 DataSourceManager 类中添加新方法

  • 加载文件并更新 metric_map 变量

  • 在 get_backend 方法中更新数据源的 METRIC_MAP 字典

依赖项

测试

  • 添加单元测试以检查文件是否存在错误。

  • 添加单元测试以检查文件内容是否加载正确。

文档影响

更新 Watcher 开发人员文档。

参考资料

历史

修订版

发布名称

描述

Train

引入