Skip to content

Commit

Permalink
[HWKMETRICS-172] Add checks for empty or missing payloads for various…
Browse files Browse the repository at this point in the history
… types to allow users to omit them from the request. Also, added tests for various scenarios.
  • Loading branch information
Stefan Negrea committed Jul 8, 2015
1 parent 07afb30 commit 7e7d7a6
Show file tree
Hide file tree
Showing 3 changed files with 228 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import static org.hawkular.metrics.api.jaxrs.util.ApiUtils.requestToCounters;
import static org.hawkular.metrics.api.jaxrs.util.ApiUtils.requestToGauges;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.inject.Inject;
Expand All @@ -43,11 +45,15 @@
import com.wordnik.swagger.annotations.ApiResponse;
import com.wordnik.swagger.annotations.ApiResponses;
import org.hawkular.metrics.api.jaxrs.ApiError;
import org.hawkular.metrics.api.jaxrs.model.Availability;
import org.hawkular.metrics.api.jaxrs.model.Counter;
import org.hawkular.metrics.api.jaxrs.model.Gauge;
import org.hawkular.metrics.api.jaxrs.request.MetricDefinition;
import org.hawkular.metrics.api.jaxrs.request.MixedMetricsRequest;
import org.hawkular.metrics.api.jaxrs.util.ApiUtils;
import org.hawkular.metrics.core.api.MetricType;
import org.hawkular.metrics.core.api.MetricsService;

import rx.Observable;
import rx.schedulers.Schedulers;

