Skip to content

Commit

Permalink
[HWKMETRICS-228] return Double.NaN when there are no values for a bucket
Browse files Browse the repository at this point in the history
  • Loading branch information
John Sanda committed Aug 23, 2015
1 parent f894164 commit 7f5f048
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ Observable<Map<MetricId, Set<DataPoint<AvailabilityType>>>> findAvailabilityByTa
*
* @return An Observable of {@link DataPoint data points} which are emitted in ascending order. In other words,
* the most recent data is emitted first. If there are no data points for a particular bucket (i.e., minute), then
* null is emitted.
* the data point will have Double.NaN as its value.
*/
Observable<DataPoint<Double>> findRateData(MetricId id, long start, long end);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -657,7 +657,8 @@ public Observable<DataPoint<Double>> findRateData(MetricId id, long start, long
Observable<DataPoint<Long>> rawDataPoints = findCounterData(id, startTime.getMillis(), endTime.getMillis());

return getCounterBuckets(rawDataPoints, startTime.getMillis(), endTime.getMillis())
.map(bucket -> bucket.isEmpty() ? null : new DataPoint<>(bucket.startTime, bucket.getDelta()));
// .map(bucket -> bucket.isEmpty() ? null : new DataPoint<>(bucket.startTime, bucket.getDelta()));
.map(bucket -> new DataPoint<>(bucket.startTime, bucket.getDelta()));
}

private Observable<CounterBucket> getCounterBuckets(Observable<DataPoint<Long>> dataPoints, long startTime,
Expand Down Expand Up @@ -715,6 +716,9 @@ public boolean isEmpty() {
}

public Double getDelta() {
if (isEmpty()) {
return Double.NaN;
}
if (first == last) {
return ((double) first.getValue() / (endTime - startTime)) * 60000;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/
package org.hawkular.metrics.core.impl;

import static java.lang.Double.NaN;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonList;
Expand Down Expand Up @@ -549,7 +550,7 @@ public void findRates() {
List<DataPoint<Double>> actual = getOnNextEvents(() -> metricsService.findRateData(counter.getId(),
start.getMillis(), start.plusMinutes(6).getMillis()));
List<DataPoint<Double>> expected = asList(
null,
new DataPoint<>(start.getMillis(), NaN),
new DataPoint<>(start.plusMinutes(1).getMillis(), calculateRate(17 - 10, start.plusMinutes(1),
start.plusMinutes(2))),
new DataPoint<>(start.plusMinutes(2).getMillis(), calculateRate(49 - 29, start.plusMinutes(2),
Expand All @@ -558,7 +559,7 @@ public void findRates() {
start.plusMinutes(4))),
new DataPoint<>(start.plusMinutes(4).getMillis(), calculateRate(84, start.plusMinutes(4),
start.plusMinutes(5))),
null
new DataPoint<>(start.plusMinutes(5).getMillis(), NaN)
);

assertEquals(actual, expected, "The rates do not match");
Expand All @@ -580,7 +581,11 @@ public void findRatesWhenNoDataIsFound() {
List<DataPoint<Double>> actual = getOnNextEvents(() -> metricsService.findRateData(counter.getId(),
start.plusMinutes(3).getMillis(), start.plusMinutes(5).getMillis()));

assertEquals(actual, asList(null, null), "The rates do not match");
List<DataPoint<Double>> expected = asList(
new DataPoint<>(start.plusMinutes(3).getMillis(), NaN),
new DataPoint<>(start.plusMinutes(4).getMillis(), NaN)
);
assertEquals(actual, expected, "The rates do not match");
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@
*/
package org.hawkular.metrics.rest

import static org.joda.time.DateTime.now
import static org.joda.time.Duration.standardMinutes
import static org.junit.Assert.assertEquals

import groovy.json.JsonOutput
import org.hawkular.metrics.core.impl.DateTimeService
import org.joda.time.DateTime
import org.junit.Test

import static java.lang.Double.NaN
import static org.joda.time.DateTime.now
import static org.joda.time.Duration.standardMinutes
import static org.junit.Assert.assertEquals
/**
* @author John Sanda
*/
Expand Down Expand Up @@ -326,10 +327,10 @@ class CountersITest extends RESTTest {
body: [
[timestamp: start.plusMinutes(1).millis, value: 100],
[timestamp: start.plusMinutes(1).plusSeconds(31).millis, value : 200],
[timestamp: start.plusMinutes(2).plusMillis(10).millis, value : 345],
[timestamp: start.plusMinutes(2).plusSeconds(30).millis, value : 515],
[timestamp: start.plusMinutes(3).millis, value : 595],
[timestamp: start.plusMinutes(3).plusSeconds(30).millis, value : 747]
[timestamp: start.plusMinutes(3).plusMillis(10).millis, value : 345],
[timestamp: start.plusMinutes(3).plusSeconds(30).millis, value : 515],
[timestamp: start.plusMinutes(4).millis, value : 595],
[timestamp: start.plusMinutes(4).plusSeconds(30).millis, value : 747]
]
)
assertEquals(200, response.status)
Expand All @@ -340,7 +341,7 @@ class CountersITest extends RESTTest {
response = hawkularMetrics.get(
path: "counters/$counter/rate",
headers: [(tenantHeaderName): tenantId],
query: [start: start.plusMinutes(1).millis, end: start.plusMinutes(4).millis]
query: [start: start.plusMinutes(1).millis, end: start.plusMinutes(6).millis]
)
assertEquals(200, response.status)

Expand All @@ -351,15 +352,25 @@ class CountersITest extends RESTTest {
],
[
timestamp: start.plusMinutes(2).millis,
value: calculateRate(515 - 345, start.plusMinutes(2), start.plusMinutes(3))
value: NaN
],
[
timestamp: start.plusMinutes(3).millis,
value: calculateRate(747 - 595, start.plusMinutes(3), start.plusMinutes(4))
value: calculateRate(515 - 345, start.plusMinutes(3), start.plusMinutes(4))
],
[
timestamp: start.plusMinutes(4).millis,
value: calculateRate(747 - 595, start.plusMinutes(4), start.plusMinutes(5))
],
[
timestamp: start.plusMinutes(5).millis,
value: NaN
]
]

assertEquals("Expected to get back three data points", 3, response.data.size())
println "RESPONSE = ${JsonOutput.toJson(response.data)}"

assertEquals("Expected to get back three data points", 5, response.data.size())
assertRateEquals(expectedData[0], response.data[0])
assertRateEquals(expectedData[1], response.data[1])
assertRateEquals(expectedData[2], response.data[2])
Expand Down

0 comments on commit 7f5f048

Please sign in to comment.