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