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:
Luka Peschke
2019-11-26 16:48:33 +01:00
parent eabce23c37
commit ee8b341f2d
3 changed files with 39 additions and 2 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -0,0 +1,5 @@
---
upgrade:
- |
When the config is loaded, there is now a verification for duplicates
between ``groupby`` and ``metadata`` for each metric.