diff --git a/observabilityclient/tests/unit/test_utils.py b/observabilityclient/tests/unit/test_utils.py index 2eabf43..d9d734d 100644 --- a/observabilityclient/tests/unit/test_utils.py +++ b/observabilityclient/tests/unit/test_utils.py @@ -128,3 +128,70 @@ class Metrics2ColsTest(testtools.TestCase): ret = metric_utils.metrics2cols(input_metrics) self.assertEqual(expected, ret) + + def test_metrics2cols_column_ordering(self): + metric = { + 'value': [ + 1234567, + 5 + ], + 'metric': { + 'a_label1': 'value1', + 'b_label2': 'value2', + } + } + input_metrics = [prometheus_client.PrometheusMetric(metric)] + expected = (['a_label1', 'b_label2', 'value'], + [['value1', 'value2', 5]]) + + ret = metric_utils.metrics2cols(input_metrics) + self.assertEqual(expected, ret) + + metric = { + 'value': [ + 1234567, + 5 + ], + 'metric': { + 'b_label1': 'value1', + 'a_label2': 'value2', + } + } + input_metrics = [prometheus_client.PrometheusMetric(metric)] + expected = (['a_label2', 'b_label1', 'value'], + [['value2', 'value1', 5]]) + + ret = metric_utils.metrics2cols(input_metrics) + self.assertEqual(expected, ret) + + metric1 = { + 'value': [ + 1234567, + 5 + ], + 'metric': { + 'b_label1': 'value1', + 'a_label2': 'value2', + } + } + metric2 = { + 'value': [ + 1234567, + 5 + ], + 'metric': { + 'b_label1': 'value1', + 'a_label2': 'value2', + 'd_label3': 'value3', + 'c_label4': 'value4', + } + } + input_metrics = [prometheus_client.PrometheusMetric(metric1), + prometheus_client.PrometheusMetric(metric2)] + expected = (['a_label2', 'b_label1', 'c_label4', 'd_label3', 'value'], + [['value2', 'value1', '', '', 5], + ['value2', 'value1', 'value4', 'value3', 5]] + ) + + ret = metric_utils.metrics2cols(input_metrics) + self.assertEqual(expected, ret) diff --git a/observabilityclient/utils/metric_utils.py b/observabilityclient/utils/metric_utils.py index ea75de0..ba70b9a 100644 --- a/observabilityclient/utils/metric_utils.py +++ b/observabilityclient/utils/metric_utils.py @@ -100,6 +100,7 @@ def format_labels(d: dict) -> str: def metrics2cols(m): # get all label keys cols = list(set().union(*(d.labels.keys() for d in m))) + cols.sort() cols.append("value") fields = [] for metric in m: