diff --git a/blueflood-core/src/main/java/com/rackspacecloud/blueflood/inputs/formats/AggregatedPayload.java b/blueflood-core/src/main/java/com/rackspacecloud/blueflood/inputs/formats/AggregatedPayload.java index e3297cc0b..b663000b7 100644 --- a/blueflood-core/src/main/java/com/rackspacecloud/blueflood/inputs/formats/AggregatedPayload.java +++ b/blueflood-core/src/main/java/com/rackspacecloud/blueflood/inputs/formats/AggregatedPayload.java @@ -113,6 +113,10 @@ private static void validate(AggregatedPayload payload) { metricName = ((BluefloodSet) leafBean).getName(); } + if ((metricName.isEmpty()) && (payload.getAllMetricNames().size() > 0)) { + metricName = payload.getAllMetricNames().get(0); + } + payload.validationErrors.add(new ErrorResponse.ErrorData(payload.getTenantId(), metricName, source, constraintViolation.getMessage())); } @@ -158,7 +162,7 @@ public List getValidationErrors() { /** * This method is invoked by the validator automatically */ - @AssertTrue(message="Atleast one of the aggregated metrics(gauges, counters, timers, sets) are expected") + @AssertTrue(message="At least one of the aggregated metrics(gauges, counters, timers, sets) are expected") private boolean isValid() { boolean isGaugePresent = gauges != null && gauges.length > 0; boolean isCounterPresent = counters != null && counters.length > 0; diff --git a/blueflood-http/src/integration-test/java/com/rackspacecloud/blueflood/inputs/handlers/HttpHandlerIntegrationTest.java b/blueflood-http/src/integration-test/java/com/rackspacecloud/blueflood/inputs/handlers/HttpHandlerIntegrationTest.java index d68ae82b6..47379d0e7 100644 --- a/blueflood-http/src/integration-test/java/com/rackspacecloud/blueflood/inputs/handlers/HttpHandlerIntegrationTest.java +++ b/blueflood-http/src/integration-test/java/com/rackspacecloud/blueflood/inputs/handlers/HttpHandlerIntegrationTest.java @@ -37,18 +37,18 @@ import java.io.*; import java.net.URISyntaxException; import java.util.*; -import java.util.regex.Pattern; import java.util.zip.GZIPOutputStream; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static org.mockito.Mockito.*; -import static org.junit.Assert.*; import static com.rackspacecloud.blueflood.TestUtils.*; public class HttpHandlerIntegrationTest extends HttpIntegrationTestBase { static private final String TENANT_ID = "acTEST"; + static private long BEFORE_CURRENT_COLLECTIONTIME_MS = Configuration.getInstance().getLongProperty( CoreConfig.BEFORE_CURRENT_COLLECTIONTIME_MS ); + static private long AFTER_CURRENT_COLLECTIONTIME_MS = Configuration.getInstance().getLongProperty( CoreConfig.AFTER_CURRENT_COLLECTIONTIME_MS ); //A time stamp 2 days ago private final long baseMillis = Calendar.getInstance().getTimeInMillis() - 172800000; @@ -85,7 +85,7 @@ public void testHttpIngestionInvalidPastCollectionTime() throws Exception { String postfix = getPostfix(); - long time = System.currentTimeMillis() - TIME_DIFF_MS - Configuration.getInstance().getLongProperty( CoreConfig.BEFORE_CURRENT_COLLECTIONTIME_MS ); + long time = System.currentTimeMillis() - TIME_DIFF_MS - BEFORE_CURRENT_COLLECTIONTIME_MS; HttpResponse response = postGenMetric(TENANT_ID, postfix, postPath, time ); @@ -95,8 +95,8 @@ public void testHttpIngestionInvalidPastCollectionTime() throws Exception { assertEquals("Number of errors invalid", 3, errorResponse.getErrors().size()); for (int i = 0; i < 3; i++) { assertEquals("Invalid error source", "collectionTime", errorResponse.getErrors().get(i).getSource()); - assertEquals("Invalid error message", "Out of bounds. Cannot be more than 259200000 milliseconds into the past." + - " Cannot be more than 600000 milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); + assertEquals("Invalid error message", "Out of bounds. Cannot be more than " + BEFORE_CURRENT_COLLECTIONTIME_MS + " milliseconds into the past." + + " Cannot be more than " + AFTER_CURRENT_COLLECTIONTIME_MS + " milliseconds into the future", errorResponse.getErrors().get(i).getMessage()); } } @@ -106,7 +106,7 @@ public void testHttpIngestionInvalidFutureCollectionTime() throws Exception { String postfix = getPostfix(); - long time = System.currentTimeMillis() + TIME_DIFF_MS + Configuration.getInstance().getLongProperty( CoreConfig.AFTER_CURRENT_COLLECTIONTIME_MS ); + long time = System.currentTimeMillis() + TIME_DIFF_MS + AFTER_CURRENT_COLLECTIONTIME_MS; HttpResponse response = postGenMetric(TENANT_ID, postfix, postPath, time ); @@ -116,8 +116,8 @@ public void testHttpIngestionInvalidFutureCollectionTime() throws Exception { assertEquals("Number of errors invalid", 3, errorResponse.getErrors().size()); for (int i = 0; i < 3; i++) { assertEquals("Invalid error source", "collectionTime", errorResponse.getErrors().get(i).getSource()); - assertEquals("Invalid error message", "Out of bounds. Cannot be more than 259200000 milliseconds into the past." + - " Cannot be more than 600000 milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); + assertEquals("Invalid error message", "Out of bounds. Cannot be more than " + BEFORE_CURRENT_COLLECTIONTIME_MS + " milliseconds into the past." + + " Cannot be more than " + AFTER_CURRENT_COLLECTIONTIME_MS + " milliseconds into the future", errorResponse.getErrors().get(i).getMessage()); } } @@ -125,8 +125,8 @@ public void testHttpIngestionInvalidFutureCollectionTime() throws Exception { public void testHttpIngestionPartialInvalidCollectionTime() throws Exception { String postfix = getPostfix(); long validTime = System.currentTimeMillis(); - long pastTime = System.currentTimeMillis() - TIME_DIFF_MS - Configuration.getInstance().getLongProperty( CoreConfig.BEFORE_CURRENT_COLLECTIONTIME_MS ); - long futureTime = System.currentTimeMillis() + TIME_DIFF_MS + Configuration.getInstance().getLongProperty( CoreConfig.AFTER_CURRENT_COLLECTIONTIME_MS ); + long pastTime = System.currentTimeMillis() - TIME_DIFF_MS - BEFORE_CURRENT_COLLECTIONTIME_MS; + long futureTime = System.currentTimeMillis() + TIME_DIFF_MS + AFTER_CURRENT_COLLECTIONTIME_MS; String jsonBody = getJsonFromFile("sample_multi_payload_with_different_time.json", postfix); jsonBody = updateTimeStampJson(jsonBody, "\"%TIMESTAMP_1%\"", validTime); @@ -139,7 +139,11 @@ public void testHttpIngestionPartialInvalidCollectionTime() throws Exception { try { assertEquals("Should get status 207 from " + String.format(postMultiPath, TENANT_ID), 207, response.getStatusLine().getStatusCode() ); - assertTrue("", errorResponse.getErrors().size() > 0); + for (int i = 0; i < 4; i++) { + assertEquals("Invalid error source", "collectionTime", errorResponse.getErrors().get(i).getSource()); + assertEquals("Invalid error message", "Out of bounds. Cannot be more than " + BEFORE_CURRENT_COLLECTIONTIME_MS + " milliseconds into the past." + + " Cannot be more than " + AFTER_CURRENT_COLLECTIONTIME_MS + " milliseconds into the future", errorResponse.getErrors().get(i).getMessage()); + } } finally { EntityUtils.consume( response.getEntity() ); // Releases connection apparently @@ -149,8 +153,7 @@ public void testHttpIngestionPartialInvalidCollectionTime() throws Exception { @Test public void testHttpAggregatedIngestionInvalidPastCollectionTime() throws IOException, URISyntaxException { - long timestamp = System.currentTimeMillis() - TIME_DIFF_MS - - Configuration.getInstance().getLongProperty( CoreConfig.BEFORE_CURRENT_COLLECTIONTIME_MS ); + long timestamp = System.currentTimeMillis() - TIME_DIFF_MS - BEFORE_CURRENT_COLLECTIONTIME_MS; HttpResponse response = postMetric("333333", postAggregatedPath, "sample_payload.json", timestamp, getPostfix()); ErrorResponse errorResponse = getErrorResponse(response); @@ -158,15 +161,14 @@ public void testHttpAggregatedIngestionInvalidPastCollectionTime() throws IOExce assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals("Number of errors invalid", 1, errorResponse.getErrors().size()); assertEquals("Invalid error source", "timestamp", errorResponse.getErrors().get(0).getSource()); - assertEquals("Invalid error message", "Out of bounds. Cannot be more than 259200000 milliseconds into the past." + - " Cannot be more than 600000 milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); + assertEquals("Invalid error message", "Out of bounds. Cannot be more than " + BEFORE_CURRENT_COLLECTIONTIME_MS + " milliseconds into the past." + + " Cannot be more than " + AFTER_CURRENT_COLLECTIONTIME_MS + " milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); } @Test public void testHttpAggregatedIngestionInvalidFutureCollectionTime() throws IOException, URISyntaxException { - long timestamp = System.currentTimeMillis() + TIME_DIFF_MS - + Configuration.getInstance().getLongProperty( CoreConfig.AFTER_CURRENT_COLLECTIONTIME_MS ); + long timestamp = System.currentTimeMillis() + TIME_DIFF_MS + AFTER_CURRENT_COLLECTIONTIME_MS; HttpResponse response = postMetric("333333", postAggregatedPath, "sample_payload.json", timestamp, getPostfix()); ErrorResponse errorResponse = getErrorResponse(response); @@ -174,8 +176,8 @@ public void testHttpAggregatedIngestionInvalidFutureCollectionTime() throws IOEx assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals("Number of errors invalid", 1, errorResponse.getErrors().size()); assertEquals("Invalid error source", "timestamp", errorResponse.getErrors().get(0).getSource()); - assertEquals("Invalid error message", "Out of bounds. Cannot be more than 259200000 milliseconds into the past." + - " Cannot be more than 600000 milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); + assertEquals("Invalid error message", "Out of bounds. Cannot be more than " + BEFORE_CURRENT_COLLECTIONTIME_MS + " milliseconds into the past." + + " Cannot be more than " + AFTER_CURRENT_COLLECTIONTIME_MS + " milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); } @Test @@ -207,8 +209,7 @@ locator, RollupType.COUNTER, new Range( start, end ), @Test public void testHttpAggregatedMultiIngestionInvalidPastCollectionTime() throws IOException, URISyntaxException { - long timestamp = System.currentTimeMillis() - TIME_DIFF_MS - - Configuration.getInstance().getLongProperty( CoreConfig.BEFORE_CURRENT_COLLECTIONTIME_MS ); + long timestamp = System.currentTimeMillis() - TIME_DIFF_MS - BEFORE_CURRENT_COLLECTIONTIME_MS; String postfix = getPostfix(); @@ -222,16 +223,15 @@ public void testHttpAggregatedMultiIngestionInvalidPastCollectionTime() throws I assertEquals("Number of errors invalid", 3, errorResponse.getErrors().size()); assertEquals("Invalid error source", "timestamp", errorResponse.getErrors().get(0).getSource()); - assertEquals("Invalid error message", "Out of bounds. Cannot be more than 259200000 milliseconds into the past." + - " Cannot be more than 600000 milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); + assertEquals("Invalid error message", "Out of bounds. Cannot be more than " + BEFORE_CURRENT_COLLECTIONTIME_MS + " milliseconds into the past." + + " Cannot be more than " + AFTER_CURRENT_COLLECTIONTIME_MS + " milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); } @Test public void testHttpAggregatedMultiIngestionInvalidFutureCollectionTime() throws IOException, URISyntaxException { - long timestamp = System.currentTimeMillis() + TIME_DIFF_MS - + Configuration.getInstance().getLongProperty( CoreConfig.AFTER_CURRENT_COLLECTIONTIME_MS ); + long timestamp = System.currentTimeMillis() + TIME_DIFF_MS + AFTER_CURRENT_COLLECTIONTIME_MS; String postfix = getPostfix(); @@ -245,8 +245,8 @@ public void testHttpAggregatedMultiIngestionInvalidFutureCollectionTime() throws assertEquals("Number of errors invalid", 3, errorResponse.getErrors().size()); assertEquals("Invalid error source", "timestamp", errorResponse.getErrors().get(0).getSource()); - assertEquals("Invalid error message", "Out of bounds. Cannot be more than 259200000 milliseconds into the past." + - " Cannot be more than 600000 milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); + assertEquals("Invalid error message", "Out of bounds. Cannot be more than " + BEFORE_CURRENT_COLLECTIONTIME_MS + " milliseconds into the past." + + " Cannot be more than " + AFTER_CURRENT_COLLECTIONTIME_MS + " milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); } @Test @@ -292,8 +292,8 @@ locator2, RollupType.ENUM, new Range(start, end), public void testHttpAggregatedMultiPartialInvalidCollectionTime() throws Exception { String postfix = getPostfix(); long validTime = System.currentTimeMillis(); - long pastTime = System.currentTimeMillis() - TIME_DIFF_MS - Configuration.getInstance().getLongProperty( CoreConfig.BEFORE_CURRENT_COLLECTIONTIME_MS ); - long futureTime = System.currentTimeMillis() + TIME_DIFF_MS + Configuration.getInstance().getLongProperty( CoreConfig.AFTER_CURRENT_COLLECTIONTIME_MS ); + long pastTime = System.currentTimeMillis() - TIME_DIFF_MS - BEFORE_CURRENT_COLLECTIONTIME_MS; + long futureTime = System.currentTimeMillis() + TIME_DIFF_MS + AFTER_CURRENT_COLLECTIONTIME_MS; String jsonBody = getJsonFromFile("sample_multi_aggregated_payload_with_different_time.json", postfix); jsonBody = updateTimeStampJson(jsonBody, "\"%TIMESTAMP_1%\"", validTime); @@ -302,11 +302,15 @@ public void testHttpAggregatedMultiPartialInvalidCollectionTime() throws Excepti jsonBody = jsonBody.replaceAll("%TENANT_ID_.%", TENANT_ID); HttpResponse response = httpPost(TENANT_ID, postAggregatedMultiPath, jsonBody ); - String[] output = getBodyArray(response); + ErrorResponse errorResponse = getErrorResponse(response); try { assertEquals("Should get status 207 from " + String.format(postAggregatedMultiPath, TENANT_ID), 207, response.getStatusLine().getStatusCode() ); - assertEquals("", output[0]); + for (int i = 0; i < 2; i++) { + assertEquals("Invalid error source", "timestamp", errorResponse.getErrors().get(i).getSource()); + assertEquals("Invalid error message", "Out of bounds. Cannot be more than " + BEFORE_CURRENT_COLLECTIONTIME_MS + " milliseconds into the past." + + " Cannot be more than " + AFTER_CURRENT_COLLECTIONTIME_MS + " milliseconds into the future", errorResponse.getErrors().get(i).getMessage()); + } } finally { EntityUtils.consume( response.getEntity() ); // Releases connection apparently @@ -472,7 +476,10 @@ public void testMultiTenantPartialFailureWithoutTenant() throws Exception { try { assertEquals("Should get status 207 from " + String.format(postMultiPath, TENANT_ID), 207, response.getStatusLine().getStatusCode()); - assertTrue("No errors found", errorResponse.getErrors().size() > 0); + for (int i = 0; i < 2; i++) { + assertEquals("Invalid error source", "tenantId", errorResponse.getErrors().get(i).getSource()); + assertEquals("Invalid error message", "may not be empty", errorResponse.getErrors().get(i).getMessage()); + } } finally { EntityUtils.consume( response.getEntity() ); // Releases connection apparently diff --git a/blueflood-http/src/main/java/com/rackspacecloud/blueflood/inputs/handlers/HttpAggregatedMultiIngestionHandler.java b/blueflood-http/src/main/java/com/rackspacecloud/blueflood/inputs/handlers/HttpAggregatedMultiIngestionHandler.java index 478b4fbec..a56a8c0bc 100644 --- a/blueflood-http/src/main/java/com/rackspacecloud/blueflood/inputs/handlers/HttpAggregatedMultiIngestionHandler.java +++ b/blueflood-http/src/main/java/com/rackspacecloud/blueflood/inputs/handlers/HttpAggregatedMultiIngestionHandler.java @@ -128,7 +128,7 @@ public void handle(ChannelHandlerContext ctx, FullHttpRequest request) { return; } else { // has some validation errors, response MULTI_STATUS - DefaultHandler.sendResponse(ctx, request, null, HttpResponseStatus.MULTI_STATUS); + DefaultHandler.sendErrorResponse(ctx, request, errors, HttpResponseStatus.MULTI_STATUS); return; } diff --git a/blueflood-http/src/test/java/com/rackspacecloud/blueflood/inputs/handlers/HttpAggregatedIngestionHandlerTest.java b/blueflood-http/src/test/java/com/rackspacecloud/blueflood/inputs/handlers/HttpAggregatedIngestionHandlerTest.java index ec25d0e80..6e85be40f 100644 --- a/blueflood-http/src/test/java/com/rackspacecloud/blueflood/inputs/handlers/HttpAggregatedIngestionHandlerTest.java +++ b/blueflood-http/src/test/java/com/rackspacecloud/blueflood/inputs/handlers/HttpAggregatedIngestionHandlerTest.java @@ -204,7 +204,7 @@ public void testEmptyTenantId() throws IOException { assertEquals("Invalid error message", "may not be empty", errorResponse.getErrors().get(0).getMessage()); assertEquals("Invalid source", "tenantId", errorResponse.getErrors().get(0).getSource()); assertEquals("Invalid tenant", "", errorResponse.getErrors().get(0).getTenantId()); - assertEquals("Invalid metric name", "", errorResponse.getErrors().get(0).getMetricName()); + assertEquals("Invalid metric name", "gauge.a.b", errorResponse.getErrors().get(0).getMetricName()); assertEquals("Invalid status", HttpResponseStatus.BAD_REQUEST, argument.getValue().getStatus()); } @@ -226,7 +226,7 @@ public void testInvalidFlushInterval() throws IOException { assertEquals("Invalid error message", "must be between 0 and 9223372036854775807", errorResponse.getErrors().get(0).getMessage()); assertEquals("Invalid source", "flushInterval", errorResponse.getErrors().get(0).getSource()); assertEquals("Invalid tenant", TENANT, errorResponse.getErrors().get(0).getTenantId()); - assertEquals("Invalid metric name", "", errorResponse.getErrors().get(0).getMetricName()); + assertEquals("Invalid metric name", "gauge.a.b", errorResponse.getErrors().get(0).getMetricName()); assertEquals("Invalid status", HttpResponseStatus.BAD_REQUEST, argument.getValue().getStatus()); } @@ -252,7 +252,7 @@ public void testCollectionTimeInPast() throws IOException { "Cannot be more than 600000 milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); assertEquals("Invalid source", "timestamp", errorResponse.getErrors().get(0).getSource()); assertEquals("Invalid tenant", TENANT, errorResponse.getErrors().get(0).getTenantId()); - assertEquals("Invalid metric name", "", errorResponse.getErrors().get(0).getMetricName()); + assertEquals("Invalid metric name", "gauge.a.b", errorResponse.getErrors().get(0).getMetricName()); assertEquals("Invalid status", HttpResponseStatus.BAD_REQUEST, argument.getValue().getStatus()); } @@ -278,7 +278,7 @@ public void testCollectionTimeInFuture() throws IOException { "Cannot be more than 600000 milliseconds into the future", errorResponse.getErrors().get(0).getMessage()); assertEquals("Invalid source", "timestamp", errorResponse.getErrors().get(0).getSource()); assertEquals("Invalid tenant", TENANT, errorResponse.getErrors().get(0).getTenantId()); - assertEquals("Invalid metric name", "", errorResponse.getErrors().get(0).getMetricName()); + assertEquals("Invalid metric name", "gauge.a.b", errorResponse.getErrors().get(0).getMetricName()); assertEquals("Invalid status", HttpResponseStatus.BAD_REQUEST, argument.getValue().getStatus()); } @@ -296,7 +296,7 @@ public void testAggregatedMetricsNotSet() throws IOException { ErrorResponse errorResponse = getErrorResponse(errorResponseBody); assertEquals("Number of errors invalid", 1, errorResponse.getErrors().size()); - assertEquals("Invalid error message", "Atleast one of the aggregated metrics(gauges, counters, timers, sets) " + + assertEquals("Invalid error message", "At least one of the aggregated metrics(gauges, counters, timers, sets) " + "are expected", errorResponse.getErrors().get(0).getMessage()); assertEquals("Invalid source", "", errorResponse.getErrors().get(0).getSource()); assertEquals("Invalid tenant", TENANT, errorResponse.getErrors().get(0).getTenantId());