基于文件的指标映射¶
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 |
引入 |