This is an automated email from the ASF dual-hosted git repository. nju_yaho pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 4db6a37c7220c122cedb9fac1a2c735f10e27226 Author: kyotoYaho <nju_y...@apache.org> AuthorDate: Wed Dec 19 10:40:33 2018 +0800 KYLIN-3540 refactor the interface of querying on SYSTEM project --- .../kylin/rest/controller/DashboardController.java | 66 ++++++++++++---------- .../org/apache/kylin/rest/service/CubeService.java | 27 +++------ .../kylin/rest/service/DashboardService.java | 34 ++++++----- .../apache/kylin/rest/service/QueryService.java | 14 ++++- 4 files changed, 73 insertions(+), 68 deletions(-) diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/DashboardController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/DashboardController.java index ee9fdcd..846d6d3 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller/DashboardController.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller/DashboardController.java @@ -16,15 +16,12 @@ * limitations under the License. */ - package org.apache.kylin.rest.controller; import java.util.List; import org.apache.kylin.cube.CubeInstance; import org.apache.kylin.metadata.project.ProjectInstance; -import org.apache.kylin.metrics.MetricsManager; -import org.apache.kylin.rest.request.SQLRequest; import org.apache.kylin.rest.response.MetricsResponse; import org.apache.kylin.rest.response.SQLResponse; import org.apache.kylin.rest.service.CubeService; @@ -57,62 +54,69 @@ public class DashboardController extends BasicController { @RequestMapping(value = "/metric/cube", method = { RequestMethod.GET }) @ResponseBody - public MetricsResponse getCubeMetrics(@RequestParam(value = "projectName", required = false) String projectName, @RequestParam(value = "cubeName", required = false) String cubeName) { + public MetricsResponse getCubeMetrics(@RequestParam(value = "projectName", required = false) String projectName, + @RequestParam(value = "cubeName", required = false) String cubeName) { checkAuthorization(projectName); return dashboardService.getCubeMetrics(projectName, cubeName); } @RequestMapping(value = "/metric/query", method = RequestMethod.GET) @ResponseBody - public MetricsResponse getQueryMetrics(@RequestParam(value = "projectName", required = false) String projectName, @RequestParam(value = "cubeName", required = false) String cubeName, @RequestParam(value = "startTime") String startTime, @RequestParam(value = "endTime") String endTime) { + public MetricsResponse getQueryMetrics(@RequestParam(value = "projectName", required = false) String projectName, + @RequestParam(value = "cubeName", required = false) String cubeName, + @RequestParam(value = "startTime") String startTime, @RequestParam(value = "endTime") String endTime) { checkAuthorization(projectName); MetricsResponse queryMetrics = new MetricsResponse(); - SQLRequest sqlRequest = new SQLRequest(); - sqlRequest.setProject(MetricsManager.SYSTEM_PROJECT); String sql = dashboardService.getQueryMetricsSQL(startTime, endTime, projectName, cubeName); - sqlRequest.setSql(sql); - SQLResponse sqlResponse = queryService.doQueryWithCache(sqlRequest); - if(!sqlResponse.getIsException()){ - queryMetrics.increase("queryCount", dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(0))); - queryMetrics.increase("avgQueryLatency", dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(1))); - queryMetrics.increase("maxQueryLatency", dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(2))); - queryMetrics.increase("minQueryLatency", dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(3))); + SQLResponse sqlResponse = queryService.querySystemCube(sql); + if (!sqlResponse.getIsException()) { + queryMetrics.increase("queryCount", + dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(0))); + queryMetrics.increase("avgQueryLatency", + dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(1))); + queryMetrics.increase("maxQueryLatency", + dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(2))); + queryMetrics.increase("minQueryLatency", + dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(3))); } return queryMetrics; } @RequestMapping(value = "/metric/job", method = RequestMethod.GET) @ResponseBody - public MetricsResponse getJobMetrics(@RequestParam(value = "projectName", required = false) String projectName, @RequestParam(value = "cubeName", required = false) String cubeName, @RequestParam(value = "startTime") String startTime, @RequestParam(value = "endTime") String endTime) { + public MetricsResponse getJobMetrics(@RequestParam(value = "projectName", required = false) String projectName, + @RequestParam(value = "cubeName", required = false) String cubeName, + @RequestParam(value = "startTime") String startTime, @RequestParam(value = "endTime") String endTime) { checkAuthorization(projectName); MetricsResponse jobMetrics = new MetricsResponse(); - SQLRequest sqlRequest = new SQLRequest(); - sqlRequest.setProject(MetricsManager.SYSTEM_PROJECT); String sql = dashboardService.getJobMetricsSQL(startTime, endTime, projectName, cubeName); - sqlRequest.setSql(sql); - SQLResponse sqlResponse = queryService.doQueryWithCache(sqlRequest); - if(!sqlResponse.getIsException()){ + SQLResponse sqlResponse = queryService.querySystemCube(sql); + if (!sqlResponse.getIsException()) { jobMetrics.increase("jobCount", dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(0))); - jobMetrics.increase("avgJobBuildTime", dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(1))); - jobMetrics.increase("maxJobBuildTime", dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(2))); - jobMetrics.increase("minJobBuildTime", dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(3))); + jobMetrics.increase("avgJobBuildTime", + dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(1))); + jobMetrics.increase("maxJobBuildTime", + dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(2))); + jobMetrics.increase("minJobBuildTime", + dashboardService.getMetricValue(sqlResponse.getResults().get(0).get(3))); } return jobMetrics; } @RequestMapping(value = "/chart/{category}/{metric}/{dimension}", method = RequestMethod.GET) @ResponseBody - public MetricsResponse getChartData(@PathVariable String dimension, @PathVariable String metric, @PathVariable String category, @RequestParam(value = "projectName", required = false) String projectName, @RequestParam(value = "cubeName", required = false) String cubeName, @RequestParam(value = "startTime") String startTime, @RequestParam(value = "endTime") String endTime) { + public MetricsResponse getChartData(@PathVariable String dimension, @PathVariable String metric, + @PathVariable String category, @RequestParam(value = "projectName", required = false) String projectName, + @RequestParam(value = "cubeName", required = false) String cubeName, + @RequestParam(value = "startTime") String startTime, @RequestParam(value = "endTime") String endTime) { checkAuthorization(projectName); - SQLRequest sqlRequest = new SQLRequest(); - sqlRequest.setProject(MetricsManager.SYSTEM_PROJECT); - String sql = dashboardService.getChartSQL(startTime, endTime, projectName, cubeName, dimension, metric, category); - sqlRequest.setSql(sql); - return dashboardService.transformChartData(queryService.doQueryWithCache(sqlRequest)); + String sql = dashboardService.getChartSQL(startTime, endTime, projectName, cubeName, dimension, metric, + category); + return dashboardService.transformChartData(queryService.querySystemCube(sql)); } - private void checkAuthorization(String projectName){ - if (projectName!=null && !projectName.isEmpty()) { + private void checkAuthorization(String projectName) { + if (projectName != null && !projectName.isEmpty()) { ProjectInstance project = dashboardService.getProjectManager().getProject(projectName); try { dashboardService.checkAuthorization(project); diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java index e24e9de..4944b58 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java @@ -65,7 +65,6 @@ import org.apache.kylin.metadata.project.ProjectManager; import org.apache.kylin.metadata.project.RealizationEntry; import org.apache.kylin.metadata.realization.RealizationStatusEnum; import org.apache.kylin.metadata.realization.RealizationType; -import org.apache.kylin.metrics.MetricsManager; import org.apache.kylin.metrics.property.QueryCubePropertyEnum; import org.apache.kylin.rest.constant.Constant; import org.apache.kylin.rest.exception.BadRequestException; @@ -74,7 +73,6 @@ import org.apache.kylin.rest.exception.InternalErrorException; import org.apache.kylin.rest.msg.Message; import org.apache.kylin.rest.msg.MsgPicker; import org.apache.kylin.rest.request.MetricsRequest; -import org.apache.kylin.rest.request.SQLRequest; import org.apache.kylin.rest.response.CubeInstanceResponse; import org.apache.kylin.rest.response.CuboidTreeResponse; import org.apache.kylin.rest.response.CuboidTreeResponse.NodeInfo; @@ -919,42 +917,32 @@ public class CubeService extends BasicService implements InitializingBean { } public Map<Long, Long> getCuboidHitFrequency(String cubeName, boolean isCuboidSource) { - SQLRequest sqlRequest = new SQLRequest(); - sqlRequest.setProject(MetricsManager.SYSTEM_PROJECT); - String cuboidColumn = QueryCubePropertyEnum.CUBOID_SOURCE.toString(); - if (!isCuboidSource) { - cuboidColumn = QueryCubePropertyEnum.CUBOID_TARGET.toString(); - } + String cuboidColumn = isCuboidSource ? QueryCubePropertyEnum.CUBOID_SOURCE.toString() + : QueryCubePropertyEnum.CUBOID_TARGET.toString(); String hitMeasure = QueryCubePropertyEnum.WEIGHT_PER_HIT.toString(); String table = getMetricsManager().getSystemTableFromSubject(getConfig().getKylinMetricsSubjectQueryCube()); String sql = "select " + cuboidColumn + ", sum(" + hitMeasure + ")" // + " from " + table// - + " where " + QueryCubePropertyEnum.CUBE.toString() + " = '" + cubeName + "' " // + + " where " + QueryCubePropertyEnum.CUBE.toString() + " = '" + cubeName + "'" // + " group by " + cuboidColumn; - sqlRequest.setSql(sql); - List<List<String>> orgHitFrequency = queryService.doQueryWithCache(sqlRequest).getResults(); + List<List<String>> orgHitFrequency = queryService.querySystemCube(sql).getResults(); return formatQueryCount(orgHitFrequency); } public Map<Long, Map<Long, Long>> getCuboidRollingUpStats(String cubeName) { - SQLRequest sqlRequest = new SQLRequest(); - sqlRequest.setProject(MetricsManager.SYSTEM_PROJECT); String cuboidSource = QueryCubePropertyEnum.CUBOID_SOURCE.toString(); String cuboidTarget = QueryCubePropertyEnum.CUBOID_TARGET.toString(); String aggCount = QueryCubePropertyEnum.AGGR_COUNT.toString(); String table = getMetricsManager().getSystemTableFromSubject(getConfig().getKylinMetricsSubjectQueryCube()); - String sql = "select " + cuboidSource + ", " + cuboidTarget + ", sum(" + aggCount + ")/count(*)" // + String sql = "select " + cuboidSource + ", " + cuboidTarget + ", avg(" + aggCount + ")" // + " from " + table // + " where " + QueryCubePropertyEnum.CUBE.toString() + " = '" + cubeName + "' " // + " group by " + cuboidSource + ", " + cuboidTarget; - sqlRequest.setSql(sql); - List<List<String>> orgRollingUpCount = queryService.doQueryWithCache(sqlRequest).getResults(); + List<List<String>> orgRollingUpCount = queryService.querySystemCube(sql).getResults(); return formatRollingUpStats(orgRollingUpCount); } public Map<Long, Long> getCuboidQueryMatchCount(String cubeName) { - SQLRequest sqlRequest = new SQLRequest(); - sqlRequest.setProject(MetricsManager.SYSTEM_PROJECT); String cuboidSource = QueryCubePropertyEnum.CUBOID_SOURCE.toString(); String hitMeasure = QueryCubePropertyEnum.WEIGHT_PER_HIT.toString(); String table = getMetricsManager().getSystemTableFromSubject(getConfig().getKylinMetricsSubjectQueryCube()); @@ -963,8 +951,7 @@ public class CubeService extends BasicService implements InitializingBean { + " where " + QueryCubePropertyEnum.CUBE.toString() + " = '" + cubeName + "'" // + " and " + QueryCubePropertyEnum.IF_MATCH.toString() + " = true" // + " group by " + cuboidSource; - sqlRequest.setSql(sql); - List<List<String>> orgMatchHitFrequency = queryService.doQueryWithCache(sqlRequest).getResults(); + List<List<String>> orgMatchHitFrequency = queryService.querySystemCube(sql).getResults(); return formatQueryCount(orgMatchHitFrequency); } diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/DashboardService.java b/server-base/src/main/java/org/apache/kylin/rest/service/DashboardService.java index ec395e0..3910245 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/DashboardService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/DashboardService.java @@ -58,9 +58,12 @@ public class DashboardService extends BasicService { } private enum QueryDimensionEnum { - PROJECT(QueryPropertyEnum.PROJECT.toString()), CUBE(QueryPropertyEnum.REALIZATION.toString()), DAY( - TimePropertyEnum.DAY_DATE.toString()), WEEK( - TimePropertyEnum.WEEK_BEGIN_DATE.toString()), MONTH(TimePropertyEnum.MONTH.toString()); + PROJECT(QueryPropertyEnum.PROJECT.toString()), // + CUBE(QueryPropertyEnum.REALIZATION.toString()), // + DAY(TimePropertyEnum.DAY_DATE.toString()), // + WEEK(TimePropertyEnum.WEEK_BEGIN_DATE.toString()), // + MONTH(TimePropertyEnum.MONTH.toString()); + private final String sql; QueryDimensionEnum(String sql) { @@ -73,9 +76,12 @@ public class DashboardService extends BasicService { }; private enum JobDimensionEnum { - PROJECT(JobPropertyEnum.PROJECT.toString()), CUBE(JobPropertyEnum.CUBE.toString()), DAY( - TimePropertyEnum.DAY_DATE.toString()), WEEK( - TimePropertyEnum.WEEK_BEGIN_DATE.toString()), MONTH(TimePropertyEnum.MONTH.toString()); + PROJECT(JobPropertyEnum.PROJECT.toString()), // + CUBE(JobPropertyEnum.CUBE.toString()), // + DAY(TimePropertyEnum.DAY_DATE.toString()), // + WEEK(TimePropertyEnum.WEEK_BEGIN_DATE.toString()), // + MONTH(TimePropertyEnum.MONTH.toString()); + private final String sql; JobDimensionEnum(String sql) { @@ -88,10 +94,10 @@ public class DashboardService extends BasicService { }; private enum QueryMetricEnum { - QUERY_COUNT("count(*)"), AVG_QUERY_LATENCY("sum(" + QueryPropertyEnum.TIME_COST.toString() + ")/(count(" - + QueryPropertyEnum.TIME_COST.toString() + "))"), MAX_QUERY_LATENCY( - "max(" + QueryPropertyEnum.TIME_COST.toString() + ")"), MIN_QUERY_LATENCY( - "min(" + QueryPropertyEnum.TIME_COST.toString() + ")"); + QUERY_COUNT("count(*)"), // + AVG_QUERY_LATENCY("avg(" + QueryPropertyEnum.TIME_COST.toString() + ")"), // + MAX_QUERY_LATENCY("max(" + QueryPropertyEnum.TIME_COST.toString() + ")"), // + MIN_QUERY_LATENCY("min(" + QueryPropertyEnum.TIME_COST.toString() + ")"); private final String sql; @@ -105,10 +111,10 @@ public class DashboardService extends BasicService { } private enum JobMetricEnum { - JOB_COUNT("count(*)"), AVG_JOB_BUILD_TIME("sum(" + JobPropertyEnum.PER_BYTES_TIME_COST.toString() + ")/count(" - + JobPropertyEnum.PER_BYTES_TIME_COST + ")"), MAX_JOB_BUILD_TIME( - "max(" + JobPropertyEnum.PER_BYTES_TIME_COST.toString() + ")"), MIN_JOB_BUILD_TIME( - "min(" + JobPropertyEnum.PER_BYTES_TIME_COST.toString() + ")"); + JOB_COUNT("count(*)"), // + AVG_JOB_BUILD_TIME("avg(" + JobPropertyEnum.PER_BYTES_TIME_COST.toString() + ")"), // + MAX_JOB_BUILD_TIME("max(" + JobPropertyEnum.PER_BYTES_TIME_COST.toString() + ")"), // + MIN_JOB_BUILD_TIME("min(" + JobPropertyEnum.PER_BYTES_TIME_COST.toString() + ")"); private final String sql; diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java index 02bb804..da4fcb6 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java @@ -93,6 +93,7 @@ import org.apache.kylin.metadata.querymeta.SelectedColumnMeta; import org.apache.kylin.metadata.querymeta.TableMeta; import org.apache.kylin.metadata.querymeta.TableMetaWithType; import org.apache.kylin.metadata.realization.IRealization; +import org.apache.kylin.metrics.MetricsManager; import org.apache.kylin.query.QueryConnection; import org.apache.kylin.query.relnode.OLAPContext; import org.apache.kylin.query.util.PushDownUtil; @@ -352,6 +353,13 @@ public class QueryService extends BasicService { logger.info(stringBuilder.toString()); } + public SQLResponse querySystemCube(String sql) { + SQLRequest sqlRequest = new SQLRequest(); + sqlRequest.setProject(MetricsManager.SYSTEM_PROJECT); + sqlRequest.setSql(sql); + return doQueryWithCache(sqlRequest, false); + } + public SQLResponse doQueryWithCache(SQLRequest sqlRequest) { long t = System.currentTimeMillis(); aclEvaluate.checkProjectReadPermission(sqlRequest.getProject()); @@ -375,7 +383,8 @@ public class QueryService extends BasicService { // project not found ProjectManager mgr = ProjectManager.getInstance(KylinConfig.getInstanceFromEnv()); if (mgr.getProject(sqlRequest.getProject()) == null) { - throw new BadRequestException(String.format(Locale.ROOT, msg.getPROJECT_NOT_FOUND(), sqlRequest.getProject())); + throw new BadRequestException( + String.format(Locale.ROOT, msg.getPROJECT_NOT_FOUND(), sqlRequest.getProject())); } if (StringUtils.isBlank(sqlRequest.getSql())) { throw new BadRequestException(msg.getNULL_EMPTY_SQL()); @@ -1020,8 +1029,7 @@ public class QueryService extends BasicService { } private SQLResponse getPrepareOnlySqlResponse(String projectName, String correctedSql, Connection conn, - Boolean isPushDown, - List<List<String>> results, List<SelectedColumnMeta> columnMetas) throws SQLException { + Boolean isPushDown, List<List<String>> results, List<SelectedColumnMeta> columnMetas) throws SQLException { CalcitePrepareImpl.KYLIN_ONLY_PREPARE.set(true);