/*
* Copyright 2013-2016 Rackspace
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.rackspacecloud.blueflood.outputs.handlers;
import com.google.common.base.Strings;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.rackspacecloud.blueflood.http.HttpIntegrationTestBase;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import java.io.IOException;
import java.net.URISyntaxException;
import static org.junit.Assert.*;
/**
* Integration Tests for GET .../views/:metricName (aka Singleplot views)
*/
public class HttpRollupsQueryHandlerIntegrationTest extends HttpIntegrationTestBase {
private final String tenant_id = "333333";
private final long now = System.currentTimeMillis();
private final long start = now - TIME_DIFF_MS;
private final long end = now + TIME_DIFF_MS;
@Test
public void testHttpRollupsQueryHandler() throws Exception {
String postfix = getPostfix();
// ingest and rollup metrics with enum values and verify CF points and elastic search indexes
final String metric_name = "3333333.G1s" + postfix;
// post multi metrics for ingestion and verify
HttpResponse response = postMetric(tenant_id, postAggregatedPath, "sample_payload.json", postfix );
assertEquals( "Should get status 200 from ingestion server for POST", 200, response.getStatusLine().getStatusCode() );
EntityUtils.consume(response.getEntity());
JsonObject responseObject = getSingleMetricRetry( tenant_id, metric_name, start, end, "", "FULL", "");
assertNotNull( "No values for " + metric_name + " found", responseObject );
assertEquals( "unknown", responseObject.get( "unit" ).getAsString() );
JsonArray values = responseObject.getAsJsonArray( "values" );
assertEquals( 1, values.size() );
JsonObject value = values.get( 0 ).getAsJsonObject();
assertEquals( 1, value.get( "numPoints" ).getAsInt() );
assertTrue( value.has( "timestamp" ) );
assertEquals( 397, value.get( "latest" ).getAsInt() );
JsonObject meta = responseObject.get( "metadata" ).getAsJsonObject();
assertTrue( meta.get( "limit" ).isJsonNull() );
assertTrue( meta.get( "next_href" ).isJsonNull() );
assertEquals( 1, meta.get( "count" ).getAsInt() );
assertTrue( meta.get( "marker" ).isJsonNull() );
assertResponseHeaderAllowOrigin(response);
}
/**
*
* On Travis we had runs fails because even though the query returns 200, no metric values are on in the response.
*
* We aren't sure what's going on as we can't reproduce this locally.
*
* @param tenant_id
* @param metric_name
* @param start
* @param end
* @param points
* @param resolution
* @param select
* @return
* @throws URISyntaxException
* @throws IOException
* @throws InterruptedException
*/
private JsonObject getSingleMetricRetry(String tenant_id,
String metric_name,
long start,
long end,
String points,
String resolution,
String select) throws URISyntaxException, IOException, InterruptedException {
for( int i = 0; i < 10 ; i++ ) {
// query for multiplot metric and assert results
HttpResponse query_response = querySingleplot( tenant_id, metric_name, start, end, points, resolution, select );
assertEquals( "Should get status 200 from query server for single view GET", 200, query_response.getStatusLine().getStatusCode() );
// assert response content
String responseContent = EntityUtils.toString( query_response.getEntity(), "UTF-8" );
JsonParser jsonParser = new JsonParser();
JsonObject responseObject = jsonParser.parse( responseContent ).getAsJsonObject();
JsonArray arrayValues = responseObject.getAsJsonArray( "values" );
if ( arrayValues.size() == 1 ) {
return responseObject;
}
System.out.println(String.format("Data for metric %s is not found, sleeping and retrying, payload: %s", metric_name, responseContent));
Thread.currentThread().sleep( 5000 );
}
return null;
}
}