This is an automated email from the ASF dual-hosted git repository.

xhsun 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 3f9a2cb  [TE] Show more debug information in preview (#4167)
3f9a2cb is described below

commit 3f9a2cbb44befda7957b94d3cfe60775be0f1e89
Author: Xiaohui Sun <[email protected]>
AuthorDate: Mon Apr 29 15:32:44 2019 -0700

    [TE] Show more debug information in preview (#4167)
    
    * [TE] Show more debug information in preview
    
    * [TE] Revert to set detection config id as Long.MAX_VALUE
    
    * [TE] Remove duplicate code for preview
---
 .../DetectorDataInsufficientException.java         |  2 +-
 .../thirdeye/detection/yaml/YamlResource.java      | 75 +++++++++++-----------
 2 files changed, 38 insertions(+), 39 deletions(-)

diff --git 
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/spi/exception/DetectorDataInsufficientException.java
 
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/spi/exception/DetectorDataInsufficientException.java
index f65223c..10aa936 100644
--- 
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/spi/exception/DetectorDataInsufficientException.java
+++ 
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/spi/exception/DetectorDataInsufficientException.java
@@ -28,7 +28,7 @@ public class DetectorDataInsufficientException extends 
DetectorException {
   }
 
   public DetectorDataInsufficientException() {
-    super();
+    this("Data is insufficient to run detection");
   }
 
   public DetectorDataInsufficientException(String message) {
diff --git 
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java
 
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java
index c4e1160..6fe2d52 100644
--- 
a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java
+++ 
b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java
@@ -34,7 +34,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 import javax.validation.constraints.NotNull;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
@@ -566,35 +565,8 @@ public class YamlResource {
       @QueryParam("tuningStart") long tuningStart,
       @QueryParam("tuningEnd") long tuningEnd,
       @ApiParam("jsonPayload") String payload) {
-    Map<String, String> responseMessage = new HashMap<>();
-    DetectionPipelineResult result;
-    long ts = System.currentTimeMillis();
-    try {
-      Preconditions.checkArgument(StringUtils.isNotBlank(payload), "The Yaml 
Payload in the request is empty.");
-
-      // Translate config from YAML to detection config (JSON)
-      Map<String, Object> newDetectionConfigMap = new 
HashMap<>(ConfigUtils.getMap(this.yaml.load(payload)));
-      DetectionConfigDTO detectionConfig = 
buildDetectionConfigFromYaml(tuningStart, tuningEnd, newDetectionConfigMap, 
null);
-      Preconditions.checkNotNull(detectionConfig);
-      detectionConfig.setId(Long.MAX_VALUE);
-
-      DetectionPipeline pipeline = this.loader.from(this.provider, 
detectionConfig, start, end);
-      result = pipeline.run();
-
-    } catch (ValidationException e) {
-      LOG.warn("Validation error while running preview with payload  " + 
payload, e);
-      responseMessage.put("message", "Validation Error! " + e.getMessage());
-      return Response.serverError().entity(responseMessage).build();
-    } catch (InvocationTargetException e) {
-      responseMessage.put("message", "Failed to run the preview due to " + 
e.getTargetException().getMessage());
-      return Response.serverError().entity(responseMessage).build();
-    } catch (Exception e) {
-      LOG.error("Error running preview with payload " + payload, e);
-      responseMessage.put("message", "Failed to run the preview due to " + 
e.getMessage());
-      return Response.serverError().entity(responseMessage).build();
-    }
-    LOG.info("Preview successful, used {} milliseconds", 
System.currentTimeMillis() - ts);
-    return Response.ok(result).build();
+    Preconditions.checkArgument(StringUtils.isNotBlank(payload), "The Yaml 
Payload in the request is empty.");
+    return runPreview(start, end, tuningStart, tuningEnd, payload, null);
   }
 
   @POST
@@ -609,19 +581,30 @@ public class YamlResource {
       @QueryParam("tuningStart") long tuningStart,
       @QueryParam("tuningEnd") long tuningEnd,
       @ApiParam("jsonPayload") String payload) {
+    Preconditions.checkArgument(StringUtils.isNotBlank(payload), "The Yaml 
Payload in the request is empty.");
+    DetectionConfigDTO existingConfig = this.detectionConfigDAO.findById(id);
+    Preconditions.checkNotNull(existingConfig, "can not find existing 
detection config " + id);
+    return runPreview(start, end, tuningStart, tuningEnd, payload, 
existingConfig);
+  }
+
+  private Response runPreview(long start, long end,
+      long tuningStart, long tuningEnd, String payload, DetectionConfigDTO 
existingConfig) {
+    long ts = System.currentTimeMillis();
     Map<String, String> responseMessage = new HashMap<>();
     DetectionPipelineResult result;
-    long ts = System.currentTimeMillis();
     try {
-      Preconditions.checkArgument(StringUtils.isNotBlank(payload), "The Yaml 
Payload in the request is empty.");
-      DetectionConfigDTO existingConfig = this.detectionConfigDAO.findById(id);
-      Preconditions.checkNotNull(existingConfig, "can not find existing 
detection config " + id);
-
       // Translate config from YAML to detection config (JSON)
       Map<String, Object> newDetectionConfigMap = new 
HashMap<>(ConfigUtils.getMap(this.yaml.load(payload)));
-      DetectionConfigDTO detectionConfig = 
buildDetectionConfigFromYaml(tuningStart, tuningEnd, newDetectionConfigMap, 
existingConfig);
-      Preconditions.checkNotNull(detectionConfig);
+      DetectionConfigDTO detectionConfig;
 
+      if (existingConfig == null) {
+        detectionConfig = buildDetectionConfigFromYaml(tuningStart, tuningEnd, 
newDetectionConfigMap, null);
+        detectionConfig.setId(Long.MAX_VALUE);
+      } else {
+        detectionConfig = buildDetectionConfigFromYaml(tuningStart, tuningEnd, 
newDetectionConfigMap, existingConfig);
+      }
+
+      Preconditions.checkNotNull(detectionConfig);
       DetectionPipeline pipeline = this.loader.from(this.provider, 
detectionConfig, start, end);
       result = pipeline.run();
 
@@ -629,15 +612,31 @@ public class YamlResource {
       LOG.warn("Validation error while running preview with payload  " + 
payload, e);
       responseMessage.put("message", "Validation Error! " + e.getMessage());
       return Response.serverError().entity(responseMessage).build();
+    } catch (InvocationTargetException e) {
+      responseMessage.put("message", "Failed to run the preview due to " + 
e.getTargetException().getMessage());
+      return Response.serverError().entity(responseMessage).build();
     } catch (Exception e) {
       LOG.error("Error running preview with payload " + payload, e);
-      responseMessage.put("message", "Failed to run the preview due to " + 
e.getMessage());
+      StringBuilder sb = new StringBuilder();
+      // show more stack message to frontend for debugging
+      getErrorMessage(0, 5, e, sb);
+      responseMessage.put("message", "Failed to run the preview. Error stack: 
" + sb.toString());
       return Response.serverError().entity(responseMessage).build();
     }
     LOG.info("Preview successful, used {} milliseconds", 
System.currentTimeMillis() - ts);
     return Response.ok(result).build();
   }
 
+  private void getErrorMessage(int curLevel, int totalLevel, Throwable e, 
StringBuilder sb) {
+    if (curLevel <= totalLevel && e != null) {
+      sb.append("==");
+      if (e.getMessage() != null) {
+        sb.append(e.getMessage());
+      }
+      getErrorMessage(curLevel + 1, totalLevel, e.getCause(), sb);
+    }
+  }
+
   @POST
   @Path("/preview/baseline")
   @Produces(MediaType.APPLICATION_JSON)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to