Expand Down Expand Up @@ -101,20 +107,34 @@ public void findMetrics(
@ApiOperation(value = "Add data for multiple metrics in a single call.")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Adding data succeeded."),
@ApiResponse(code = 400, message = "Missing or invalid payload.", response = ApiError.class),
@ApiResponse(code = 500, message = "Unexpected error happened while storing the data",
response = ApiError.class) })
public void addMetricsData(
@Suspended final AsyncResponse asyncResponse,
@ApiParam(value = "List of metrics", required = true) MixedMetricsRequest metricsRequest) {

Observable<Void> gaugeInserts = metricsService.addGaugeData(requestToGauges(tenantId,
metricsRequest.getGaugeMetrics()).subscribeOn(Schedulers.computation()));
Observable<Void> counterInserts = metricsService.addCounterData(requestToCounters(tenantId,
metricsRequest.getCounters()).subscribeOn(Schedulers.computation()));
Observable<Void> availabilityInserts = metricsService.addAvailabilityData(requestToAvailabilities(tenantId,
metricsRequest.getAvailabilityMetrics()).subscribeOn(Schedulers.computation()));
Collection<Observable<Void>> observables = new ArrayList<>();

List<Gauge> gauges = metricsRequest.getGaugeMetrics();
if (gauges != null && !gauges.isEmpty()) {
observables.add(metricsService
.addGaugeData(requestToGauges(tenantId, gauges).subscribeOn(Schedulers.computation())));
}

List<Counter> counters = metricsRequest.getCounters();
if (counters != null && !counters.isEmpty()) {
observables.add(metricsService
.addCounterData(requestToCounters(tenantId, counters).subscribeOn(Schedulers.computation())));
}

List<Availability> availabilities = metricsRequest.getAvailabilityMetrics();
if (availabilities != null && !availabilities.isEmpty()) {
observables.add(metricsService.addAvailabilityData(
requestToAvailabilities(tenantId, availabilities).subscribeOn(Schedulers.computation())));
}

Observable.merge(gaugeInserts, counterInserts, availabilityInserts).subscribe(
Observable.merge(observables).subscribe(
aVoid -> {},
t -> asyncResponse.resume(ApiUtils.serverError(t)),
() -> asyncResponse.resume(Response.ok().build())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,27 @@ public class MixedMetricsRequest {


public List<Gauge> getGaugeMetrics() {
return ImmutableList.copyOf(gaugeMetrics);
if(gaugeMetrics != null){
return ImmutableList.copyOf(gaugeMetrics);
}

return null;
}

public List<Availability> getAvailabilityMetrics() {
return ImmutableList.copyOf(availabilityMetrics);
if (availabilityMetrics != null) {
return ImmutableList.copyOf(availabilityMetrics);
}

return null;
}

public List<Counter> getCounters() {
return ImmutableList.copyOf(counters);
if (counters != null) {
return ImmutableList.copyOf(counters);
}

return null;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,189 @@ class MetricsITest extends RESTTest {
)
}

}
@Test
void addMixedDataMissingGauges() {
String tenantId = nextTenantId()
DateTime start = DateTime.now().minusMinutes(10)

def response = hawkularMetrics.post(
path: "metrics/data",
headers: [(tenantHeaderName): tenantId],
body: [
counters: [
[
id: 'GC1',
data: [
[timestamp: start.millis, value: 10],
[timestamp: start.plusMinutes(1).millis, value: 20]
]
]
],
availabilities: [
[
id: 'GA1',
data: [
[timestamp: start.millis, value: "down"],
[timestamp: start.plusMinutes(1).millis, value: "up"]
]
]
]
]
)
assertEquals(200, response.status)

response = hawkularMetrics.get(path: 'counters/GC1/data', headers: [(tenantHeaderName): tenantId])
assertEquals(200, response.status)
assertEquals(
[
[timestamp: start.plusMinutes(1).millis, value: 20],
[timestamp: start.millis, value: 10]
],
response.data
)

response = hawkularMetrics.get(path: 'availability/GA1/data', headers: [(tenantHeaderName): tenantId])
assertEquals(200, response.status)
assertEquals(
[
[timestamp: start.millis, value: "down"],
[timestamp: start.plusMinutes(1).millis, value: "up"]
],
response.data
)
}

@Test
void addMixedDataMissingCounters() {
String tenantId = nextTenantId()
DateTime start = DateTime.now().minusMinutes(10)

def response = hawkularMetrics.post(
path: "metrics/data",
headers: [(tenantHeaderName): tenantId],
body: [
gauges: [
[
id: 'CG1',
data: [
[timestamp: start.millis, value: 10.032],
[timestamp: start.plusMinutes(1).millis, value: 9.589]
],
]
],
availabilities: [
[
id: 'CA1',
data: [
[timestamp: start.millis, value: "down"],
[timestamp: start.plusMinutes(1).millis, value: "up"]
]
]
]
]
)
assertEquals(200, response.status)


response = hawkularMetrics.get(path: 'gauges/CG1/data', headers: [(tenantHeaderName): tenantId])
assertEquals(200, response.status)
assertEquals(
[
[timestamp: start.plusMinutes(1).millis, value: 9.589],
[timestamp: start.millis, value: 10.032]
],
response.data
)

response = hawkularMetrics.get(path: 'availability/CA1/data', headers: [(tenantHeaderName): tenantId])
assertEquals(200, response.status)
assertEquals(
[
[timestamp: start.millis, value: "down"],
[timestamp: start.plusMinutes(1).millis, value: "up"]
],
response.data
)
}

@Test
void addMixedDataMissingAvailabilities() {
String tenantId = nextTenantId()
DateTime start = DateTime.now().minusMinutes(10)

def response = hawkularMetrics.post(
path: "metrics/data",
headers: [(tenantHeaderName): tenantId],
body: [
gauges: [
[
id: 'AG1',
data: [
[timestamp: start.millis, value: 10.032],
[timestamp: start.plusMinutes(1).millis, value: 9.589]
],
]
],
counters: [
[
id: 'AC1',
data: [
[timestamp: start.millis, value: 10],
[timestamp: start.plusMinutes(1).millis, value: 20]
]
]
]
]
)
assertEquals(200, response.status)

response = hawkularMetrics.get(path: 'gauges/AG1/data', headers: [(tenantHeaderName): tenantId])
assertEquals(200, response.status)
assertEquals(
[
[timestamp: start.plusMinutes(1).millis, value: 9.589],
[timestamp: start.millis, value: 10.032]
],
response.data
)

response = hawkularMetrics.get(path: 'counters/AC1/data', headers: [(tenantHeaderName): tenantId])
assertEquals(200, response.status)
assertEquals(
[
[timestamp: start.plusMinutes(1).millis, value: 20],
[timestamp: start.millis, value: 10]
],
response.data
)
}

@Test
void addMixedDataEmptyRequestPayload() {
String tenantId = nextTenantId()

badPost( path: "metrics/data",
body: [],
headers: [(tenantHeaderName): tenantId]) { exception ->
// Missing type
assertEquals(400, exception.response.status)
}
}

@Test
void addMixedDataMissingData() {
String tenantId = nextTenantId()

def response = hawkularMetrics.post(
path: "metrics/data",
headers: [(tenantHeaderName): tenantId],
body: [
gauges: [
],
counters: [
]
]
)
assertEquals(200, response.status)
}
}

0 comments on commit 7e7d7a6

Please sign in to comment.