You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2017/10/27 14:05:56 UTC

[6/6] kylin git commit: APACHE-KYLIN-2723: refine for feedback from dongli

APACHE-KYLIN-2723: refine for feedback from dongli

Signed-off-by: lidongsjtu <li...@apache.org>

This closes #79


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/2411470d
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/2411470d
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/2411470d

Branch: refs/heads/master
Commit: 2411470d1e8cb3f7e08d31627c7e3e66d95ba3f9
Parents: ec897aa
Author: Zhong <nj...@apache.org>
Authored: Thu Oct 26 18:04:56 2017 +0800
Committer: lidongsjtu <li...@apache.org>
Committed: Fri Oct 27 21:58:17 2017 +0800

----------------------------------------------------------------------
 .../apache/kylin/common/KylinConfigBase.java    |  8 ++---
 .../kylin/job/common/ShellExecutable.java       |  6 ++--
 .../job/execution/DefaultChainedExecutable.java |  2 +-
 .../kylin/job/execution/ExecuteResult.java      | 32 ++++++++------------
 .../org/apache/kylin/engine/mr/CubingJob.java   |  2 +-
 .../engine/mr/common/HadoopShellExecutable.java |  6 ++--
 .../engine/mr/common/MapReduceExecutable.java   |  8 ++---
 .../engine/mr/steps/MergeDictionaryStep.java    |  4 +--
 .../engine/mr/steps/MergeStatisticsStep.java    |  4 +--
 .../engine/mr/steps/SaveStatisticsStep.java     |  4 +--
 .../mr/steps/UpdateCubeInfoAfterBuildStep.java  |  2 +-
 .../mr/steps/UpdateCubeInfoAfterMergeStep.java  |  7 ++---
 .../kylin/engine/spark/SparkExecutable.java     |  2 +-
 .../kylin/rest/metrics/QueryMetricsFacade.java  | 13 +++++---
 .../apache/kylin/rest/request/SQLRequest.java   |  9 +-----
 .../apache/kylin/rest/response/SQLResponse.java |  9 +++---
 .../source/hive/CreateFlatHiveTableStep.java    |  2 +-
 .../apache/kylin/source/hive/HiveMRInput.java   |  4 +--
 .../org/apache/kylin/source/jdbc/CmdStep.java   |  2 +-
 .../apache/kylin/source/jdbc/HiveCmdStep.java   |  2 +-
 .../apache/kylin/source/kafka/KafkaMRInput.java |  2 +-
 .../kylin/source/kafka/job/MergeOffsetStep.java |  2 +-
 .../storage/hbase/steps/DeprecatedGCStep.java   |  2 +-
 .../steps/HDFSPathGarbageCollectionStep.java    |  2 +-
 .../kylin/storage/hbase/steps/MergeGCStep.java  |  3 +-
 25 files changed, 63 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
