package com.linkedin.thirdeye.util;
import com.linkedin.thirdeye.client.MetricExpression;
import com.linkedin.thirdeye.client.ThirdEyeClient;
import com.linkedin.thirdeye.client.ThirdEyeResponse;
import com.linkedin.thirdeye.dashboard.Utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.joda.time.DateTime;
import com.google.common.collect.Maps;
import com.linkedin.thirdeye.client.ThirdEyeRequest;
import com.linkedin.thirdeye.client.ThirdEyeRequest.ThirdEyeRequestBuilder;
import com.linkedin.thirdeye.client.ThirdEyeResponseRow;
import com.linkedin.thirdeye.constant.MetricAggFunction;
public class SeverityComputationUtil {
private ThirdEyeClient thirdEyeClient;
private String collectionName;
private String metricName;
public SeverityComputationUtil(ThirdEyeClient thirdEyeClient, String collectionName, String metricName) {
this.thirdEyeClient = thirdEyeClient;
this.collectionName = collectionName;
this.metricName = metricName;
}
public Map<String, Object> computeSeverity(long currentWindowStart, long currentWindowEnd, long seasonalPeriod,
long seasonCount)
throws Exception {
// CURRENT
ThirdEyeRequest thirdEyeRequest = createThirdEyeRequest(currentWindowStart, currentWindowEnd);
double currentSum = getSum(thirdEyeRequest);
List<Pair<DateTime, DateTime>> intervals =
getHistoryIntervals(currentWindowStart, currentWindowEnd, seasonalPeriod, seasonCount);
double baselineSum = 0;
int count = 0;
for (Pair<DateTime, DateTime> pair : intervals) {
thirdEyeRequest = createThirdEyeRequest(pair.getLeft().getMillis(), pair.getRight().getMillis());
double sum = getSum(thirdEyeRequest);
if (sum != 0d) {
++count;
baselineSum += sum;
}
}
double baselineSumAvg = baselineSum / count;
double weight = (currentSum - baselineSumAvg) / baselineSumAvg;
HashMap<String, Object> hashMap = Maps.newHashMap();
hashMap.put("weight", weight);
hashMap.put("currentSum", currentSum);
hashMap.put("baselineSumAvg", baselineSumAvg);
return hashMap;
}
private double getSum(ThirdEyeRequest thirdEyeRequest) throws Exception {
double sum = 0;
ThirdEyeResponse response = thirdEyeClient.execute(thirdEyeRequest);
if (response.getNumRows() == 1) {
ThirdEyeResponseRow row = response.getRow(0);
sum = row.getMetrics().get(0);
}
return sum;
}
private ThirdEyeRequest createThirdEyeRequest(long currentWindowStart, long currentWindowEnd)
throws ExecutionException {
ThirdEyeRequestBuilder requestBuilder = ThirdEyeRequest.newBuilder();
requestBuilder.setStartTimeInclusive(new DateTime(currentWindowStart));
requestBuilder.setEndTimeExclusive(new DateTime(currentWindowEnd));
// requestBuilder.setFilterSet(comparisonRequest.getFilterSet());
// requestBuilder.addGroupBy(comparisonRequest.getGroupByDimensions());
requestBuilder.setGroupByTimeGranularity(null);
List<MetricExpression> metricExpressions =
Utils.convertToMetricExpressions(metricName, MetricAggFunction.SUM, collectionName);
requestBuilder.setMetricFunctions(metricExpressions.get(0).computeMetricFunctions());
ThirdEyeRequest thirdEyeRequest = requestBuilder.build("test-" + System.currentTimeMillis());
return thirdEyeRequest;
}
private List<Pair<DateTime, DateTime>> getHistoryIntervals(long currentWindowStart, long currentWindowEnd,
long seasonalPeriod, long seasonCount) {
List<Pair<DateTime, DateTime>> intervals = new ArrayList<>();
for (int i = 1; i <= seasonCount; ++i) {
intervals.add(ImmutablePair.of(new DateTime(currentWindowStart).minus(seasonalPeriod * i), new DateTime(currentWindowEnd).minus(seasonalPeriod * i)));
}
return intervals;
}
}