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
|
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):
|
def validate_conf(conf):
|
||||||
"""Validates the provided configuration."""
|
"""Validates the provided configuration."""
|
||||||
collector = get_collector_without_invoke()
|
collector = get_collector_without_invoke()
|
||||||
@@ -255,4 +278,5 @@ def validate_conf(conf):
|
|||||||
for metric_name, metric in output.items():
|
for metric_name, metric in output.items():
|
||||||
if 'alt_name' not in metric.keys():
|
if 'alt_name' not in metric.keys():
|
||||||
metric['alt_name'] = metric_name
|
metric['alt_name'] = metric_name
|
||||||
|
check_duplicates(metric_name, metric)
|
||||||
return output
|
return output
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class MetricConfigValidationTest(tests.TestCase):
|
|||||||
'metrics': {
|
'metrics': {
|
||||||
'metric_one': {
|
'metric_one': {
|
||||||
'groupby': ['one'],
|
'groupby': ['one'],
|
||||||
'metadata': ['one'],
|
'metadata': ['two'],
|
||||||
'unit': 'u',
|
'unit': 'u',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,7 +36,7 @@ class MetricConfigValidationTest(tests.TestCase):
|
|||||||
base_output = {
|
base_output = {
|
||||||
'metric_one': {
|
'metric_one': {
|
||||||
'groupby': ['one'],
|
'groupby': ['one'],
|
||||||
'metadata': ['one'],
|
'metadata': ['two'],
|
||||||
'unit': 'u',
|
'unit': 'u',
|
||||||
'factor': 1,
|
'factor': 1,
|
||||||
'offset': 0,
|
'offset': 0,
|
||||||
@@ -166,3 +166,11 @@ class MetricConfigValidationTest(tests.TestCase):
|
|||||||
collector.prometheus.PrometheusCollector.check_configuration(data),
|
collector.prometheus.PrometheusCollector.check_configuration(data),
|
||||||
expected_output,
|
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