From ced12ac76e566593b4ae03d2e1bdf07cbc6a4d91 Mon Sep 17 00:00:00 2001 From: sroda Date: Wed, 14 Dec 2022 18:06:08 +0200 Subject: [PATCH 1/6] Move the metrics basic test to TestBase class --- .../src/opentelemetry/test/test_base.py | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py index 0d81fcb4f53..772b0db5aba 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py @@ -20,7 +20,9 @@ from opentelemetry import metrics as metrics_api from opentelemetry import trace as trace_api from opentelemetry.sdk.metrics import MeterProvider -from opentelemetry.sdk.metrics.export import InMemoryMetricReader, MetricReader +from opentelemetry.sdk.metrics.export import (InMemoryMetricReader, MetricReader, HistogramDataPoint, + NumberDataPoint) + from opentelemetry.sdk.trace import TracerProvider, export from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( InMemorySpanExporter, @@ -85,6 +87,61 @@ def sorted_spans(self, spans): # pylint: disable=R0201 reverse=True, ) + def sorted_metrics(self, metrics): + """ + Sorts metrics by metric name. + """ + return sorted( + metrics, + key=lambda m: m.name, + ) + + def get_sorted_metrics(self): + resource_metrics = ( + self.memory_metrics_reader.get_metrics_data().resource_metrics + ) + for metrics in resource_metrics: + for scope_metrics in metrics.scope_metrics: + all_metrics = list(scope_metrics.metrics) + return self.sorted_metrics(all_metrics) + + def assert_metric_expected( + self, metric, expected_value, expected_attributes + ): + data_point = next(iter(metric.data.data_points)) + + if isinstance(data_point, HistogramDataPoint): + self.assertEqual( + data_point.sum, + expected_value, + ) + elif isinstance(data_point, NumberDataPoint): + self.assertEqual( + data_point.value, + expected_value, + ) + + self.assertDictEqual( + expected_attributes, + dict(data_point.attributes), + ) + + def assert_duration_metric_expected( + self, metric, duration_estimated, expected_attributes, est_delta=200 + ): + data_point = next(iter(metric.data.data_points)) + + self.assertAlmostEqual( + data_point.sum, + duration_estimated, + delta=est_delta, + ) + + self.assertDictEqual( + expected_attributes, + dict(data_point.attributes), + ) + @staticmethod def create_tracer_provider(**kwargs): """Helper to create a configured tracer provider. From 459bb929447c3ef3d733343a44660ae395d89bad Mon Sep 17 00:00:00 2001 From: sroda Date: Wed, 14 Dec 2022 18:17:27 +0200 Subject: [PATCH 2/6] Add entry for CHANGELOG --- CHANGELOG.md | 3 +++ .../src/opentelemetry/test/test_base.py | 13 ++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0f43a10da0..e2e1acfcdff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- Add metrics basic tests to BaseTest class + ([#3092](https://github.com/open-telemetry/opentelemetry-python/pull/3092)) + ## Version 1.15.0/0.36b0 (2022-12-09) - Regenerate opentelemetry-proto to be compatible with protobuf 3 and 4 diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py index 772b0db5aba..bd472745f46 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py @@ -20,9 +20,12 @@ from opentelemetry import metrics as metrics_api from opentelemetry import trace as trace_api from opentelemetry.sdk.metrics import MeterProvider -from opentelemetry.sdk.metrics.export import (InMemoryMetricReader, MetricReader, HistogramDataPoint, - NumberDataPoint) - +from opentelemetry.sdk.metrics.export import ( + HistogramDataPoint, + InMemoryMetricReader, + MetricReader, + NumberDataPoint, +) from opentelemetry.sdk.trace import TracerProvider, export from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( InMemorySpanExporter, @@ -106,7 +109,7 @@ def get_sorted_metrics(self): return self.sorted_metrics(all_metrics) def assert_metric_expected( - self, metric, expected_value, expected_attributes + self, metric, expected_value, expected_attributes ): data_point = next(iter(metric.data.data_points)) @@ -127,7 +130,7 @@ def assert_metric_expected( ) def assert_duration_metric_expected( - self, metric, duration_estimated, expected_attributes, est_delta=200 + self, metric, duration_estimated, expected_attributes, est_delta=200 ): data_point = next(iter(metric.data.data_points)) From 5fe94f211705413c68d74369be2f9c77f52802ca Mon Sep 17 00:00:00 2001 From: sroda Date: Wed, 14 Dec 2022 19:43:37 +0200 Subject: [PATCH 3/6] Fix lint --- .../src/opentelemetry/test/test_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py index bd472745f46..545a2354c7a 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py @@ -90,7 +90,7 @@ def sorted_spans(self, spans): # pylint: disable=R0201 reverse=True, ) - def sorted_metrics(self, metrics): + def sorted_metrics(self, metrics): # pylint: disable=R0201 """ Sorts metrics by metric name. """ From beff3736ecc65da24f1a868d11e0f6a84965293e Mon Sep 17 00:00:00 2001 From: sroda Date: Sun, 18 Dec 2022 11:56:27 +0200 Subject: [PATCH 4/6] Fix after CR --- .../src/opentelemetry/test/test_base.py | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py index 545a2354c7a..17e9af1989c 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py @@ -103,10 +103,31 @@ def get_sorted_metrics(self): resource_metrics = ( self.memory_metrics_reader.get_metrics_data().resource_metrics ) + + all_metrics = [] for metrics in resource_metrics: for scope_metrics in metrics.scope_metrics: - all_metrics = list(scope_metrics.metrics) - return self.sorted_metrics(all_metrics) + all_metrics.extend(scope_metrics.metrics) + + return self.sorted_metrics(all_metrics) + + def assert_histogram_expected(self, data_point, expected_value): + self.assertEqual( + data_point.count, + 1, + ) + self.assertEqual( + data_point.sum, + expected_value, + ) + self.assertEqual( + data_point.max, + expected_value, + ) + self.assertEqual( + data_point.min, + expected_value, + ) def assert_metric_expected( self, metric, expected_value, expected_attributes @@ -114,10 +135,7 @@ def assert_metric_expected( data_point = next(iter(metric.data.data_points)) if isinstance(data_point, HistogramDataPoint): - self.assertEqual( - data_point.sum, - expected_value, - ) + self.assert_histogram_expected(data_point, expected_value) elif isinstance(data_point, NumberDataPoint): self.assertEqual( data_point.value, From be93e33e177473b10cee593f1d1232d2a1ab0acd Mon Sep 17 00:00:00 2001 From: sroda Date: Sun, 18 Dec 2022 13:09:53 +0200 Subject: [PATCH 5/6] Remove changelog entry --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2e1acfcdff..e0f43a10da0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -- Add metrics basic tests to BaseTest class - ([#3092](https://github.com/open-telemetry/opentelemetry-python/pull/3092)) - ## Version 1.15.0/0.36b0 (2022-12-09) - Regenerate opentelemetry-proto to be compatible with protobuf 3 and 4 From eb27734aa23684d674b104a215810ec870d80fb0 Mon Sep 17 00:00:00 2001 From: sroda Date: Tue, 20 Dec 2022 14:24:48 +0200 Subject: [PATCH 6/6] Fix after CR --- .../src/opentelemetry/test/test_base.py | 59 +++++++------------ 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py index 17e9af1989c..8593d0f38c1 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py @@ -15,11 +15,12 @@ import logging import unittest from contextlib import contextmanager -from typing import Tuple +from typing import Optional, Tuple, Union from opentelemetry import metrics as metrics_api from opentelemetry import trace as trace_api from opentelemetry.sdk.metrics import MeterProvider +from opentelemetry.sdk.metrics._internal.point import Metric from opentelemetry.sdk.metrics.export import ( HistogramDataPoint, InMemoryMetricReader, @@ -111,31 +112,31 @@ def get_sorted_metrics(self): return self.sorted_metrics(all_metrics) - def assert_histogram_expected(self, data_point, expected_value): - self.assertEqual( - data_point.count, - 1, - ) - self.assertEqual( - data_point.sum, - expected_value, - ) - self.assertEqual( - data_point.max, - expected_value, - ) - self.assertEqual( - data_point.min, - expected_value, - ) - def assert_metric_expected( - self, metric, expected_value, expected_attributes + self, + metric: Metric, + expected_value: Union[int, float], + expected_attributes: dict, + est_delta: Optional[float] = None, ): data_point = next(iter(metric.data.data_points)) if isinstance(data_point, HistogramDataPoint): - self.assert_histogram_expected(data_point, expected_value) + self.assertEqual( + data_point.count, + 1, + ) + if est_delta is None: + self.assertEqual( + data_point.sum, + expected_value, + ) + else: + self.assertAlmostEqual( + data_point.sum, + expected_value, + delta=est_delta, + ) elif isinstance(data_point, NumberDataPoint): self.assertEqual( data_point.value, @@ -147,22 +148,6 @@ def assert_metric_expected( dict(data_point.attributes), ) - def assert_duration_metric_expected( - self, metric, duration_estimated, expected_attributes, est_delta=200 - ): - data_point = next(iter(metric.data.data_points)) - - self.assertAlmostEqual( - data_point.sum, - duration_estimated, - delta=est_delta, - ) - - self.assertDictEqual( - expected_attributes, - dict(data_point.attributes), - ) - @staticmethod def create_tracer_provider(**kwargs): """Helper to create a configured tracer provider.