diff --git a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java index 0a3531ca..db33300b 100644 --- a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java +++ b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java @@ -363,7 +363,8 @@ static Map updateValuesAsRate(Map metricValues, bool if (diff < 0) { it.remove(); //Discard calculating rate when the metric counter has been reset. } else { - Double rate = isDiff ? diff : (diff / TimeUnit.MILLISECONDS.toSeconds(step)); + double seconds = step / 1000.0; + Double rate = isDiff ? diff : (diff / seconds); timeValueEntry.setValue(rate); } } else { diff --git a/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsServiceTest.java b/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsServiceTest.java index 514bf86b..f7e58aa9 100644 --- a/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsServiceTest.java +++ b/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsServiceTest.java @@ -133,4 +133,19 @@ public void testDiffCalculation() throws Exception { Assert.assertTrue(rates.containsValue(3.0)); Assert.assertTrue(rates.containsValue(5.0)); } + + @Test + public void testRateCalculationShouldNotReturnInfinite() { + Map metricValues = new TreeMap<>(); + metricValues.put(1686721209272L, 5538.0); + metricValues.put(1686721219241L, 1750.0); + metricValues.put(1686721219272L, 5538.0); + + // Calculate rate + Map rates = HBaseTimelineMetricsService.updateValuesAsRate(new TreeMap<>(metricValues), false); + for (Map.Entry entry : + rates.entrySet()) { + Assert.assertNotSame("rate transformation should not return Infinity", "Infinity", Double.toString(entry.getValue())); + } + } }