Check for duplicates in "groupby" and "metadata" for each metric
This updates the "cloudkitty.collector.validate_conf" function in order to check for duplicates between "groupby" and "metadata" in the metrics.yml configuration file. Change-Id: Ic1d3e301d111a5694aff3a665aff261c562a0efc Story: 2006941 Task: 37615
This commit is contained in:
@@ -248,6 +248,29 @@ class BaseCollector(object):
|
||||
return name, data
|
||||
|
||||
|
||||
class InvalidConfiguration(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def check_duplicates(metric_name, metric):
|
||||
"""Checks for duplicates in "groupby" and "metadata".
|
||||
|
||||
:param metric: config dict for a metric to check
|
||||
:type metric: dict
|
||||
"""
|
||||
groupby = set(metric['groupby'])
|
||||
metadata = set(metric['metadata'])
|
||||
duplicates = groupby.intersection(metadata)
|
||||
if duplicates:
|
||||
raise InvalidConfiguration(
|
||||
'Metric {} has duplicates in groupby and metadata: {}'.format(
|
||||
metric_name, metric))
|
||||
|
||||
metric['groupby'] = list(groupby)
|
||||
metric['metadata'] = list(metadata)
|
||||
return metric
|
||||
|
||||
|
||||
def validate_conf(conf):
|
||||
"""Validates the provided configuration."""
|
||||
collector = get_collector_without_invoke()
|
||||
@@ -255,4 +278,5 @@ def validate_conf(conf):
|
||||
for metric_name, metric in output.items():
|
||||
if 'alt_name' not in metric.keys():
|
||||
metric['alt_name'] = metric_name
|
||||
check_duplicates(metric_name, metric)
|
||||
return output
|
||||
|
@@ -27,7 +27,7 @@ class MetricConfigValidationTest(tests.TestCase):
|
||||
'metrics': {
|
||||
'metric_one': {
|
||||
'groupby': ['one'],
|
||||
'metadata': ['one'],
|
||||
'metadata': ['two'],
|
||||
'unit': 'u',
|
||||
}
|
||||
}
|
||||
@@ -36,7 +36,7 @@ class MetricConfigValidationTest(tests.TestCase):
|
||||
base_output = {
|
||||
'metric_one': {
|
||||
'groupby': ['one'],
|
||||
'metadata': ['one'],
|
||||
'metadata': ['two'],
|
||||
'unit': 'u',
|
||||
'factor': 1,
|
||||
'offset': 0,
|
||||
@@ -166,3 +166,11 @@ class MetricConfigValidationTest(tests.TestCase):
|
||||
collector.prometheus.PrometheusCollector.check_configuration(data),
|
||||
expected_output,
|
||||
)
|
||||
|
||||
def test_check_duplicates(self):
|
||||
data = copy.deepcopy(self.base_data)
|
||||
for metric_name, metric in data['metrics'].items():
|
||||
metric['metadata'].append('one')
|
||||
self.assertRaises(
|
||||
collector.InvalidConfiguration,
|
||||
collector.check_duplicates, metric_name, metric)
|
||||
|
@@ -0,0 +1,5 @@
|
||||
---
|
||||
upgrade:
|
||||
- |
|
||||
When the config is loaded, there is now a verification for duplicates
|
||||
between ``groupby`` and ``metadata`` for each metric.
|
Reference in New Issue
Block a user