From 2c6b03bfbb04d945abb327b35041dea6de7570d2 Mon Sep 17 00:00:00 2001 From: peng-yongsheng <8082209@qq.com> Date: Mon, 5 Feb 2018 19:21:39 +0800 Subject: [PATCH] Provide the getServiceSLATrend query. --- .../storage/dao/ui/IServiceMetricUIDAO.java | 4 ++- .../collector/storage/ui/common/SLATrend.java | 8 +++++ .../es/dao/ui/ServiceMetricEsUIDAO.java | 26 +++++++++++++++- .../h2/dao/ui/ServiceMetricH2UIDAO.java | 30 ++++++++++++++++++- .../apm/collector/ui/query/ServiceQuery.java | 6 ++-- .../ui/service/ServiceNameService.java | 10 ++++++- 6 files changed, 78 insertions(+), 6 deletions(-) diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IServiceMetricUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IServiceMetricUIDAO.java index 926d18dca..265d66cbf 100644 --- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IServiceMetricUIDAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IServiceMetricUIDAO.java @@ -27,5 +27,7 @@ import org.apache.skywalking.apm.collector.storage.utils.DurationPoint; * @author peng-yongsheng */ public interface IServiceMetricUIDAO extends DAO { - List load(int serviceId, Step step, List durationPoints); + List getServiceResponseTimeTrend(int serviceId, Step step, List durationPoints); + + List getServiceSLATrend(int serviceId, Step step, List durationPoints); } diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/common/SLATrend.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/common/SLATrend.java index a6204646b..ed75ddac8 100644 --- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/common/SLATrend.java +++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/common/SLATrend.java @@ -25,4 +25,12 @@ import java.util.List; */ public class SLATrend { private List trendList; + + public List getTrendList() { + return trendList; + } + + public void setTrendList(List trendList) { + this.trendList = trendList; + } } diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ServiceMetricEsUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ServiceMetricEsUIDAO.java index f6eea47af..812ba2506 100644 --- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ServiceMetricEsUIDAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ServiceMetricEsUIDAO.java @@ -42,7 +42,8 @@ public class ServiceMetricEsUIDAO extends EsDAO implements IServiceMetricUIDAO { super(client); } - @Override public List load(int serviceId, Step step, List durationPoints) { + @Override + public List getServiceResponseTimeTrend(int serviceId, Step step, List durationPoints) { MultiGetRequestBuilder prepareMultiGet = getClient().prepareMultiGet(); String tableName = TimePyramidTableNameBuilder.build(step, ServiceMetricTable.TABLE); @@ -66,4 +67,27 @@ public class ServiceMetricEsUIDAO extends EsDAO implements IServiceMetricUIDAO { } return trends; } + + @Override public List getServiceSLATrend(int serviceId, Step step, List durationPoints) { + MultiGetRequestBuilder prepareMultiGet = getClient().prepareMultiGet(); + String tableName = TimePyramidTableNameBuilder.build(step, ServiceMetricTable.TABLE); + + durationPoints.forEach(durationPoint -> { + String id = durationPoint.getPoint() + Const.ID_SPLIT + serviceId + Const.ID_SPLIT + MetricSource.Callee.getValue(); + prepareMultiGet.add(tableName, ServiceMetricTable.TABLE_TYPE, id); + }); + + List trends = new LinkedList<>(); + MultiGetResponse multiGetResponse = prepareMultiGet.get(); + for (MultiGetItemResponse response : multiGetResponse.getResponses()) { + if (response.getResponse().isExists()) { + long calls = ((Number)response.getResponse().getSource().get(ServiceMetricTable.COLUMN_TRANSACTION_CALLS)).longValue(); + long errorCalls = ((Number)response.getResponse().getSource().get(ServiceMetricTable.COLUMN_TRANSACTION_ERROR_CALLS)).longValue(); + trends.add((int)(((calls - errorCalls) / calls)) * 10000); + } else { + trends.add(10000); + } + } + return trends; + } } diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ServiceMetricH2UIDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ServiceMetricH2UIDAO.java index 7ff3bc0e8..1fb3c4634 100644 --- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ServiceMetricH2UIDAO.java +++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ServiceMetricH2UIDAO.java @@ -47,7 +47,8 @@ public class ServiceMetricH2UIDAO extends H2DAO implements IServiceMetricUIDAO { super(client); } - @Override public List load(int serviceId, Step step, List durationPoints) { + @Override + public List getServiceResponseTimeTrend(int serviceId, Step step, List durationPoints) { String tableName = TimePyramidTableNameBuilder.build(step, ServiceMetricTable.TABLE); H2Client client = getClient(); @@ -75,4 +76,31 @@ public class ServiceMetricH2UIDAO extends H2DAO implements IServiceMetricUIDAO { return trends; } + + @Override public List getServiceSLATrend(int serviceId, Step step, List durationPoints) { + String tableName = TimePyramidTableNameBuilder.build(step, ServiceMetricTable.TABLE); + + H2Client client = getClient(); + String dynamicSql = "select * from {0} where {1} = ?"; + String sql = SqlBuilder.buildSql(dynamicSql, tableName, ServiceMetricTable.COLUMN_ID); + + List trends = new LinkedList<>(); + durationPoints.forEach(durationPoint -> { + String id = durationPoint.getPoint() + Const.ID_SPLIT + serviceId + Const.ID_SPLIT + MetricSource.Callee.getValue(); + + try (ResultSet rs = client.executeQuery(sql, new String[] {id})) { + if (rs.next()) { + long calls = rs.getLong(ServiceMetricTable.COLUMN_TRANSACTION_CALLS); + long errorCalls = rs.getLong(ServiceMetricTable.COLUMN_TRANSACTION_ERROR_CALLS); + trends.add((int)(((calls - errorCalls) / calls)) * 10000); + } else { + trends.add(10000); + } + } catch (SQLException | H2ClientException e) { + logger.error(e.getMessage(), e); + } + }); + + return trends; + } } diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/ServiceQuery.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/ServiceQuery.java index bea694460..4f6c0aed4 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/ServiceQuery.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/ServiceQuery.java @@ -65,8 +65,10 @@ public class ServiceQuery implements Query { return null; } - public SLATrend getServiceSLATrend(int serviceId, Duration duration) { - return null; + public SLATrend getServiceSLATrend(int serviceId, Duration duration) throws ParseException { + long start = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart()); + long end = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd()); + return getServiceNameService().getServiceSLATrend(serviceId, duration.getStep(), start, end); } public Topology getServiceTopology(int serviceId, Duration duration) { diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceNameService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceNameService.java index d25eedd8e..a4de32ea7 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceNameService.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceNameService.java @@ -25,6 +25,7 @@ import org.apache.skywalking.apm.collector.storage.StorageModule; import org.apache.skywalking.apm.collector.storage.dao.ui.IServiceMetricUIDAO; import org.apache.skywalking.apm.collector.storage.dao.ui.IServiceNameServiceUIDAO; import org.apache.skywalking.apm.collector.storage.ui.common.ResponseTimeTrend; +import org.apache.skywalking.apm.collector.storage.ui.common.SLATrend; import org.apache.skywalking.apm.collector.storage.ui.common.Step; import org.apache.skywalking.apm.collector.storage.ui.service.ServiceInfo; import org.apache.skywalking.apm.collector.storage.utils.DurationPoint; @@ -55,7 +56,14 @@ public class ServiceNameService { long end) throws ParseException { ResponseTimeTrend responseTimeTrend = new ResponseTimeTrend(); List durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, start, end); - responseTimeTrend.setTrendList(serviceMetricUIDAO.load(serviceId, step, durationPoints)); + responseTimeTrend.setTrendList(serviceMetricUIDAO.getServiceResponseTimeTrend(serviceId, step, durationPoints)); return responseTimeTrend; } + + public SLATrend getServiceSLATrend(int serviceId, Step step, long start, long end) throws ParseException { + SLATrend slaTrend = new SLATrend(); + List durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, start, end); + slaTrend.setTrendList(serviceMetricUIDAO.getServiceSLATrend(serviceId, step, durationPoints)); + return slaTrend; + } }