def from_yaml(cls, loader, node):
logging.debug('{}:process(loader={}, node={})'.format(cls.__name__,
loader, node))
# e.g.:
# SequenceNode(tag=u'!ArrayItem', value=[
# MappingNode(tag=u'tag:yaml.org,2002:map', value=[
# (ScalarNode(tag=u'tag:yaml.org,2002:str', value=u'SELECT'),
# MappingNode(tag=u'tag:yaml.org,2002:map', value=[
# (ScalarNode(tag=u'tag:yaml.org,2002:str', value=u'plugin'),
# , ...)
# ]), ...
# ), (key, value), ... ])
# , ... ])
assert isinstance(node, yaml.SequenceNode), \
"{} tag isn't YAML array".format(cls.__name__)
select, index_keys, items, item_desc = list(), list(), list(), None
for elem in node.value:
for key, value in elem.value:
if key.value == 'ITEM-DESC':
assert item_desc is None, "ITEM-DESC key already set"
item_desc = value
if key.value == 'INDEX-KEY':
assert len(index_keys) == 0, "INDEX-KEY key already set"
index_keys = loader.construct_sequence(value)
if key.value == 'SELECT':
select.append(loader.construct_mapping(value))
# validate item description
assert item_desc is not None, "Mandatory ITEM-DESC key isn't set"
assert len(select) > 0 or len(index_keys) > 0, \
"Mandatory key (INDEX-KEY or SELECT) isn't set"
metrics = loader.collector.items(select)
# select metrics based on INDEX-KEY provided
if len(index_keys) > 0:
metric_set = set()
for metric in metrics:
value = CollectdValue()
for key in index_keys:
setattr(value, key, getattr(metric, key))
metric_set.add(value)
metrics = list(metric_set)
# build items based on SELECT and/or INDEX-KEY criteria
for metric in metrics:
item = cls.format_node(item_desc,
{'vl': metric, 'system': loader.system,
'config': loader.config})
items.append(loader.construct_mapping(item))
return items
评论列表
文章目录