From c4a6ee8a5974933377a7d0b10e79c6e973243795 Mon Sep 17 00:00:00 2001 From: Artem Vasilyev Date: Tue, 21 Jun 2022 13:16:13 +0300 Subject: [PATCH 1/3] Added rateofchangesec operator to calculate change of value per second --- gnocchi/rest/aggregates/operations.py | 14 +++++++++++++- gnocchi/tests/test_aggregates.py | 27 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/gnocchi/rest/aggregates/operations.py b/gnocchi/rest/aggregates/operations.py index 5a54a720f..86b1cce21 100644 --- a/gnocchi/rest/aggregates/operations.py +++ b/gnocchi/rest/aggregates/operations.py @@ -119,8 +119,20 @@ def _inner_rated_agg(values, axis): } +def rateofchangesec(t, v): + """Calculate change of value per second.""" + values = numpy.divide( + numpy.diff(v.T, prepend=numpy.NaN), + numpy.divide( + numpy.diff(t, prepend=numpy.datetime64("NaT")), + numpy.timedelta64(1, 's')) + ).T + return t, values + + unary_operators_with_timestamps = { - u"rateofchange": lambda t, v: (t[1:], numpy.diff(v.T).T) + u"rateofchange": lambda t, v: (t[1:], numpy.diff(v.T).T), + u"rateofchangesec": rateofchangesec, } diff --git a/gnocchi/tests/test_aggregates.py b/gnocchi/tests/test_aggregates.py index ee649addb..c4c8e7908 100644 --- a/gnocchi/tests/test_aggregates.py +++ b/gnocchi/tests/test_aggregates.py @@ -1642,3 +1642,30 @@ def test_unary_operator(self): numpy.timedelta64(1, 'h'), 4), ]} }, values) + + def test_rateofchangesec_operator(self): + self.incoming.add_measures(self.metric.id, [ + incoming.Measure(datetime64(2014, 1, 1, 12, 0, 1), 0), + incoming.Measure(datetime64(2014, 1, 1, 12, 5, 10), 450), + incoming.Measure(datetime64(2014, 1, 1, 12, 10, 5), 900), + incoming.Measure(datetime64(2014, 1, 1, 12, 15, 30), 1350), + ]) + self.trigger_processing([self.metric]) + + values = processor.get_measures( + self.storage, + [processor.MetricReference(self.metric, "mean")], + ["rateofchangesec", ["metric", str(self.metric.id), "mean"]], + granularities=[numpy.timedelta64(5, 'm')], + )["aggregated"] + + self.assertEqual([ + (datetime64(2014, 1, 1, 12, 0, 0), + numpy.timedelta64(5, 'm'), eq_nan), + (datetime64(2014, 1, 1, 12, 5, 0), + numpy.timedelta64(5, 'm'), 1.5), + (datetime64(2014, 1, 1, 12, 10, 0), + numpy.timedelta64(5, 'm'), 1.5), + (datetime64(2014, 1, 1, 12, 15, 0), + numpy.timedelta64(5, 'm'), 1.5), + ], values) From 37ac184a8c425ab918b5d8188d249ed4b9b0f935 Mon Sep 17 00:00:00 2001 From: Artem Vasilyev Date: Tue, 21 Jun 2022 13:39:04 +0300 Subject: [PATCH 2/3] fix test returning metric name --- gnocchi/tests/test_aggregates.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/gnocchi/tests/test_aggregates.py b/gnocchi/tests/test_aggregates.py index c4c8e7908..9486a7beb 100644 --- a/gnocchi/tests/test_aggregates.py +++ b/gnocchi/tests/test_aggregates.py @@ -1657,15 +1657,17 @@ def test_rateofchangesec_operator(self): [processor.MetricReference(self.metric, "mean")], ["rateofchangesec", ["metric", str(self.metric.id), "mean"]], granularities=[numpy.timedelta64(5, 'm')], - )["aggregated"] + ) - self.assertEqual([ - (datetime64(2014, 1, 1, 12, 0, 0), - numpy.timedelta64(5, 'm'), eq_nan), - (datetime64(2014, 1, 1, 12, 5, 0), - numpy.timedelta64(5, 'm'), 1.5), - (datetime64(2014, 1, 1, 12, 10, 0), - numpy.timedelta64(5, 'm'), 1.5), - (datetime64(2014, 1, 1, 12, 15, 0), - numpy.timedelta64(5, 'm'), 1.5), - ], values) + self.assertEqual({ + str(self.metric.id): { + "mean": [(datetime64(2014, 1, 1, 12, 0, 0), + numpy.timedelta64(5, 'm'), eq_nan), + (datetime64(2014, 1, 1, 12, 5, 0), + numpy.timedelta64(5, 'm'), 1.5), + (datetime64(2014, 1, 1, 12, 10, 0), + numpy.timedelta64(5, 'm'), 1.5), + (datetime64(2014, 1, 1, 12, 15, 0), + numpy.timedelta64(5, 'm'), 1.5), + ]} + }, values) From 91d8ff94fbf3c30b0cedd34fb2951f42cf2cb7df Mon Sep 17 00:00:00 2001 From: Artem Vasilyev Date: Mon, 27 Jun 2022 11:09:34 +0300 Subject: [PATCH 3/3] added release notes --- .../notes/add-rateofchangesec-operator-a24327764a6cb18d.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 releasenotes/notes/add-rateofchangesec-operator-a24327764a6cb18d.yaml diff --git a/releasenotes/notes/add-rateofchangesec-operator-a24327764a6cb18d.yaml b/releasenotes/notes/add-rateofchangesec-operator-a24327764a6cb18d.yaml new file mode 100644 index 000000000..b8d01d8ad --- /dev/null +++ b/releasenotes/notes/add-rateofchangesec-operator-a24327764a6cb18d.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Added ``rateofchangesec`` operator to calculate changes between metric measures per second. + Example: ``(* (/ (rateofchangesec (metric cpu mean)) 1000000000) 100))``