----------------------------------------------------------------------
diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index 625bbb3..9a28240 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -1337,7 +1337,7 @@ abstract public class KylinConfigBase implements Serializable {
     }
 
     public boolean isKylinMetricsReporterForJobEnabled() {
-        return Boolean.parseBoolean(getOptional("kylin.core.metrics.reporter-job-enabled", "true"));
+        return Boolean.parseBoolean(getOptional("kylin.core.metrics.reporter-job-enabled", "false"));
     }
 
     public String getKylinMetricsActiveReservoirDefaultClass() {
@@ -1351,11 +1351,7 @@ abstract public class KylinConfigBase implements Serializable {
     }
 
     public String getKylinMetricsSubjectSuffix() {
-        String suffix = getOptional("kylin.core.metric.subject-suffix", null);
-        if (suffix != null) {
-            return suffix;
-        }
-        return getDeployEnv();
+        return getOptional("kylin.core.metric.subject-suffix", getDeployEnv());
     }
 
     public String getKylinMetricsSubjectJob() {

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/core-job/src/main/java/org/apache/kylin/job/common/ShellExecutable.java
----------------------------------------------------------------------
diff --git a/core-job/src/main/java/org/apache/kylin/job/common/ShellExecutable.java b/core-job/src/main/java/org/apache/kylin/job/common/ShellExecutable.java
index 070ac23..b4abc4c 100644
--- a/core-job/src/main/java/org/apache/kylin/job/common/ShellExecutable.java
+++ b/core-job/src/main/java/org/apache/kylin/job/common/ShellExecutable.java
@@ -47,11 +47,11 @@ public class ShellExecutable extends AbstractExecutable {
             final PatternedLogger patternedLogger = new PatternedLogger(logger);
             final Pair<Integer, String> result = context.getConfig().getCliCommandExecutor().execute(getCmd(), patternedLogger);
             getManager().addJobInfo(getId(), patternedLogger.getInfo());
-            return new ExecuteResult(result.getFirst() == 0 ? ExecuteResult.State.SUCCEED : ExecuteResult.State.FAILED,
-                    new ShellException(result.getSecond()));
+            return result.getFirst() == 0 ? new ExecuteResult(ExecuteResult.State.SUCCEED, result.getSecond())
+                    : ExecuteResult.createFailed(new ShellException(result.getSecond()));
         } catch (IOException e) {
             logger.error("job:" + getId() + " execute finished with exception", e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/core-job/src/main/java/org/apache/kylin/job/execution/DefaultChainedExecutable.java
----------------------------------------------------------------------
diff --git a/core-job/src/main/java/org/apache/kylin/job/execution/DefaultChainedExecutable.java b/core-job/src/main/java/org/apache/kylin/job/execution/DefaultChainedExecutable.java
index 77d5efa..54b3b0a 100644
--- a/core-job/src/main/java/org/apache/kylin/job/execution/DefaultChainedExecutable.java
+++ b/core-job/src/main/java/org/apache/kylin/job/execution/DefaultChainedExecutable.java
@@ -82,7 +82,7 @@ public class DefaultChainedExecutable extends AbstractExecutable implements Chai
     @Override
     protected void onExecuteError(Throwable exception, ExecutableContext executableContext) {
         super.onExecuteError(exception, executableContext);
-        onStatusChange(executableContext, new ExecuteResult(exception), ExecutableState.ERROR);
+        onStatusChange(executableContext, ExecuteResult.createError(exception), ExecutableState.ERROR);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/core-job/src/main/java/org/apache/kylin/job/execution/ExecuteResult.java
----------------------------------------------------------------------
diff --git a/core-job/src/main/java/org/apache/kylin/job/execution/ExecuteResult.java b/core-job/src/main/java/org/apache/kylin/job/execution/ExecuteResult.java
index 139c04b..c0c9d36 100644
--- a/core-job/src/main/java/org/apache/kylin/job/execution/ExecuteResult.java
+++ b/core-job/src/main/java/org/apache/kylin/job/execution/ExecuteResult.java
@@ -32,39 +32,33 @@ public final class ExecuteResult {
     private final String output;
     private final Throwable throwable;
 
-    /**
-     * Default constructor to indicate a success ExecuteResult.
-     */
-    public ExecuteResult() {
-        this(State.SUCCEED, "succeed");
-    }
-
     public ExecuteResult(State state) {
         this(state, "");
     }
 
     public ExecuteResult(State state, String output) {
-        Preconditions.checkArgument(state != null, "state cannot be null");
-        this.state = state;
-        this.output = output;
-        this.throwable = null;
+        this(state, output, null);
     }
 
-    public ExecuteResult(State state, Throwable throwable) {
+    public ExecuteResult(State state, String output, Throwable throwable) {
         Preconditions.checkArgument(state != null, "state cannot be null");
         this.state = state;
+        this.output = output;
         this.throwable = throwable;
-        this.output = throwable.getMessage();
     }
 
-    public ExecuteResult(Throwable throwable) {
-        this(throwable, throwable.getMessage());
+    public static ExecuteResult createSucceed() {
+        return new ExecuteResult(State.SUCCEED, "succeed");
     }
 
-    public ExecuteResult(Throwable throwable, String output) {
-        this.state = State.ERROR;
-        this.throwable = throwable;
-        this.output = output;
+    public static ExecuteResult createError(Throwable throwable) {
+        Preconditions.checkArgument(throwable != null, "throwable cannot be null");
+        return new ExecuteResult(State.ERROR, throwable.getLocalizedMessage(), throwable);
+    }
+
+    public static ExecuteResult createFailed(Throwable throwable) {
+        Preconditions.checkArgument(throwable != null, "throwable cannot be null");
+        return new ExecuteResult(State.FAILED, throwable.getLocalizedMessage(), throwable);
     }
 
     public State state() {

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/engine-mr/src/main/java/org/apache/kylin/engine/mr/CubingJob.java
----------------------------------------------------------------------
diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/CubingJob.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/CubingJob.java
index 3fb1650..4e7bcdd 100644
--- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/CubingJob.java
+++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/CubingJob.java
@@ -91,7 +91,7 @@ public class CubingJob extends DefaultChainedExecutable {
     }
 
     //32MB per block created by the first step
-    public static final long MIN_SOURCE_SIZE = 33554432L;
+    private static final long MIN_SOURCE_SIZE = 33554432L;
 
     // KEYS of Output.extraInfo map, info passed across job steps
     public static final String SOURCE_RECORD_COUNT = "sourceRecordCount";

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/HadoopShellExecutable.java
----------------------------------------------------------------------
diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/HadoopShellExecutable.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/HadoopShellExecutable.java
index ddbcc99..10a6e8c 100644
--- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/HadoopShellExecutable.java
+++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/HadoopShellExecutable.java
@@ -70,13 +70,13 @@ public class HadoopShellExecutable extends AbstractExecutable {
             }
             log.append("result code:").append(result);
             return result == 0 ? new ExecuteResult(ExecuteResult.State.SUCCEED, log.toString())
-                    : new ExecuteResult(ExecuteResult.State.FAILED, new HadoopShellException(log.toString()));
+                    : ExecuteResult.createFailed(new HadoopShellException(log.toString()));
         } catch (ReflectiveOperationException e) {
             logger.error("error getMapReduceJobClass, class name:" + getParam(KEY_MR_JOB), e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         } catch (Exception e) {
             logger.error("error execute " + this.toString(), e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/MapReduceExecutable.java
----------------------------------------------------------------------
diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/MapReduceExecutable.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/MapReduceExecutable.java
index 27124b3..ca1311d 100755
--- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/MapReduceExecutable.java
+++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/MapReduceExecutable.java
@@ -139,7 +139,7 @@ public class MapReduceExecutable extends AbstractExecutable {
                     ex.printStackTrace(new PrintWriter(stringWriter));
                     log.append(stringWriter.toString()).append("\n");
                     log.append("result code:").append(2);
-                    return new ExecuteResult(ex, log.toString());
+                    return new ExecuteResult(ExecuteResult.State.ERROR, log.toString(), ex);
                 }
                 job = hadoopJob.getJob();
             }
@@ -168,7 +168,7 @@ public class MapReduceExecutable extends AbstractExecutable {
                     if (status == JobStepStatusEnum.FINISHED) {
                         return new ExecuteResult(ExecuteResult.State.SUCCEED, output.toString());
                     } else {
-                        return new ExecuteResult(ExecuteResult.State.FAILED, new MapReduceException(output.toString()));
+                        return ExecuteResult.createFailed(new MapReduceException(output.toString()));
                     }
                 }
                 Thread.sleep(context.getConfig().getYarnStatusCheckIntervalSeconds() * 1000L);
@@ -191,10 +191,10 @@ public class MapReduceExecutable extends AbstractExecutable {
 
         } catch (ReflectiveOperationException e) {
             logger.error("error getMapReduceJobClass, class name:" + getParam(KEY_MR_JOB), e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         } catch (Exception e) {
             logger.error("error execute " + this.toString(), e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/MergeDictionaryStep.java
----------------------------------------------------------------------
diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/MergeDictionaryStep.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/MergeDictionaryStep.java
index 87e95d8..3a1f852 100644
--- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/MergeDictionaryStep.java
+++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/MergeDictionaryStep.java
@@ -69,10 +69,10 @@ public class MergeDictionaryStep extends AbstractExecutable {
             CubeUpdate cubeBuilder = new CubeUpdate(cube);
             cubeBuilder.setToUpdateSegs(newSegment);
             mgr.updateCube(cubeBuilder);
-            return new ExecuteResult(ExecuteResult.State.SUCCEED, "succeed");
+            return ExecuteResult.createSucceed();
         } catch (IOException e) {
             logger.error("fail to merge dictionary or lookup snapshots", e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/MergeStatisticsStep.java
----------------------------------------------------------------------
diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/MergeStatisticsStep.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/MergeStatisticsStep.java
index ccebbb2..a927c1f 100644
--- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/MergeStatisticsStep.java
+++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/MergeStatisticsStep.java
@@ -133,10 +133,10 @@ public class MergeStatisticsStep extends AbstractExecutable {
                 IOUtils.closeStream(is);
             }
 
-            return new ExecuteResult(ExecuteResult.State.SUCCEED, "succeed");
+            return ExecuteResult.createSucceed();
         } catch (IOException e) {
             logger.error("fail to merge cuboid statistics", e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/SaveStatisticsStep.java
----------------------------------------------------------------------
diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/SaveStatisticsStep.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/SaveStatisticsStep.java
index f18de0e..2196f09 100644
--- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/SaveStatisticsStep.java
+++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/SaveStatisticsStep.java
@@ -77,10 +77,10 @@ public class SaveStatisticsStep extends AbstractExecutable {
                 IOUtils.closeStream(is);
             }
 
-            return new ExecuteResult(ExecuteResult.State.SUCCEED, "succeed");
+            return ExecuteResult.createSucceed();
         } catch (IOException e) {
             logger.error("fail to save cuboid statistics", e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterBuildStep.java
----------------------------------------------------------------------
diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterBuildStep.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterBuildStep.java
index a53071a..7d36643 100644
--- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterBuildStep.java
+++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterBuildStep.java
@@ -76,7 +76,7 @@ public class UpdateCubeInfoAfterBuildStep extends AbstractExecutable {
             return new ExecuteResult(ExecuteResult.State.SUCCEED, "succeed");
         } catch (IOException e) {
             logger.error("fail to update cube after build", e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterMergeStep.java
----------------------------------------------------------------------
diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterMergeStep.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterMergeStep.java
index 86e6080..3185bec 100644
--- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterMergeStep.java
+++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterMergeStep.java
@@ -52,7 +52,7 @@ public class UpdateCubeInfoAfterMergeStep extends AbstractExecutable {
 
         CubeSegment mergedSegment = cube.getSegmentById(CubingExecutableUtil.getSegmentId(this.getParams()));
         if (mergedSegment == null) {
-            return new ExecuteResult(ExecuteResult.State.FAILED, new SegmentNotFoundException(
+            return ExecuteResult.createFailed(new SegmentNotFoundException(
                     "there is no segment with id:" + CubingExecutableUtil.getSegmentId(this.getParams())));
         }
 
@@ -62,8 +62,7 @@ public class UpdateCubeInfoAfterMergeStep extends AbstractExecutable {
         // collect source statistics
         List<String> mergingSegmentIds = CubingExecutableUtil.getMergingSegmentIds(this.getParams());
         if (mergingSegmentIds.isEmpty()) {
-            return new ExecuteResult(ExecuteResult.State.FAILED,
-                    new SegmentNotFoundException("there are no merging segments"));
+            return ExecuteResult.createFailed(new SegmentNotFoundException("there are no merging segments"));
         }
         long sourceCount = 0L;
         long sourceSize = 0L;
@@ -85,7 +84,7 @@ public class UpdateCubeInfoAfterMergeStep extends AbstractExecutable {
             return new ExecuteResult(ExecuteResult.State.SUCCEED);
         } catch (IOException e) {
             logger.error("fail to update cube after merge", e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/engine-spark/src/main/java/org/apache/kylin/engine/spark/SparkExecutable.java
----------------------------------------------------------------------
diff --git a/engine-spark/src/main/java/org/apache/kylin/engine/spark/SparkExecutable.java b/engine-spark/src/main/java/org/apache/kylin/engine/spark/SparkExecutable.java
index f63e999..69232ba 100644
--- a/engine-spark/src/main/java/org/apache/kylin/engine/spark/SparkExecutable.java
+++ b/engine-spark/src/main/java/org/apache/kylin/engine/spark/SparkExecutable.java
@@ -154,7 +154,7 @@ public class SparkExecutable extends AbstractExecutable {
             return new ExecuteResult(ExecuteResult.State.SUCCEED, patternedLogger.getBufferedLog());
         } catch (Exception e) {
             logger.error("error run spark job:", e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/server-base/src/main/java/org/apache/kylin/rest/metrics/QueryMetricsFacade.java
----------------------------------------------------------------------
diff --git a/server-base/src/main/java/org/apache/kylin/rest/metrics/QueryMetricsFacade.java b/server-base/src/main/java/org/apache/kylin/rest/metrics/QueryMetricsFacade.java
index 4e09f6f..18ef867 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/metrics/QueryMetricsFacade.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/metrics/QueryMetricsFacade.java
@@ -28,6 +28,7 @@ import org.apache.hadoop.metrics2.MetricsException;
 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.QueryContext;
+import org.apache.kylin.metadata.project.ProjectInstance;
 import org.apache.kylin.metrics.MetricsManager;
 import org.apache.kylin.metrics.lib.impl.RecordEvent;
 import org.apache.kylin.metrics.lib.impl.TimedRecordEvent;
@@ -102,7 +103,8 @@ public class QueryMetricsFacade {
             RecordEvent rpcMetricsEvent = new TimedRecordEvent(
                     KylinConfig.getInstanceFromEnv().getKylinMetricsSubjectQueryRpcCall());
             setRPCWrapper(rpcMetricsEvent, //
-                    sqlRequest.getProject(), entry.getRealizationName(), entry.getRpcServer(), entry.getException());
+                    ProjectInstance.getNormalizedProjectName(sqlRequest.getProject()), entry.getRealizationName(),
+                    entry.getRpcServer(), entry.getException());
             setRPCStats(rpcMetricsEvent, //
                     entry.getCallTimeMs(), entry.getSkippedRows(), entry.getScannedRows(), entry.getReturnedRows(),
                     entry.getAggregatedRows());
@@ -115,7 +117,8 @@ public class QueryMetricsFacade {
                     KylinConfig.getInstanceFromEnv().getKylinMetricsSubjectQuery());
             setQueryWrapper(queryMetricsEvent, //
                     user, sqlHashCode, sqlResponse.isStorageCacheUsed() ? "CACHE" : contextEntry.getQueryType(),
-                    sqlRequest.getProject(), contextEntry.getRealization(), contextEntry.getRealizationType(),
+                    ProjectInstance.getNormalizedProjectName(sqlRequest.getProject()), contextEntry.getRealization(),
+                    contextEntry.getRealizationType(),
                     sqlResponse.getThrowable());
 
             long totalStorageReturnCount = 0L;
@@ -126,9 +129,9 @@ public class QueryMetricsFacade {
                             KylinConfig.getInstanceFromEnv().getKylinMetricsSubjectQueryCube());
 
                     setCubeWrapper(cubeSegmentMetricsEvent, //
-                            sqlRequest.getProject(), segmentEntry.getCubeName(), segmentEntry.getSegmentName(),
-                            segmentEntry.getSourceCuboidId(), segmentEntry.getTargetCuboidId(),
-                            segmentEntry.getFilterMask());
+                            ProjectInstance.getNormalizedProjectName(sqlRequest.getProject()),
+                            segmentEntry.getCubeName(), segmentEntry.getSegmentName(), segmentEntry.getSourceCuboidId(),
+                            segmentEntry.getTargetCuboidId(), segmentEntry.getFilterMask());
 
                     setCubeStats(cubeSegmentMetricsEvent, //
                             segmentEntry.getCallCount(), segmentEntry.getCallTimeSum(), segmentEntry.getCallTimeMax(),

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/server-base/src/main/java/org/apache/kylin/rest/request/SQLRequest.java
----------------------------------------------------------------------
diff --git a/server-base/src/main/java/org/apache/kylin/rest/request/SQLRequest.java b/server-base/src/main/java/org/apache/kylin/rest/request/SQLRequest.java
index 85a7564..a98aba7 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/request/SQLRequest.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/request/SQLRequest.java
@@ -53,7 +53,7 @@ public class SQLRequest implements Serializable {
     }
 
     public String getProject() {
-        return norm(project);
+        return project;
     }
 
     public void setProject(String project) {
@@ -114,13 +114,6 @@ public class SQLRequest implements Serializable {
         return cacheKey;
     }
 
-    public static String norm(String str) {
-        if (str == null) {
-            return null;
-        }
-        return str.toUpperCase();
-    }
-
     @Override
     public boolean equals(Object o) {
         if (this == o)

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/server-base/src/main/java/org/apache/kylin/rest/response/SQLResponse.java
----------------------------------------------------------------------
diff --git a/server-base/src/main/java/org/apache/kylin/rest/response/SQLResponse.java b/server-base/src/main/java/org/apache/kylin/rest/response/SQLResponse.java
index ee85162..a41e21b 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/response/SQLResponse.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/response/SQLResponse.java
@@ -24,6 +24,8 @@ import java.util.List;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.kylin.common.QueryContext;
 import org.apache.kylin.metadata.querymeta.SelectedColumnMeta;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.common.collect.Lists;
@@ -31,8 +33,7 @@ import com.google.common.collect.Lists;
 public class SQLResponse implements Serializable {
     protected static final long serialVersionUID = 1L;
 
-    // private static final Logger logger =
-    // LoggerFactory.getLogger(SQLResponse.class);
+    private static final Logger logger = LoggerFactory.getLogger(SQLResponse.class);
 
     // the data type for each column
     protected List<SelectedColumnMeta> columnMetas;
@@ -211,7 +212,7 @@ public class SQLResponse implements Serializable {
             return queryStatistics == null ? Lists.<QueryContext.CubeSegmentStatisticsResult> newArrayList()
                     : (List<QueryContext.CubeSegmentStatisticsResult>) SerializationUtils.deserialize(queryStatistics);
         } catch (Exception e) { // deserialize exception should not block query
-            System.out.println("Error while deserialize queryStatistics due to " + e);
+            logger.warn("Error while deserialize queryStatistics due to " + e);
             return Lists.newArrayList();
         }
     }
@@ -222,7 +223,7 @@ public class SQLResponse implements Serializable {
             this.queryStatistics = cubeSegmentStatisticsList == null ? null
                     : SerializationUtils.serialize((Serializable) cubeSegmentStatisticsList);
         } catch (Exception e) { // serialize exception should not block query
-            System.out.println("Error while serialize queryStatistics due to " + e);
+            logger.warn("Error while serialize queryStatistics due to " + e);
             this.queryStatistics = null;
         }
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/source-hive/src/main/java/org/apache/kylin/source/hive/CreateFlatHiveTableStep.java
----------------------------------------------------------------------
diff --git a/source-hive/src/main/java/org/apache/kylin/source/hive/CreateFlatHiveTableStep.java b/source-hive/src/main/java/org/apache/kylin/source/hive/CreateFlatHiveTableStep.java
index 476068b..c768988 100644
--- a/source-hive/src/main/java/org/apache/kylin/source/hive/CreateFlatHiveTableStep.java
+++ b/source-hive/src/main/java/org/apache/kylin/source/hive/CreateFlatHiveTableStep.java
@@ -73,7 +73,7 @@ public class CreateFlatHiveTableStep extends AbstractExecutable {
 
         } catch (Exception e) {
             logger.error("job:" + getId() + " execute finished with exception", e);
-            return new ExecuteResult(e, stepLogger.getBufferedLog());
+            return new ExecuteResult(ExecuteResult.State.ERROR, stepLogger.getBufferedLog(), e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/source-hive/src/main/java/org/apache/kylin/source/hive/HiveMRInput.java
----------------------------------------------------------------------
diff --git a/source-hive/src/main/java/org/apache/kylin/source/hive/HiveMRInput.java b/source-hive/src/main/java/org/apache/kylin/source/hive/HiveMRInput.java
index 38b8794..0041441 100644
--- a/source-hive/src/main/java/org/apache/kylin/source/hive/HiveMRInput.java
+++ b/source-hive/src/main/java/org/apache/kylin/source/hive/HiveMRInput.java
@@ -350,7 +350,7 @@ public class HiveMRInput implements IMRInput {
 
             } catch (Exception e) {
                 logger.error("job:" + getId() + " execute finished with exception", e);
-                return new ExecuteResult(e, stepLogger.getBufferedLog());
+                return new ExecuteResult(ExecuteResult.State.ERROR, stepLogger.getBufferedLog(), e);
             }
         }
 
@@ -392,7 +392,7 @@ public class HiveMRInput implements IMRInput {
                 //output.append(cleanUpHiveViewIntermediateTable(config));
             } catch (IOException e) {
                 logger.error("job:" + getId() + " execute finished with exception", e);
-                return new ExecuteResult(e, e.getMessage());
+                return ExecuteResult.createError(e);
             }
 
             return new ExecuteResult(ExecuteResult.State.SUCCEED, output.toString());

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/source-hive/src/main/java/org/apache/kylin/source/jdbc/CmdStep.java
----------------------------------------------------------------------
diff --git a/source-hive/src/main/java/org/apache/kylin/source/jdbc/CmdStep.java b/source-hive/src/main/java/org/apache/kylin/source/jdbc/CmdStep.java
index 4025457..09895f9 100644
--- a/source-hive/src/main/java/org/apache/kylin/source/jdbc/CmdStep.java
+++ b/source-hive/src/main/java/org/apache/kylin/source/jdbc/CmdStep.java
@@ -62,7 +62,7 @@ public class CmdStep extends AbstractExecutable {
 
         } catch (Exception e) {
             logger.error("job:" + getId() + " execute finished with exception", e);
-            return new ExecuteResult(e, stepLogger.getBufferedLog());
+            return new ExecuteResult(ExecuteResult.State.ERROR, stepLogger.getBufferedLog(), e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/source-hive/src/main/java/org/apache/kylin/source/jdbc/HiveCmdStep.java
----------------------------------------------------------------------
diff --git a/source-hive/src/main/java/org/apache/kylin/source/jdbc/HiveCmdStep.java b/source-hive/src/main/java/org/apache/kylin/source/jdbc/HiveCmdStep.java
index a67dc37..073e965 100644
--- a/source-hive/src/main/java/org/apache/kylin/source/jdbc/HiveCmdStep.java
+++ b/source-hive/src/main/java/org/apache/kylin/source/jdbc/HiveCmdStep.java
@@ -62,7 +62,7 @@ public class HiveCmdStep extends AbstractExecutable {
 
         } catch (Exception e) {
             logger.error("job:" + getId() + " execute finished with exception", e);
-            return new ExecuteResult(e, stepLogger.getBufferedLog());
+            return new ExecuteResult(ExecuteResult.State.ERROR, stepLogger.getBufferedLog(), e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/source-kafka/src/main/java/org/apache/kylin/source/kafka/KafkaMRInput.java
----------------------------------------------------------------------
diff --git a/source-kafka/src/main/java/org/apache/kylin/source/kafka/KafkaMRInput.java b/source-kafka/src/main/java/org/apache/kylin/source/kafka/KafkaMRInput.java
index c6914c3..529e8b1 100644
--- a/source-kafka/src/main/java/org/apache/kylin/source/kafka/KafkaMRInput.java
+++ b/source-kafka/src/main/java/org/apache/kylin/source/kafka/KafkaMRInput.java
@@ -222,7 +222,7 @@ public class KafkaMRInput implements IMRInput {
                 rmdirOnHDFS(getDataPath());
             } catch (IOException e) {
                 logger.error("job:" + getId() + " execute finished with exception", e);
-                return new ExecuteResult(e, e.getMessage());
+                return ExecuteResult.createError(e);
             }
 
             return new ExecuteResult(ExecuteResult.State.SUCCEED, "HDFS path " + getDataPath() + " is dropped.\n");

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/source-kafka/src/main/java/org/apache/kylin/source/kafka/job/MergeOffsetStep.java
----------------------------------------------------------------------
diff --git a/source-kafka/src/main/java/org/apache/kylin/source/kafka/job/MergeOffsetStep.java b/source-kafka/src/main/java/org/apache/kylin/source/kafka/job/MergeOffsetStep.java
index 406d92e..8139342 100644
--- a/source-kafka/src/main/java/org/apache/kylin/source/kafka/job/MergeOffsetStep.java
+++ b/source-kafka/src/main/java/org/apache/kylin/source/kafka/job/MergeOffsetStep.java
@@ -76,7 +76,7 @@ public class MergeOffsetStep extends AbstractExecutable {
             return new ExecuteResult(ExecuteResult.State.SUCCEED, "succeed");
         } catch (IOException e) {
             logger.error("fail to update cube segment offset", e);
-            return new ExecuteResult(e, e.getLocalizedMessage());
+            return ExecuteResult.createError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/DeprecatedGCStep.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/DeprecatedGCStep.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/DeprecatedGCStep.java
index c454e60..8d07a1c 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/DeprecatedGCStep.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/DeprecatedGCStep.java
@@ -78,7 +78,7 @@ public class DeprecatedGCStep extends AbstractExecutable {
         } catch (IOException e) {
             logger.error("job:" + getId() + " execute finished with exception", e);
             output.append("\n").append(e.getLocalizedMessage());
-            return new ExecuteResult(e, output.toString());
+            return new ExecuteResult(ExecuteResult.State.ERROR, output.toString(), e);
         }
 
         return new ExecuteResult(ExecuteResult.State.SUCCEED, output.toString());

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/HDFSPathGarbageCollectionStep.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/HDFSPathGarbageCollectionStep.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/HDFSPathGarbageCollectionStep.java
index b9b5fe6..3ec27d4 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/HDFSPathGarbageCollectionStep.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/HDFSPathGarbageCollectionStep.java
@@ -67,7 +67,7 @@ public class HDFSPathGarbageCollectionStep extends AbstractExecutable {
         } catch (IOException e) {
             logger.error("job:" + getId() + " execute finished with exception", e);
             output.append("\n").append(e.getLocalizedMessage());
-            return new ExecuteResult(e, output.toString());
+            return new ExecuteResult(ExecuteResult.State.ERROR, output.toString(), e);
         }
 
         return new ExecuteResult(ExecuteResult.State.SUCCEED, output.toString());

http://git-wip-us.apache.org/repos/asf/kylin/blob/2411470d/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/MergeGCStep.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/MergeGCStep.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/MergeGCStep.java
index 7371e08..1bead67 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/MergeGCStep.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/MergeGCStep.java
@@ -95,7 +95,8 @@ public class MergeGCStep extends AbstractExecutable {
             } catch (IOException e) {
                 output.append("Got error when drop HBase table, exiting... \n");
                 // This should not block the merge job; Orphans should be cleaned up in StorageCleanupJob
-                return new ExecuteResult(e, output.append(e.getLocalizedMessage()).toString());
+                return new ExecuteResult(ExecuteResult.State.ERROR, output.append(e.getLocalizedMessage()).toString(),
+                        e);
             } finally {
                 if (admin != null)
                     try {