You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ji...@apache.org on 2020/12/03 20:12:48 UTC
[incubator-pinot] branch master updated: [TE] rest-api -
harleyjj/rca - add forecast as baseline option for metric/timeseries
endpoint (#6265)
This is an automated email from the ASF dual-hosted git repository.
jihao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git
The following commit(s) were added to refs/heads/master by this push:
new e8ceb2e [TE] rest-api - harleyjj/rca - add forecast as baseline option for metric/timeseries endpoint (#6265)
e8ceb2e is described below
commit e8ceb2e74b0932a869043b4c00c70fd0eb63db4d
Author: Harley Jackson <hj...@linkedin.com>
AuthorDate: Thu Dec 3 12:12:37 2020 -0800
[TE] rest-api - harleyjj/rca - add forecast as baseline option for metric/timeseries endpoint (#6265)
---
.../dashboard/ThirdEyeDashboardModule.java | 12 ++++-
.../resources/v2/RootCauseMetricResource.java | 52 +++++++++++++++++++++-
2 files changed, 61 insertions(+), 3 deletions(-)
diff --git a/thirdeye/thirdeye-dashboard/src/main/java/org/apache/pinot/thirdeye/dashboard/ThirdEyeDashboardModule.java b/thirdeye/thirdeye-dashboard/src/main/java/org/apache/pinot/thirdeye/dashboard/ThirdEyeDashboardModule.java
index 7354e86..e643751 100644
--- a/thirdeye/thirdeye-dashboard/src/main/java/org/apache/pinot/thirdeye/dashboard/ThirdEyeDashboardModule.java
+++ b/thirdeye/thirdeye-dashboard/src/main/java/org/apache/pinot/thirdeye/dashboard/ThirdEyeDashboardModule.java
@@ -46,6 +46,7 @@ import org.apache.pinot.thirdeye.datalayer.bao.ConfigManager;
import org.apache.pinot.thirdeye.datalayer.bao.DatasetConfigManager;
import org.apache.pinot.thirdeye.datalayer.bao.DetectionAlertConfigManager;
import org.apache.pinot.thirdeye.datalayer.bao.DetectionConfigManager;
+import org.apache.pinot.thirdeye.datalayer.bao.EvaluationManager;
import org.apache.pinot.thirdeye.datalayer.bao.EventManager;
import org.apache.pinot.thirdeye.datalayer.bao.MergedAnomalyResultManager;
import org.apache.pinot.thirdeye.datalayer.bao.MetricConfigManager;
@@ -104,6 +105,7 @@ public class ThirdEyeDashboardModule extends AbstractModule {
*/
bind(ConfigManager.class).toInstance(DAO_REGISTRY.getConfigDAO());
bind(EventManager.class).toInstance(DAO_REGISTRY.getEventDAO());
+ bind(EvaluationManager.class).toInstance(DAO_REGISTRY.getEvaluationManager());
bind(MergedAnomalyResultManager.class).toInstance(DAO_REGISTRY.getMergedAnomalyResultDAO());
bind(DatasetConfigManager.class).toInstance(DAO_REGISTRY.getDatasetConfigDAO());
bind(MetricConfigManager.class).toInstance(DAO_REGISTRY.getMetricConfigDAO());
@@ -162,12 +164,18 @@ public class ThirdEyeDashboardModule extends AbstractModule {
final AggregationLoader aggregationLoader,
final TimeSeriesLoader timeSeriesLoader,
final MetricConfigManager metricConfigManager,
- final DatasetConfigManager datasetConfigManager) {
+ final DatasetConfigManager datasetConfigManager,
+ final EventManager eventManager,
+ final MergedAnomalyResultManager mergedAnomalyResultManager,
+ final EvaluationManager evaluationManager) {
return new RootCauseMetricResource(Executors.newCachedThreadPool(),
aggregationLoader,
timeSeriesLoader,
metricConfigManager,
- datasetConfigManager);
+ datasetConfigManager,
+ eventManager,
+ mergedAnomalyResultManager,
+ evaluationManager);
}
@Singleton
diff --git a/thirdeye/thirdeye-dashboard/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/RootCauseMetricResource.java b/thirdeye/thirdeye-dashboard/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/RootCauseMetricResource.java
index 7269fcf..dd8a4ad 100644
--- a/thirdeye/thirdeye-dashboard/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/RootCauseMetricResource.java
+++ b/thirdeye/thirdeye-dashboard/src/main/java/org/apache/pinot/thirdeye/dashboard/resources/v2/RootCauseMetricResource.java
@@ -21,17 +21,34 @@ package org.apache.pinot.thirdeye.dashboard.resources.v2;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
+import java.lang.reflect.Constructor;
import org.apache.pinot.thirdeye.api.Constants;
import org.apache.pinot.thirdeye.common.time.TimeGranularity;
import org.apache.pinot.thirdeye.dataframe.DataFrame;
import org.apache.pinot.thirdeye.dataframe.LongSeries;
import org.apache.pinot.thirdeye.dataframe.util.MetricSlice;
import org.apache.pinot.thirdeye.datalayer.bao.DatasetConfigManager;
+import org.apache.pinot.thirdeye.datalayer.bao.EvaluationManager;
+import org.apache.pinot.thirdeye.datalayer.bao.EventManager;
+import org.apache.pinot.thirdeye.datalayer.bao.MergedAnomalyResultManager;
import org.apache.pinot.thirdeye.datalayer.bao.MetricConfigManager;
import org.apache.pinot.thirdeye.datalayer.dto.DatasetConfigDTO;
import org.apache.pinot.thirdeye.datalayer.dto.MetricConfigDTO;
+import org.apache.pinot.thirdeye.datasource.ThirdEyeCacheRegistry;
import org.apache.pinot.thirdeye.datasource.loader.AggregationLoader;
+import org.apache.pinot.thirdeye.datasource.loader.DefaultTimeSeriesLoader;
import org.apache.pinot.thirdeye.datasource.loader.TimeSeriesLoader;
+import org.apache.pinot.thirdeye.detection.DataProvider;
+import org.apache.pinot.thirdeye.detection.DefaultDataProvider;
+import org.apache.pinot.thirdeye.detection.DefaultInputDataFetcher;
+import org.apache.pinot.thirdeye.detection.DetectionPipelineLoader;
+import org.apache.pinot.thirdeye.detection.InputDataFetcher;
+import org.apache.pinot.thirdeye.detection.annotation.registry.DetectionRegistry;
+import org.apache.pinot.thirdeye.detection.cache.builder.AnomaliesCacheBuilder;
+import org.apache.pinot.thirdeye.detection.cache.builder.TimeSeriesCacheBuilder;
+import org.apache.pinot.thirdeye.detection.spec.AbstractSpec;
+import org.apache.pinot.thirdeye.detection.spi.components.BaselineProvider;
+import org.apache.pinot.thirdeye.detection.spi.model.TimeSeries;
import org.apache.pinot.thirdeye.rootcause.impl.MetricEntity;
import org.apache.pinot.thirdeye.rootcause.timeseries.Baseline;
import io.swagger.annotations.Api;
@@ -67,6 +84,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.apache.pinot.thirdeye.dashboard.resources.v2.BaselineParsingUtils.*;
+import static org.apache.pinot.thirdeye.detection.DetectionUtils.*;
/**
@@ -94,6 +112,7 @@ public class RootCauseMetricResource {
private static final String OFFSET_DEFAULT = "current";
private static final String TIMEZONE_DEFAULT = "UTC";
+ private static final String OFFSET_FORECAST = "forecast";
private static final String GRANULARITY_DEFAULT = MetricSlice.NATIVE_GRANULARITY.toAggregationGranularityString();
private static final int LIMIT_DEFAULT = 100;
@@ -102,14 +121,21 @@ public class RootCauseMetricResource {
private final TimeSeriesLoader timeSeriesLoader;
private final MetricConfigManager metricDAO;
private final DatasetConfigManager datasetDAO;
+ private final DataProvider dataProvider;
public RootCauseMetricResource(ExecutorService executor, AggregationLoader aggregationLoader,
- TimeSeriesLoader timeSeriesLoader, MetricConfigManager metricDAO, DatasetConfigManager datasetDAO) {
+ TimeSeriesLoader timeSeriesLoader, MetricConfigManager metricDAO, DatasetConfigManager datasetDAO,
+ EventManager eventDAO, MergedAnomalyResultManager anomalyDAO, EvaluationManager evaluationDAO) {
this.executor = executor;
this.aggregationLoader = aggregationLoader;
this.timeSeriesLoader = timeSeriesLoader;
this.metricDAO = metricDAO;
this.datasetDAO = datasetDAO;
+ TimeSeriesLoader timeseriesLoader =
+ new DefaultTimeSeriesLoader(metricDAO, datasetDAO, ThirdEyeCacheRegistry.getInstance().getQueryCache(), ThirdEyeCacheRegistry.getInstance().getTimeSeriesCache());
+ this.dataProvider = new DefaultDataProvider(metricDAO, datasetDAO, eventDAO, anomalyDAO, evaluationDAO,
+ timeseriesLoader, aggregationLoader, new DetectionPipelineLoader(), TimeSeriesCacheBuilder.getInstance(),
+ AnomaliesCacheBuilder.getInstance());
}
/**
@@ -406,6 +432,30 @@ public class RootCauseMetricResource {
TimeGranularity granularity = TimeGranularity.fromString(granularityString);
MetricSlice baseSlice = alignSlice(makeSlice(urn, start, end, granularity), timezone);
+
+ if(OFFSET_FORECAST.equals(offset)) {
+ String forecastClassName = DetectionRegistry.getInstance().lookup("FORECAST");
+ try {
+ InputDataFetcher dataFetcher = new DefaultInputDataFetcher(dataProvider, -1);
+ Map<String, Object> componentSpec = new HashMap<>();
+
+ Constructor<?> constructor = Class.forName(forecastClassName).getConstructor();
+ BaselineProvider forecastProvider = (BaselineProvider) constructor.newInstance();
+
+ Class clazz = Class.forName(forecastClassName);
+ Class<AbstractSpec> specClazz = (Class<AbstractSpec>) Class.forName(getSpecClassName(clazz));
+ AbstractSpec forecastSpec = AbstractSpec.fromProperties(componentSpec, specClazz);
+
+ forecastProvider.init(forecastSpec, dataFetcher);
+ TimeSeries forecast = forecastProvider.computePredictedTimeSeries(baseSlice);
+ return makeTimeSeriesMap(forecast.getDataFrame());
+ }
+ catch (Exception e) {
+ LOG.info("Failed to get Forecast baseline");
+ offset = OFFSET_DEFAULT;
+ }
+ }
+
Baseline range = parseOffset(offset, timezone);
List<MetricSlice> slices = new ArrayList<>(range.scatter(baseSlice));
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org