package com.linkedin.thirdeye.client.timeseries;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.joda.time.DateTime;
import com.google.common.collect.Lists;
import com.linkedin.thirdeye.api.TimeGranularity;
import com.linkedin.thirdeye.client.MetricExpression;
import com.linkedin.thirdeye.client.MetricFunction;
import com.linkedin.thirdeye.client.cache.QueryCache;
import com.linkedin.thirdeye.client.pinot.PinotThirdEyeClient;
import com.linkedin.thirdeye.client.timeseries.TimeSeriesRow.TimeSeriesMetric;
import com.linkedin.thirdeye.constant.MetricAggFunction;
import com.linkedin.thirdeye.dashboard.Utils;
/** Manual test for verifying code works as expected (ie without exceptions thrown) */
public class TimeSeriesTest {
private static final ArrayList<String> ABOOK_DIMENSIONS =
Lists.newArrayList("browserName", "contactsOrigin", "deviceName", "continent", "countryCode",
"environment", "locale", "osName", "pageKey", "source", "sourceApp");
private static final String THIRDEYE_ABOOK = "thirdeyeAbook";
private static final String COUNT = "__COUNT";
private static final MetricFunction DEFAULT_METRIC_FUNCTION =
new MetricFunction(MetricAggFunction.SUM, COUNT, 0L, THIRDEYE_ABOOK, null, null);
private static final MetricExpression SUBMIT_RATE_EXPRESSION =
new MetricExpression("submit_rate", "submits/impressions");
private static final DateTime START = new DateTime(2016, 4, 1, 00, 00);
public static void main(String[] args) throws Exception {
URL resource = null;// = System.class.get.getResource("log4j.properties");
if (resource == null) {
resource = TimeSeriesHandler.class.getClassLoader().getResource("logback.x");
}
PinotThirdEyeClient pinotThirdEyeClient = PinotThirdEyeClient.getDefaultTestClient(); // TODO
// make
// this
// configurable
QueryCache queryCache = new QueryCache(pinotThirdEyeClient, Executors.newFixedThreadPool(10));
TimeSeriesRequest[] requests = new TimeSeriesRequest[] {
generateGroupByTimeRequest(),
// generateGroupByDimensionRequest(),
// generateGroupByTimeAndDimension()
};
for (TimeSeriesRequest timeSeriesRequest : requests) {
try {
TimeSeriesHandler handler = new TimeSeriesHandler(queryCache);
long start = System.currentTimeMillis();
TimeSeriesResponse response = handler.handle(timeSeriesRequest);
long end = System.currentTimeMillis();
System.out.println("Time taken:" + (end - start));
for (TimeSeriesMetric metric : response.getRow(0).getMetrics()) {
System.out.print(metric.getMetricName() + "\t\t");
}
System.out.println();
for (int i = 0; i < response.getNumRows(); i++) {
System.out.println(response.getRow(i));
}
} catch (Exception e) {
System.out.println("Request failed: " + timeSeriesRequest);
e.printStackTrace();
System.exit(-1);
}
}
System.out.println(
"No exceptions encountered during testing... but you still need to check for data quality!");
System.exit(0);
}
private static TimeSeriesRequest generateGroupByTimeRequest() {
TimeSeriesRequest timeSeriesRequest = new TimeSeriesRequest();
timeSeriesRequest.setCollectionName(THIRDEYE_ABOOK);
timeSeriesRequest.setStart(START);
timeSeriesRequest.setEnd(START.plusDays(1));
List<MetricFunction> metricFunctions = new ArrayList<>();
metricFunctions.add(DEFAULT_METRIC_FUNCTION);
List<MetricExpression> metricExpressions = Utils.convertToMetricExpressions(metricFunctions);
metricExpressions.add(SUBMIT_RATE_EXPRESSION);
timeSeriesRequest.setMetricExpressions(metricExpressions);
timeSeriesRequest.setAggregationTimeGranularity(new TimeGranularity(1, TimeUnit.HOURS));
return timeSeriesRequest;
}
private static TimeSeriesRequest generateGroupByDimensionRequest() {
TimeSeriesRequest timeSeriesRequest = new TimeSeriesRequest();
timeSeriesRequest.setCollectionName(THIRDEYE_ABOOK);
timeSeriesRequest.setStart(START);
timeSeriesRequest.setEnd(START.plusHours(3));
timeSeriesRequest.setGroupByDimensions(ABOOK_DIMENSIONS);
List<MetricFunction> metricFunctions = new ArrayList<>();
metricFunctions.add(DEFAULT_METRIC_FUNCTION);
List<MetricExpression> metricExpressions = Utils.convertToMetricExpressions(metricFunctions);
timeSeriesRequest.setMetricExpressions(metricExpressions);
timeSeriesRequest.setAggregationTimeGranularity(null);
return timeSeriesRequest;
}
private static TimeSeriesRequest generateGroupByTimeAndDimension() {
TimeSeriesRequest timeSeriesRequest = new TimeSeriesRequest();
timeSeriesRequest.setCollectionName(THIRDEYE_ABOOK);
timeSeriesRequest.setStart(START);
timeSeriesRequest.setEnd(START.plusHours(3));
timeSeriesRequest.setGroupByDimensions(ABOOK_DIMENSIONS);
List<MetricFunction> metricFunctions = new ArrayList<>();
metricFunctions.add(DEFAULT_METRIC_FUNCTION);
List<MetricExpression> metricExpressions = Utils.convertToMetricExpressions(metricFunctions);
timeSeriesRequest.setMetricExpressions(metricExpressions);
timeSeriesRequest.setAggregationTimeGranularity(new TimeGranularity(1, TimeUnit.HOURS));
return timeSeriesRequest;
}
}