You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@skywalking.apache.org by pe...@apache.org on 2018/04/24 03:40:51 UTC

[incubator-skywalking] branch master updated: Refactor tps to cpm (#1105)

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

pengys pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new d28cc64  Refactor tps to cpm (#1105)
d28cc64 is described below

commit d28cc64f799245356364836a782a358cb338d37f
Author: Gao Hongtao <ha...@gmail.com>
AuthorDate: Mon Apr 23 22:40:49 2018 -0500

    Refactor tps to cpm (#1105)
    
    * Refactor tps to cpm
    
    * Change the implementation for new graphql protocol.
    
    * Add aggregate column named duration in GC metric table.
    
    * getGCTrend query finished.
    
    * Change between seconds to between minutes.
---
 .../grpc/provider/handler/mock/AgentDataMock.java  |  2 +-
 .../grpc/provider/handler/mock/JVMMetricMock.java  |  2 +
 .../jvm/define/service/IGCMetricService.java       |  2 +-
 .../jvm/provider/service/GCMetricService.java      |  3 +-
 .../worker/cpu/CpuDayMetricPersistenceWorker.java  |  2 +-
 .../worker/cpu/CpuHourMetricPersistenceWorker.java |  2 +-
 .../cpu/CpuMinuteMetricPersistenceWorker.java      |  2 +-
 .../cpu/CpuMonthMetricPersistenceWorker.java       |  2 +-
 .../worker/gc/GCDayMetricPersistenceWorker.java    |  5 +-
 .../worker/gc/GCHourMetricPersistenceWorker.java   |  2 +-
 .../jvm/provider/worker/gc/GCMetricCopy.java       |  1 +
 .../worker/gc/GCMinuteMetricPersistenceWorker.java |  2 +-
 .../worker/gc/GCMonthMetricPersistenceWorker.java  |  2 +-
 .../storage/dao/ui/IApplicationMetricUIDAO.java    | 10 +--
 .../collector/storage/dao/ui/IGCMetricUIDAO.java   | 36 +++++++--
 .../storage/dao/ui/IInstanceMetricUIDAO.java       | 10 +--
 .../storage/dao/ui/IServiceMetricUIDAO.java        | 12 ++-
 .../apm/collector/storage/table/jvm/GCMetric.java  | 16 ++--
 .../collector/storage/table/jvm/GCMetricTable.java |  2 +
 .../storage/ui/application/ApplicationNode.java    | 10 +--
 .../apm/collector/storage/ui/common/Call.java      | 10 +--
 ...licationTPS.java => ApplicationThroughput.java} | 12 +--
 .../collector/storage/ui/server/AppServerInfo.java | 10 +--
 .../apm/collector/storage/ui/server/GCTrend.java   | 47 ++++++++---
 .../storage/ui/service/ServiceMetric.java          | 10 +--
 .../apm/collector/storage/utils/DurationPoint.java |  8 +-
 .../dao/gc/AbstractGCMetricEsPersistenceDAO.java   |  8 +-
 .../es/dao/ui/ApplicationMetricEsUIDAO.java        | 41 +++++-----
 .../storage/es/dao/ui/GCMetricEsUIDAO.java         | 28 +++----
 .../storage/es/dao/ui/InstanceMetricEsUIDAO.java   | 42 ++++------
 .../storage/es/dao/ui/ServiceMetricEsUIDAO.java    |  6 +-
 .../define/gc/AbstractGCMetricEsTableDefine.java   |  1 +
 .../storage/h2/StorageModuleH2Provider.java        |  8 +-
 .../AbstractGCMetricH2PersistenceDAO.java          | 13 ++--
 .../{gcmp => gc}/GCDayMetricH2PersistenceDAO.java  |  2 +-
 .../{gcmp => gc}/GCHourMetricH2PersistenceDAO.java |  2 +-
 .../GCMinuteMetricH2PersistenceDAO.java            |  2 +-
 .../GCMonthMetricH2PersistenceDAO.java             |  2 +-
 .../h2/dao/ui/ApplicationMetricH2UIDAO.java        |  6 +-
 .../storage/h2/dao/ui/GCMetricH2UIDAO.java         | 29 ++++---
 .../storage/h2/dao/ui/InstanceMetricH2UIDAO.java   | 27 +++----
 .../storage/h2/dao/ui/ServiceMetricH2UIDAO.java    | 31 ++++----
 .../define/gc/AbstractGCMetricH2TableDefine.java   |  4 +-
 .../apm/collector/ui/query/OverViewLayerQuery.java |  4 +-
 .../apm/collector/ui/query/ServerQuery.java        | 22 ++----
 .../apm/collector/ui/query/ServiceQuery.java       |  4 +-
 .../collector/ui/service/ApplicationService.java   | 39 ++++------
 .../ui/service/ClusterTopologyService.java         | 18 ++---
 ...BetweenService.java => DateBetweenService.java} | 34 ++++++--
 .../apm/collector/ui/service/ServerService.java    | 56 ++++++--------
 .../collector/ui/service/ServiceNameService.java   | 27 +++----
 .../ui/service/ServiceTopologyService.java         | 28 ++-----
 .../apm/collector/ui/service/TopologyBuilder.java  | 40 +++-------
 .../apm/collector/ui/utils/DurationUtils.java      | 90 +++++++++++++---------
 .../apm/collector/ui/query/ServerQueryTest.java    |  6 +-
 .../apm/collector/ui/query/ServiceQueryTest.java   |  6 +-
 .../ui/service/ApplicationServiceTest.java         | 48 ++++--------
 ...erviceTest.java => DateBetweenServiceTest.java} | 12 +--
 .../collector/ui/service/ServerServiceTest.java    | 52 ++++---------
 .../ui/service/ServiceNameServiceTest.java         | 31 +++-----
 .../ui/service/ServiceTopologyServiceTest.java     | 31 +++-----
 .../collector/ui/service/TopologyBuilderTest.java  | 34 +++-----
 .../ui-graphql/application-layer.graphqls          |  2 +-
 .../src/main/resources/ui-graphql/common.graphqls  |  2 +-
 .../resources/ui-graphql/overview-layer.graphqls   |  6 +-
 .../resources/ui-graphql/server-layer.graphqls     | 12 +--
 .../resources/ui-graphql/service-layer.graphqls    |  4 +-
 67 files changed, 515 insertions(+), 567 deletions(-)

diff --git a/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/test/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/mock/AgentDataMock.java b/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/test/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/mock/AgentDataMock.java
index cb6bbbd..728c024 100644
--- a/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/test/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/mock/AgentDataMock.java
+++ b/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/test/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/mock/AgentDataMock.java
@@ -56,7 +56,7 @@ public class AgentDataMock {
         Long[] times = TimeBuilder.INSTANCE.generateTimes();
         logger.info("times size: {}", times.length);
 
-//        segmentMock.mock(upstreamSegments, times, false);
+        segmentMock.mock(upstreamSegments, times, false);
 
         JVMMetricMock jvmMetricMock = new JVMMetricMock();
         jvmMetricMock.mock(channel, times);
diff --git a/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/test/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/mock/JVMMetricMock.java b/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/test/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/mock/JVMMetricMock.java
index 98e9788..9368f2f 100644
--- a/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/test/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/mock/JVMMetricMock.java
+++ b/apm-collector/apm-collector-agent/agent-grpc/agent-grpc-provider/src/test/java/org/apache/skywalking/apm/collector/agent/grpc/provider/handler/mock/JVMMetricMock.java
@@ -143,11 +143,13 @@ class JVMMetricMock {
         GC.Builder newGC = GC.newBuilder();
         newGC.setPhrase(GCPhrase.NEW);
         newGC.setCount(2);
+        newGC.setTime(1000);
         metricBuilder.addGc(newGC);
 
         GC.Builder oldGC = GC.newBuilder();
         oldGC.setPhrase(GCPhrase.OLD);
         oldGC.setCount(4);
+        oldGC.setTime(49);
         metricBuilder.addGc(oldGC);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-define/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/define/service/IGCMetricService.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-define/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/define/service/IGCMetricService.java
index 2a3937a..a4abf19 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-define/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/define/service/IGCMetricService.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-define/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/define/service/IGCMetricService.java
@@ -24,5 +24,5 @@ import org.apache.skywalking.apm.collector.core.module.Service;
  * @author peng-yongsheng
  */
 public interface IGCMetricService extends Service {
-    void send(int instanceId, long timeBucket, int phraseValue, long count, long time);
+    void send(int instanceId, long timeBucket, int phraseValue, long count, long duration);
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/service/GCMetricService.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/service/GCMetricService.java
index 5a6bbfe..9bc73d3 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/service/GCMetricService.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/service/GCMetricService.java
@@ -45,7 +45,7 @@ public class GCMetricService implements IGCMetricService {
         return gcMetricGraph;
     }
 
-    @Override public void send(int instanceId, long timeBucket, int phraseValue, long count, long time) {
+    @Override public void send(int instanceId, long timeBucket, int phraseValue, long count, long duration) {
         String metricId = instanceId + Const.ID_SPLIT + String.valueOf(phraseValue);
         String id = timeBucket + Const.ID_SPLIT + metricId;
 
@@ -55,6 +55,7 @@ public class GCMetricService implements IGCMetricService {
         gcMetric.setInstanceId(instanceId);
         gcMetric.setPhrase(phraseValue);
         gcMetric.setCount(count);
+        gcMetric.setDuration(duration);
         gcMetric.setTimes(1L);
         gcMetric.setTimeBucket(timeBucket);
 
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuDayMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuDayMetricPersistenceWorker.java
index f94add8..90fbce0 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuDayMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuDayMetricPersistenceWorker.java
@@ -32,7 +32,7 @@ import org.apache.skywalking.apm.collector.storage.table.jvm.CpuMetric;
  */
 public class CpuDayMetricPersistenceWorker extends PersistenceWorker<CpuMetric> {
 
-    public CpuDayMetricPersistenceWorker(ModuleManager moduleManager) {
+    private CpuDayMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuHourMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuHourMetricPersistenceWorker.java
index b97bd1b..9f3c4fb 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuHourMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuHourMetricPersistenceWorker.java
@@ -32,7 +32,7 @@ import org.apache.skywalking.apm.collector.storage.table.jvm.CpuMetric;
  */
 public class CpuHourMetricPersistenceWorker extends PersistenceWorker<CpuMetric> {
 
-    public CpuHourMetricPersistenceWorker(ModuleManager moduleManager) {
+    private CpuHourMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuMinuteMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuMinuteMetricPersistenceWorker.java
index 104ab65..7642a3f 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuMinuteMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuMinuteMetricPersistenceWorker.java
@@ -32,7 +32,7 @@ import org.apache.skywalking.apm.collector.storage.table.jvm.CpuMetric;
  */
 public class CpuMinuteMetricPersistenceWorker extends PersistenceWorker<CpuMetric> {
 
-    public CpuMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
+    private CpuMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuMonthMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuMonthMetricPersistenceWorker.java
index 7cde208..ff8fb95 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuMonthMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/cpu/CpuMonthMetricPersistenceWorker.java
@@ -32,7 +32,7 @@ import org.apache.skywalking.apm.collector.storage.table.jvm.CpuMetric;
  */
 public class CpuMonthMetricPersistenceWorker extends PersistenceWorker<CpuMetric> {
 
-    public CpuMonthMetricPersistenceWorker(ModuleManager moduleManager) {
+    private CpuMonthMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCDayMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCDayMetricPersistenceWorker.java
index a9e2954..14e62c1 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCDayMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCDayMetricPersistenceWorker.java
@@ -19,8 +19,7 @@
 package org.apache.skywalking.apm.collector.analysis.jvm.provider.worker.gc;
 
 import org.apache.skywalking.apm.collector.analysis.jvm.define.graph.WorkerIdDefine;
-import org.apache.skywalking.apm.collector.analysis.worker.model.impl.PersistenceWorker;
-import org.apache.skywalking.apm.collector.analysis.worker.model.impl.PersistenceWorkerProvider;
+import org.apache.skywalking.apm.collector.analysis.worker.model.impl.*;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.storage.StorageModule;
 import org.apache.skywalking.apm.collector.storage.base.dao.IPersistenceDAO;
@@ -32,7 +31,7 @@ import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetric;
  */
 public class GCDayMetricPersistenceWorker extends PersistenceWorker<GCMetric> {
 
-    public GCDayMetricPersistenceWorker(ModuleManager moduleManager) {
+    private GCDayMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCHourMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCHourMetricPersistenceWorker.java
index c9b3baf..7bc7319 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCHourMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCHourMetricPersistenceWorker.java
@@ -32,7 +32,7 @@ import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetric;
  */
 public class GCHourMetricPersistenceWorker extends PersistenceWorker<GCMetric> {
 
-    public GCHourMetricPersistenceWorker(ModuleManager moduleManager) {
+    private GCHourMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMetricCopy.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMetricCopy.java
index b914a29..9c0b534 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMetricCopy.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMetricCopy.java
@@ -34,6 +34,7 @@ public class GCMetricCopy {
         newGCMetric.setPhrase(gcMetric.getPhrase());
 
         newGCMetric.setCount(gcMetric.getCount());
+        newGCMetric.setDuration(gcMetric.getDuration());
         newGCMetric.setTimes(gcMetric.getTimes());
 
         newGCMetric.setTimeBucket(gcMetric.getTimeBucket());
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMinuteMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMinuteMetricPersistenceWorker.java
index 359652d..7da8dd4 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMinuteMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMinuteMetricPersistenceWorker.java
@@ -32,7 +32,7 @@ import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetric;
  */
 public class GCMinuteMetricPersistenceWorker extends PersistenceWorker<GCMetric> {
 
-    public GCMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
+    private GCMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMonthMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMonthMetricPersistenceWorker.java
index 2fbc41f..34667f7 100644
--- a/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMonthMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-jvm/jvm-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/jvm/provider/worker/gc/GCMonthMetricPersistenceWorker.java
@@ -32,7 +32,7 @@ import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetric;
  */
 public class GCMonthMetricPersistenceWorker extends PersistenceWorker<GCMetric> {
 
-    public GCMonthMetricPersistenceWorker(ModuleManager moduleManager) {
+    private GCMonthMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IApplicationMetricUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IApplicationMetricUIDAO.java
index 8807a81..5e02648 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IApplicationMetricUIDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IApplicationMetricUIDAO.java
@@ -22,7 +22,7 @@ import java.util.List;
 import org.apache.skywalking.apm.collector.storage.base.dao.DAO;
 import org.apache.skywalking.apm.collector.storage.table.MetricSource;
 import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.overview.ApplicationTPS;
+import org.apache.skywalking.apm.collector.storage.ui.overview.ApplicationThroughput;
 
 /**
  * Interface to be implemented for execute database query operation
@@ -38,7 +38,7 @@ public interface IApplicationMetricUIDAO extends DAO {
      * Returns the top n application throughput between start time bucket
      * and end time bucket.
      *
-     * <p>SQL as: select APPLICATION_ID, sum(TRANSACTION_CALLS) / betweenSecond as tps
+     * <p>SQL as: select APPLICATION_ID, sum(TRANSACTION_CALLS) / minutesBetween as tps
      * from APPLICATION_METRIC
      * where TIME_BUCKET ge ${startTimeBucket} and TIME_BUCKET le ${endTimeBucket}
      * and SOURCE_VALUE = ${metricSource}
@@ -52,13 +52,13 @@ public interface IApplicationMetricUIDAO extends DAO {
      * @param step the step which represent time formats
      * @param startTimeBucket start time bucket
      * @param endTimeBucket end time bucket
-     * @param betweenSecond the seconds between start time bucket and end time bucket
+     * @param minutesBetween the minutes between start time bucket and end time bucket
      * @param topN how many rows should return
      * @param metricSource source of this metric, server side or client side
      * @return not nullable result list
      */
-    List<ApplicationTPS> getTopNApplicationThroughput(Step step, long startTimeBucket, long endTimeBucket,
-        int betweenSecond, int topN, MetricSource metricSource);
+    List<ApplicationThroughput> getTopNApplicationThroughput(Step step, long startTimeBucket, long endTimeBucket,
+        int minutesBetween, int topN, MetricSource metricSource);
 
     /**
      * Returns aggregated application metrics that collected between start time bucket
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IGCMetricUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IGCMetricUIDAO.java
index cfde09e..74552fc 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IGCMetricUIDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IGCMetricUIDAO.java
@@ -37,10 +37,11 @@ public interface IGCMetricUIDAO extends DAO {
     /**
      * Young GC Trend describes the trend of young generation garbage collection in the given
      * duration, which represents by the DurationPoint list in the `step` Unit.
-     * <p>SQL as: select COUNT, TIMES from GC_METRIC where ID in (durationPoints), rule of
+     * <p>SQL as: select COUNT, TIMES, DURATION from GC_METRIC where ID in (durationPoints), rule of
      * ID generation is "${durationPoint}_${instanceId}_${gcPhrase}",
      * {@link org.apache.skywalking.apm.network.proto.GCPhrase#NEW_VALUE}
-     * <p>The average young generation GC count percent formula is "COUNT / TIMES".
+     * <p>The average young generation GC average count formula is "COUNT / TIMES".
+     * <p>The average young generation GC average duration formula is "DURATION / TIMES".
      * <p>Every element in return list must match DurationPoint list, which also means that,
      * the two list must be in same size, and index match.
      * <p>If some element of the return list can't be found, the implementor must set 0 as
@@ -51,19 +52,20 @@ public interface IGCMetricUIDAO extends DAO {
      * @param instanceId the owner id of this GC metrics
      * @param step the step which represent time formats
      * @param durationPoints the time points in the time span
-     * @return every duration points average young generation GC count percent metrics.
+     * @return every duration points average young generation GC count and duration metrics.
      * @see org.apache.skywalking.apm.collector.storage.ui.common.Step
      * @see org.apache.skywalking.apm.network.proto.GCPhrase
      */
-    List<Integer> getYoungGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints);
+    List<Trend> getYoungGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints);
 
     /**
      * Old GC Trend describes the trend of old generation garbage collection in the given
      * duration, which represents by the DurationPoint list in the `step` Unit.
-     * <p>SQL as: select COUNT, TIMES from GC_METRIC where ID in (durationPoints), rule of
+     * <p>SQL as: select COUNT, TIMES, DURATION from GC_METRIC where ID in (durationPoints), rule of
      * ID generation is "${durationPoint}_${instanceId}_${gcPhrase}",
      * {@link org.apache.skywalking.apm.network.proto.GCPhrase#OLD_VALUE}
-     * <p>The average old generation GC count percent formula is "COUNT / TIMES".
+     * <p>The average young generation GC average count formula is "COUNT / TIMES".
+     * <p>The average young generation GC average duration formula is "DURATION / TIMES".
      * <p>Every element in return list must match DurationPoint list, which also means that,
      * the two list must be in same size, and index match.
      * <p>If some element of the return list can't be found, the implementor must set 0 as
@@ -74,9 +76,27 @@ public interface IGCMetricUIDAO extends DAO {
      * @param instanceId the owner id of this GC metrics
      * @param step the step which represent time formats
      * @param durationPoints the time points in the time span
-     * @return every duration points average old generation GC count percent metrics.
+     * @return every duration points average old generation GC count and duration metrics.
      * @see org.apache.skywalking.apm.collector.storage.ui.common.Step
      * @see org.apache.skywalking.apm.network.proto.GCPhrase
      */
-    List<Integer> getOldGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints);
+    List<Trend> getOldGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints);
+
+    class Trend {
+        private int averageCount;
+        private int averageDuration;
+
+        public Trend(int averageCount, int averageDuration) {
+            this.averageCount = averageCount;
+            this.averageDuration = averageDuration;
+        }
+
+        public int getAverageCount() {
+            return averageCount;
+        }
+
+        public int getAverageDuration() {
+            return averageDuration;
+        }
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IInstanceMetricUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IInstanceMetricUIDAO.java
index 6281d6b..cda708a 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IInstanceMetricUIDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/dao/ui/IInstanceMetricUIDAO.java
@@ -39,7 +39,7 @@ public interface IInstanceMetricUIDAO extends DAO {
      * Returns the top n instance throughput between start time bucket
      * and end time bucket.
      *
-     * <p>SQL as: select APPLICATION_ID, sum(TRANSACTION_CALLS) / ${secondBetween} as tps
+     * <p>SQL as: select APPLICATION_ID, sum(TRANSACTION_CALLS) / ${minutesBetween} as tps
      * from INSTANCE_METRIC
      * where TIME_BUCKET ge ${startTimeBucket} and TIME_BUCKET le ${endTimeBucket}
      * and SOURCE_VALUE = ${metricSource}
@@ -55,13 +55,13 @@ public interface IInstanceMetricUIDAO extends DAO {
      * @param step the step which represent time formats
      * @param startTimeBucket start time bucket
      * @param endTimeBucket end time bucket
-     * @param secondBetween the seconds between start time bucket and end time bucket
+     * @param minutesBetween the minutes between start time bucket and end time bucket
      * @param topN how many rows should return
      * @param metricSource source of this metric, server side or client side
      * @return not nullable result list
      */
     List<AppServerInfo> getServerThroughput(int applicationId, Step step, long startTimeBucket, long endTimeBucket,
-        int secondBetween, int topN, MetricSource metricSource);
+        int minutesBetween, int topN, MetricSource metricSource);
 
     /**
      * Server TPS Trend describes the trend of instance throughout in the given duration,
@@ -70,7 +70,7 @@ public interface IInstanceMetricUIDAO extends DAO {
      * <p>SQL as: select TRANSACTION_CALLS from INSTANCE_METRIC where ID in (durationPoints),
      * rule of ID generation is "${durationPoint}_${instanceId}_${MetricSource.Callee}".
      *
-     * <p>The formula is "TRANSACTION_CALLS * durationPoint#secondsBetween"
+     * <p>The formula is "TRANSACTION_CALLS * durationPoint#minutesBetween"
      *
      * <p>Use {@link org.apache.skywalking.apm.collector.storage.utils.TimePyramidTableNameBuilder#build(Step, String)}
      * to generate table name which mixed with step name.
@@ -80,7 +80,7 @@ public interface IInstanceMetricUIDAO extends DAO {
      * @param durationPoints the time points in the time span
      * @return every duration points average instance throughput metrics.
      */
-    List<Integer> getServerTPSTrend(int instanceId, Step step, List<DurationPoint> durationPoints);
+    List<Integer> getServerThroughputTrend(int instanceId, Step step, List<DurationPoint> durationPoints);
 
     /**
      * Response time Trend describes the trend of instance average response time in the given duration,
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 1a7fa20..d3e2f71 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
@@ -18,12 +18,10 @@
 
 package org.apache.skywalking.apm.collector.storage.dao.ui;
 
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
 import org.apache.skywalking.apm.collector.storage.base.dao.DAO;
 import org.apache.skywalking.apm.collector.storage.table.MetricSource;
-import org.apache.skywalking.apm.collector.storage.ui.common.Node;
-import org.apache.skywalking.apm.collector.storage.ui.common.Step;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
 import org.apache.skywalking.apm.collector.storage.ui.service.ServiceMetric;
 import org.apache.skywalking.apm.collector.storage.utils.DurationPoint;
 
@@ -56,10 +54,10 @@ public interface IServiceMetricUIDAO extends DAO {
     List<Integer> getServiceResponseTimeTrend(int serviceId, Step step, List<DurationPoint> durationPoints);
 
     /**
-     * Service TPS Trend describes the trend of Service metric in the given duration
+     * Service throughout Trend describes the trend of Service metric in the given duration
      * , which represents by the DurationPoint list in the `step` Unit.
      *
-     * <p>SQL as: select TRANSACTION_CALLS / ${durationPoint#secondsBetween} from SERVICE_METRIC
+     * <p>SQL as: select TRANSACTION_CALLS / ${durationPoint#minutesBetween} from SERVICE_METRIC
      * where ID in (${durationPoints})
      *
      * <p>rule of ID generation is "${durationPoint}_${serviceId}_${MetricSource.Callee}"
@@ -71,7 +69,7 @@ public interface IServiceMetricUIDAO extends DAO {
      * @param durationPoints the time points in the time span
      * @return every duration points average throughout metrics.
      */
-    List<Integer> getServiceTPSTrend(int serviceId, Step step, List<DurationPoint> durationPoints);
+    List<Integer> getServiceThroughputTrend(int serviceId, Step step, List<DurationPoint> durationPoints);
 
     /**
      * Service SLA Trend describes the trend of Service SLA metrics in the given duration
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/jvm/GCMetric.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/jvm/GCMetric.java
index 7f5b3b9..d032bd6 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/jvm/GCMetric.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/jvm/GCMetric.java
@@ -18,11 +18,8 @@
 
 package org.apache.skywalking.apm.collector.storage.table.jvm;
 
-import org.apache.skywalking.apm.collector.core.data.Column;
-import org.apache.skywalking.apm.collector.core.data.StreamData;
-import org.apache.skywalking.apm.collector.core.data.operator.AddMergeOperation;
-import org.apache.skywalking.apm.collector.core.data.operator.CoverMergeOperation;
-import org.apache.skywalking.apm.collector.core.data.operator.NonMergeOperation;
+import org.apache.skywalking.apm.collector.core.data.*;
+import org.apache.skywalking.apm.collector.core.data.operator.*;
 
 /**
  * @author peng-yongsheng
@@ -38,6 +35,7 @@ public class GCMetric extends StreamData {
         new Column(GCMetricTable.COUNT, new AddMergeOperation()),
         new Column(GCMetricTable.TIMES, new AddMergeOperation()),
         new Column(GCMetricTable.TIME_BUCKET, new CoverMergeOperation()),
+        new Column(GCMetricTable.DURATION, new AddMergeOperation()),
     };
 
     private static final Column[] DOUBLE_COLUMNS = {
@@ -94,6 +92,14 @@ public class GCMetric extends StreamData {
         setDataLong(2, timeBucket);
     }
 
+    public Long getDuration() {
+        return getDataLong(3);
+    }
+
+    public void setDuration(Long duration) {
+        setDataLong(3, duration);
+    }
+
     public Integer getInstanceId() {
         return getDataInteger(0);
     }
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/jvm/GCMetricTable.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/jvm/GCMetricTable.java
index e02f806..915ee43 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/jvm/GCMetricTable.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/table/jvm/GCMetricTable.java
@@ -30,4 +30,6 @@ public interface GCMetricTable extends InstanceTable {
     ColumnName PHRASE = new ColumnName("phrase", "p");
 
     ColumnName COUNT = new ColumnName("count", "c");
+
+    ColumnName DURATION = new ColumnName("duration", "d");
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/application/ApplicationNode.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/application/ApplicationNode.java
index 8e2170f..4e434a9 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/application/ApplicationNode.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/application/ApplicationNode.java
@@ -26,7 +26,7 @@ import org.apache.skywalking.apm.collector.storage.ui.common.Node;
 public class ApplicationNode extends Node {
 
     private int sla;
-    private long callsPerSec;
+    private long cpm;
     private long avgResponseTime;
     private int apdex;
     private boolean isAlarm;
@@ -42,12 +42,12 @@ public class ApplicationNode extends Node {
         this.sla = sla;
     }
 
-    public long getCallsPerSec() {
-        return callsPerSec;
+    public long getCpm() {
+        return cpm;
     }
 
-    public void setCallsPerSec(long callsPerSec) {
-        this.callsPerSec = callsPerSec;
+    public void setCpm(long cpm) {
+        this.cpm = cpm;
     }
 
     public long getAvgResponseTime() {
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/common/Call.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/common/Call.java
index fec6dd7..8800b09 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/common/Call.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/common/Call.java
@@ -28,7 +28,7 @@ public class Call {
     private String targetName;
     private boolean isAlert;
     private String callType;
-    private long callsPerSec;
+    private long cpm;
     private long avgResponseTime;
 
     public int getSource() {
@@ -79,12 +79,12 @@ public class Call {
         this.callType = callType;
     }
 
-    public long getCallsPerSec() {
-        return callsPerSec;
+    public long getCpm() {
+        return cpm;
     }
 
-    public void setCallsPerSec(long callsPerSec) {
-        this.callsPerSec = callsPerSec;
+    public void setCpm(long cpm) {
+        this.cpm = cpm;
     }
 
     public long getAvgResponseTime() {
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/overview/ApplicationTPS.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/overview/ApplicationThroughput.java
similarity index 86%
rename from apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/overview/ApplicationTPS.java
rename to apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/overview/ApplicationThroughput.java
index 57f2346..65ba329 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/overview/ApplicationTPS.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/overview/ApplicationThroughput.java
@@ -21,10 +21,10 @@ package org.apache.skywalking.apm.collector.storage.ui.overview;
 /**
  * @author peng-yongsheng
  */
-public class ApplicationTPS {
+public class ApplicationThroughput {
     private int applicationId;
     private String applicationCode;
-    private int callsPerSec;
+    private int cpm;
 
     public int getApplicationId() {
         return applicationId;
@@ -42,11 +42,11 @@ public class ApplicationTPS {
         this.applicationCode = applicationCode;
     }
 
-    public int getCallsPerSec() {
-        return callsPerSec;
+    public int getCpm() {
+        return cpm;
     }
 
-    public void setCallsPerSec(int callsPerSec) {
-        this.callsPerSec = callsPerSec;
+    public void setCpm(int cpm) {
+        this.cpm = cpm;
     }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/server/AppServerInfo.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/server/AppServerInfo.java
index d28375b..e3a3e3e 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/server/AppServerInfo.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/server/AppServerInfo.java
@@ -30,7 +30,7 @@ public class AppServerInfo {
     private String applicationCode;
     private String osInfo;
     private String osName;
-    private int callsPerSec;
+    private int cpm;
     private String host;
     private int pid;
     private List<String> ipv4;
@@ -75,12 +75,12 @@ public class AppServerInfo {
         this.osName = osName;
     }
 
-    public int getCallsPerSec() {
-        return callsPerSec;
+    public int getCpm() {
+        return cpm;
     }
 
-    public void setCallsPerSec(int callsPerSec) {
-        this.callsPerSec = callsPerSec;
+    public void setCpm(int cpm) {
+        this.cpm = cpm;
     }
 
     public String getHost() {
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/server/GCTrend.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/server/GCTrend.java
index 4583194..b905e0a 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/server/GCTrend.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/server/GCTrend.java
@@ -18,28 +18,53 @@
 
 package org.apache.skywalking.apm.collector.storage.ui.server;
 
-import java.util.List;
+import java.util.*;
 
 /**
  * @author peng-yongsheng
  */
 public class GCTrend {
-    private List<Integer> youngGC;
-    private List<Integer> oldGC;
+    private List<Integer> youngGCCount;
+    private List<Integer> oldGCount;
+    private List<Integer> youngGCTime;
+    private List<Integer> oldGCTime;
 
-    public List<Integer> getYoungGC() {
-        return youngGC;
+    public GCTrend() {
+        this.youngGCCount = new LinkedList<>();
+        this.oldGCount = new LinkedList<>();
+        this.youngGCTime = new LinkedList<>();
+        this.oldGCTime = new LinkedList<>();
     }
 
-    public void setYoungGC(List<Integer> youngGC) {
-        this.youngGC = youngGC;
+    public List<Integer> getYoungGCCount() {
+        return youngGCCount;
     }
 
-    public List<Integer> getOldGC() {
-        return oldGC;
+    public void setYoungGCCount(List<Integer> youngGCCount) {
+        this.youngGCCount = youngGCCount;
     }
 
-    public void setOldGC(List<Integer> oldGC) {
-        this.oldGC = oldGC;
+    public List<Integer> getOldGCount() {
+        return oldGCount;
+    }
+
+    public void setOldGCount(List<Integer> oldGCount) {
+        this.oldGCount = oldGCount;
+    }
+
+    public List<Integer> getYoungGCTime() {
+        return youngGCTime;
+    }
+
+    public void setYoungGCTime(List<Integer> youngGCTime) {
+        this.youngGCTime = youngGCTime;
+    }
+
+    public List<Integer> getOldGCTime() {
+        return oldGCTime;
+    }
+
+    public void setOldGCTime(List<Integer> oldGCTime) {
+        this.oldGCTime = oldGCTime;
     }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/service/ServiceMetric.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/service/ServiceMetric.java
index 9993d88..bb420b9 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/service/ServiceMetric.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/service/ServiceMetric.java
@@ -26,7 +26,7 @@ public class ServiceMetric {
     private String name;
     private long calls;
     private int avgResponseTime;
-    private int callsPerSec;
+    private int cpm;
 
     public int getId() {
         return id;
@@ -52,12 +52,12 @@ public class ServiceMetric {
         this.avgResponseTime = avgResponseTime;
     }
 
-    public int getCallsPerSec() {
-        return callsPerSec;
+    public int getCpm() {
+        return cpm;
     }
 
-    public void setCallsPerSec(int callsPerSec) {
-        this.callsPerSec = callsPerSec;
+    public void setCpm(int cpm) {
+        this.cpm = cpm;
     }
 
     public long getCalls() {
diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/utils/DurationPoint.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/utils/DurationPoint.java
index a8f5ece..d608dda 100644
--- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/utils/DurationPoint.java
+++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/utils/DurationPoint.java
@@ -24,10 +24,12 @@ package org.apache.skywalking.apm.collector.storage.utils;
 public class DurationPoint {
     private long point;
     private long secondsBetween;
+    private long minutesBetween;
 
-    public DurationPoint(long point, long secondsBetween) {
+    public DurationPoint(long point, long secondsBetween, long minutesBetween) {
         this.point = point;
         this.secondsBetween = secondsBetween;
+        this.minutesBetween = minutesBetween;
     }
 
     public long getPoint() {
@@ -37,4 +39,8 @@ public class DurationPoint {
     public long getSecondsBetween() {
         return secondsBetween;
     }
+
+    public long getMinutesBetween() {
+        return minutesBetween;
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/gc/AbstractGCMetricEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/gc/AbstractGCMetricEsPersistenceDAO.java
index 05b584b..c215b85 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/gc/AbstractGCMetricEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/gc/AbstractGCMetricEsPersistenceDAO.java
@@ -18,13 +18,11 @@
 
 package org.apache.skywalking.apm.collector.storage.es.dao.gc;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 import org.apache.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient;
 import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 import org.apache.skywalking.apm.collector.storage.es.base.dao.AbstractPersistenceEsDAO;
-import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetric;
-import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetricTable;
+import org.apache.skywalking.apm.collector.storage.table.jvm.*;
 
 /**
  * @author peng-yongsheng
@@ -48,6 +46,7 @@ public abstract class AbstractGCMetricEsPersistenceDAO extends AbstractPersisten
 
         gcMetric.setCount(((Number)source.get(GCMetricTable.COUNT.getName())).longValue());
         gcMetric.setTimes(((Number)source.get(GCMetricTable.TIMES.getName())).longValue());
+        gcMetric.setDuration(((Number)source.get(GCMetricTable.DURATION.getName())).longValue());
 
         gcMetric.setTimeBucket(((Number)source.get(GCMetricTable.TIME_BUCKET.getName())).longValue());
 
@@ -63,6 +62,7 @@ public abstract class AbstractGCMetricEsPersistenceDAO extends AbstractPersisten
         target.put(GCMetricTable.COUNT.getName(), streamData.getCount());
         target.put(GCMetricTable.TIMES.getName(), streamData.getTimes());
         target.put(GCMetricTable.TIME_BUCKET.getName(), streamData.getTimeBucket());
+        target.put(GCMetricTable.DURATION.getName(), streamData.getDuration());
 
         return target;
     }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ApplicationMetricEsUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ApplicationMetricEsUIDAO.java
index b3f5e0b..ced6850 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ApplicationMetricEsUIDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/ApplicationMetricEsUIDAO.java
@@ -18,24 +18,19 @@
 
 package org.apache.skywalking.apm.collector.storage.es.dao.ui;
 
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 import org.apache.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient;
 import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMetricUIDAO;
 import org.apache.skywalking.apm.collector.storage.es.base.dao.EsDAO;
 import org.apache.skywalking.apm.collector.storage.table.MetricSource;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetricTable;
 import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.overview.ApplicationTPS;
+import org.apache.skywalking.apm.collector.storage.ui.overview.ApplicationThroughput;
 import org.apache.skywalking.apm.collector.storage.utils.TimePyramidTableNameBuilder;
-import org.elasticsearch.action.search.SearchRequestBuilder;
-import org.elasticsearch.action.search.SearchResponse;
-import org.elasticsearch.action.search.SearchType;
-import org.elasticsearch.index.query.BoolQueryBuilder;
-import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.action.search.*;
+import org.elasticsearch.index.query.*;
 import org.elasticsearch.search.aggregations.AggregationBuilders;
-import org.elasticsearch.search.aggregations.bucket.terms.Terms;
-import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
+import org.elasticsearch.search.aggregations.bucket.terms.*;
 import org.elasticsearch.search.aggregations.metrics.sum.Sum;
 
 /**
@@ -48,8 +43,8 @@ public class ApplicationMetricEsUIDAO extends EsDAO implements IApplicationMetri
     }
 
     @Override
-    public List<ApplicationTPS> getTopNApplicationThroughput(Step step, long startTimeBucket, long endTimeBucket,
-        int betweenSecond, int topN, MetricSource metricSource) {
+    public List<ApplicationThroughput> getTopNApplicationThroughput(Step step, long startTimeBucket, long endTimeBucket,
+        int minutesBetween, int topN, MetricSource metricSource) {
         String tableName = TimePyramidTableNameBuilder.build(step, ApplicationMetricTable.TABLE);
 
         SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(tableName);
@@ -69,28 +64,28 @@ public class ApplicationMetricEsUIDAO extends EsDAO implements IApplicationMetri
 
         SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
 
-        List<ApplicationTPS> applicationTPSs = new LinkedList<>();
+        List<ApplicationThroughput> applicationThroughputList = new LinkedList<>();
         Terms applicationIdTerms = searchResponse.getAggregations().get(ApplicationMetricTable.APPLICATION_ID.getName());
         applicationIdTerms.getBuckets().forEach(applicationIdTerm -> {
             int applicationId = applicationIdTerm.getKeyAsNumber().intValue();
             Sum callSum = applicationIdTerm.getAggregations().get(ApplicationMetricTable.TRANSACTION_CALLS.getName());
             long calls = (long)callSum.getValue();
-            int callsPerSec = (int)(betweenSecond == 0 ? 0 : calls / betweenSecond);
+            int callsPerMinute = (int)(minutesBetween == 0 ? 0 : calls / minutesBetween);
 
-            ApplicationTPS applicationTPS = new ApplicationTPS();
-            applicationTPS.setApplicationId(applicationId);
-            applicationTPS.setCallsPerSec(callsPerSec);
-            applicationTPSs.add(applicationTPS);
+            ApplicationThroughput applicationThroughput = new ApplicationThroughput();
+            applicationThroughput.setApplicationId(applicationId);
+            applicationThroughput.setCpm(callsPerMinute);
+            applicationThroughputList.add(applicationThroughput);
         });
 
-        applicationTPSs.sort((first, second) -> first.getCallsPerSec() > second.getCallsPerSec() ? -1 : 1);
+        applicationThroughputList.sort((first, second) -> first.getCpm() > second.getCpm() ? -1 : 1);
 
-        if (applicationTPSs.size() <= topN) {
-            return applicationTPSs;
+        if (applicationThroughputList.size() <= topN) {
+            return applicationThroughputList;
         } else {
-            List<ApplicationTPS> newCollection = new LinkedList<>();
+            List<ApplicationThroughput> newCollection = new LinkedList<>();
             for (int i = 0; i < topN; i++) {
-                newCollection.add(applicationTPSs.get(i));
+                newCollection.add(applicationThroughputList.get(i));
             }
             return newCollection;
         }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/GCMetricEsUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/GCMetricEsUIDAO.java
index 2a42db0..71c0880 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/GCMetricEsUIDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/GCMetricEsUIDAO.java
@@ -18,21 +18,16 @@
 
 package org.apache.skywalking.apm.collector.storage.es.dao.ui;
 
-import java.util.LinkedList;
-import java.util.List;
-
+import java.util.*;
 import org.apache.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient;
 import org.apache.skywalking.apm.collector.core.util.Const;
 import org.apache.skywalking.apm.collector.storage.dao.ui.IGCMetricUIDAO;
 import org.apache.skywalking.apm.collector.storage.es.base.dao.EsDAO;
 import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetricTable;
 import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.utils.DurationPoint;
-import org.apache.skywalking.apm.collector.storage.utils.TimePyramidTableNameBuilder;
+import org.apache.skywalking.apm.collector.storage.utils.*;
 import org.apache.skywalking.apm.network.proto.GCPhrase;
-import org.elasticsearch.action.get.MultiGetItemResponse;
-import org.elasticsearch.action.get.MultiGetRequestBuilder;
-import org.elasticsearch.action.get.MultiGetResponse;
+import org.elasticsearch.action.get.*;
 
 /**
  * @author peng-yongsheng
@@ -44,16 +39,16 @@ public class GCMetricEsUIDAO extends EsDAO implements IGCMetricUIDAO {
     }
 
     @Override
-    public List<Integer> getYoungGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
+    public List<Trend> getYoungGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
         return getGCTrend(instanceId, step, durationPoints, GCPhrase.NEW_VALUE);
     }
 
     @Override
-    public List<Integer> getOldGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
+    public List<Trend> getOldGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
         return getGCTrend(instanceId, step, durationPoints, GCPhrase.OLD_VALUE);
     }
 
-    private List<Integer> getGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints, int gcPhrase) {
+    private List<Trend> getGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints, int gcPhrase) {
         String tableName = TimePyramidTableNameBuilder.build(step, GCMetricTable.TABLE);
 
         MultiGetRequestBuilder youngPrepareMultiGet = getClient().prepareMultiGet(durationPoints, new ElasticSearchClient.MultiGetRowHandler<DurationPoint>() {
@@ -64,15 +59,16 @@ public class GCMetricEsUIDAO extends EsDAO implements IGCMetricUIDAO {
             }
         });
 
-        List<Integer> gcTrends = new LinkedList<>();
+        List<Trend> gcTrends = new LinkedList<>();
         MultiGetResponse multiGetResponse = youngPrepareMultiGet.get();
         for (MultiGetItemResponse itemResponse : multiGetResponse.getResponses()) {
             if (itemResponse.getResponse().isExists()) {
-                long count = ((Number) itemResponse.getResponse().getSource().get(GCMetricTable.COUNT.getName())).longValue();
-                long times = ((Number) itemResponse.getResponse().getSource().get(GCMetricTable.TIMES.getName())).intValue();
-                gcTrends.add((int) (count / times));
+                long count = ((Number)itemResponse.getResponse().getSource().get(GCMetricTable.COUNT.getName())).longValue();
+                long duration = ((Number)itemResponse.getResponse().getSource().get(GCMetricTable.DURATION.getName())).longValue();
+                long times = ((Number)itemResponse.getResponse().getSource().get(GCMetricTable.TIMES.getName())).intValue();
+                gcTrends.add(new Trend((int)(count / times), (int)(duration / times)));
             } else {
-                gcTrends.add(0);
+                gcTrends.add(new Trend(0, 0));
             }
         }
 
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/InstanceMetricEsUIDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/InstanceMetricEsUIDAO.java
index 20d6d5f..8982ba6 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/InstanceMetricEsUIDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ui/InstanceMetricEsUIDAO.java
@@ -18,8 +18,7 @@
 
 package org.apache.skywalking.apm.collector.storage.es.dao.ui;
 
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 import org.apache.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient;
 import org.apache.skywalking.apm.collector.core.util.Const;
 import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceMetricUIDAO;
@@ -29,19 +28,12 @@ import org.apache.skywalking.apm.collector.storage.table.application.Application
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetricTable;
 import org.apache.skywalking.apm.collector.storage.ui.common.Step;
 import org.apache.skywalking.apm.collector.storage.ui.server.AppServerInfo;
-import org.apache.skywalking.apm.collector.storage.utils.DurationPoint;
-import org.apache.skywalking.apm.collector.storage.utils.TimePyramidTableNameBuilder;
-import org.elasticsearch.action.get.MultiGetItemResponse;
-import org.elasticsearch.action.get.MultiGetRequestBuilder;
-import org.elasticsearch.action.get.MultiGetResponse;
-import org.elasticsearch.action.search.SearchRequestBuilder;
-import org.elasticsearch.action.search.SearchResponse;
-import org.elasticsearch.action.search.SearchType;
-import org.elasticsearch.index.query.BoolQueryBuilder;
-import org.elasticsearch.index.query.QueryBuilders;
+import org.apache.skywalking.apm.collector.storage.utils.*;
+import org.elasticsearch.action.get.*;
+import org.elasticsearch.action.search.*;
+import org.elasticsearch.index.query.*;
 import org.elasticsearch.search.aggregations.AggregationBuilders;
-import org.elasticsearch.search.aggregations.bucket.terms.Terms;
-import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
+import org.elasticsearch.search.aggregations.bucket.terms.*;
 import org.elasticsearch.search.aggregations.metrics.sum.Sum;
 
 /**
@@ -55,7 +47,7 @@ public class InstanceMetricEsUIDAO extends EsDAO implements IInstanceMetricUIDAO
 
     @Override
     public List<AppServerInfo> getServerThroughput(int applicationId, Step step, long startTimeBucket,
-        long endTimeBucket, int secondBetween, int topN, MetricSource metricSource) {
+        long endTimeBucket, int minutesBetween, int topN, MetricSource metricSource) {
         String tableName = TimePyramidTableNameBuilder.build(step, InstanceMetricTable.TABLE);
 
         SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(tableName);
@@ -78,34 +70,34 @@ public class InstanceMetricEsUIDAO extends EsDAO implements IInstanceMetricUIDAO
         searchRequestBuilder.addAggregation(aggregationBuilder);
         SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
 
-        List<AppServerInfo> appServerInfos = new LinkedList<>();
+        List<AppServerInfo> appServerInfoList = new LinkedList<>();
         Terms instanceIdTerms = searchResponse.getAggregations().get(InstanceMetricTable.INSTANCE_ID.getName());
         instanceIdTerms.getBuckets().forEach(instanceIdTerm -> {
             int instanceId = instanceIdTerm.getKeyAsNumber().intValue();
             Sum callSum = instanceIdTerm.getAggregations().get(ApplicationMetricTable.TRANSACTION_CALLS.getName());
             long calls = (long)callSum.getValue();
-            int callsPerSec = (int)(secondBetween == 0 ? 0 : calls / secondBetween);
+            int callsPerMinute = (int)(minutesBetween == 0 ? 0 : calls / minutesBetween);
 
             AppServerInfo appServerInfo = new AppServerInfo();
             appServerInfo.setId(instanceId);
-            appServerInfo.setCallsPerSec(callsPerSec);
-            appServerInfos.add(appServerInfo);
+            appServerInfo.setCpm(callsPerMinute);
+            appServerInfoList.add(appServerInfo);
         });
 
-        appServerInfos.sort((first, second) -> first.getCallsPerSec() > second.getCallsPerSec() ? -1 : 1);
-        if (appServerInfos.size() <= topN) {
-            return appServerInfos;
+        appServerInfoList.sort((first, second) -> first.getCpm() > second.getCpm() ? -1 : 1);
+        if (appServerInfoList.size() <= topN) {
+            return appServerInfoList;
         } else {
             List<AppServerInfo> newCollection = new LinkedList<>();
             for (int i = 0; i < topN; i++) {
-                newCollection.add(appServerInfos.get(i));
+                newCollection.add(appServerInfoList.get(i));
             }
             return newCollection;
         }
     }
 
     @Override
-    public List<Integer> getServerTPSTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
+    public List<Integer> getServerThroughputTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
         String tableName = TimePyramidTableNameBuilder.build(step, InstanceMetricTable.TABLE);
         MultiGetRequestBuilder prepareMultiGet = getClient().prepareMultiGet(durationPoints, new ElasticSearchClient.MultiGetRowHandler<DurationPoint>() {
             @Override
@@ -122,7 +114,7 @@ public class InstanceMetricEsUIDAO extends EsDAO implements IInstanceMetricUIDAO
             MultiGetItemResponse response = multiGetResponse.getResponses()[i];
             if (response.getResponse().isExists()) {
                 long callTimes = ((Number)response.getResponse().getSource().get(InstanceMetricTable.TRANSACTION_CALLS.getName())).longValue();
-                throughputTrend.add((int)(callTimes / durationPoints.get(i).getSecondsBetween()));
+                throughputTrend.add((int)(callTimes / durationPoints.get(i).getMinutesBetween()));
             } else {
                 throughputTrend.add(0);
             }
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 c3560ad..9f9c17b 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
@@ -86,7 +86,7 @@ public class ServiceMetricEsUIDAO extends EsDAO implements IServiceMetricUIDAO {
     }
 
     @Override
-    public List<Integer> getServiceTPSTrend(int serviceId, Step step, List<DurationPoint> durationPoints) {
+    public List<Integer> getServiceThroughputTrend(int serviceId, Step step, List<DurationPoint> durationPoints) {
         String tableName = TimePyramidTableNameBuilder.build(step, ServiceMetricTable.TABLE);
         MultiGetRequestBuilder prepareMultiGet = getClient().prepareMultiGet(durationPoints, new ElasticSearchClient.MultiGetRowHandler<DurationPoint>() {
             @Override
@@ -103,8 +103,8 @@ public class ServiceMetricEsUIDAO extends EsDAO implements IServiceMetricUIDAO {
         for (MultiGetItemResponse response : multiGetResponse.getResponses()) {
             if (response.getResponse().isExists()) {
                 long calls = ((Number)response.getResponse().getSource().get(ServiceMetricTable.TRANSACTION_CALLS.getName())).longValue();
-                long secondBetween = durationPoints.get(index).getSecondsBetween();
-                trends.add((int)(calls / secondBetween));
+                long minutesBetween = durationPoints.get(index).getMinutesBetween();
+                trends.add((int)(calls / minutesBetween));
             } else {
                 trends.add(0);
             }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/define/gc/AbstractGCMetricEsTableDefine.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/define/gc/AbstractGCMetricEsTableDefine.java
index b76dd86..05a9d92 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/define/gc/AbstractGCMetricEsTableDefine.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/define/gc/AbstractGCMetricEsTableDefine.java
@@ -37,6 +37,7 @@ public abstract class AbstractGCMetricEsTableDefine extends ElasticSearchTableDe
         addColumn(new ElasticSearchColumnDefine(GCMetricTable.INSTANCE_ID, ElasticSearchColumnDefine.Type.Integer.name()));
         addColumn(new ElasticSearchColumnDefine(GCMetricTable.PHRASE, ElasticSearchColumnDefine.Type.Integer.name()));
         addColumn(new ElasticSearchColumnDefine(GCMetricTable.COUNT, ElasticSearchColumnDefine.Type.Long.name()));
+        addColumn(new ElasticSearchColumnDefine(GCMetricTable.DURATION, ElasticSearchColumnDefine.Type.Long.name()));
         addColumn(new ElasticSearchColumnDefine(GCMetricTable.TIMES, ElasticSearchColumnDefine.Type.Long.name()));
         addColumn(new ElasticSearchColumnDefine(GCMetricTable.TIME_BUCKET, ElasticSearchColumnDefine.Type.Long.name()));
     }
diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/StorageModuleH2Provider.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/StorageModuleH2Provider.java
index 6a9f1b8..8b1b2e3 100644
--- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/StorageModuleH2Provider.java
+++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/StorageModuleH2Provider.java
@@ -179,10 +179,10 @@ import org.apache.skywalking.apm.collector.storage.h2.dao.cpu.CpuDayMetricH2Pers
 import org.apache.skywalking.apm.collector.storage.h2.dao.cpu.CpuHourMetricH2PersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.h2.dao.cpu.CpuMinuteMetricH2PersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.h2.dao.cpu.CpuMonthMetricH2PersistenceDAO;
-import org.apache.skywalking.apm.collector.storage.h2.dao.gcmp.GCDayMetricH2PersistenceDAO;
-import org.apache.skywalking.apm.collector.storage.h2.dao.gcmp.GCHourMetricH2PersistenceDAO;
-import org.apache.skywalking.apm.collector.storage.h2.dao.gcmp.GCMinuteMetricH2PersistenceDAO;
-import org.apache.skywalking.apm.collector.storage.h2.dao.gcmp.GCMonthMetricH2PersistenceDAO;
+import org.apache.skywalking.apm.collector.storage.h2.dao.gc.GCDayMetricH2PersistenceDAO;
+import org.apache.skywalking.apm.collector.storage.h2.dao.gc.GCHourMetricH2PersistenceDAO;
+import org.apache.skywalking.apm.collector.storage.h2.dao.gc.GCMinuteMetricH2PersistenceDAO;
+import org.apache.skywalking.apm.collector.storage.h2.dao.gc.GCMonthMetricH2PersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.h2.dao.imp.InstanceDayMetricH2PersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.h2.dao.imp.InstanceHourMetricH2PersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.h2.dao.imp.InstanceMinuteMetricH2PersistenceDAO;
diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/AbstractGCMetricH2PersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/AbstractGCMetricH2PersistenceDAO.java
similarity index 88%
rename from apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/AbstractGCMetricH2PersistenceDAO.java
rename to apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/AbstractGCMetricH2PersistenceDAO.java
index 8063524..1b8b28a 100644
--- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/AbstractGCMetricH2PersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/AbstractGCMetricH2PersistenceDAO.java
@@ -16,16 +16,13 @@
  *
  */
 
-package org.apache.skywalking.apm.collector.storage.h2.dao.gcmp;
+package org.apache.skywalking.apm.collector.storage.h2.dao.gc;
 
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
+import java.sql.*;
+import java.util.*;
 import org.apache.skywalking.apm.collector.client.h2.H2Client;
 import org.apache.skywalking.apm.collector.storage.h2.base.dao.AbstractPersistenceH2DAO;
-import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetric;
-import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetricTable;
+import org.apache.skywalking.apm.collector.storage.table.jvm.*;
 
 /**
  * @author peng-yongsheng
@@ -46,6 +43,7 @@ public abstract class AbstractGCMetricH2PersistenceDAO extends AbstractPersisten
 
         gcMetric.setCount(resultSet.getLong(GCMetricTable.COUNT.getName()));
         gcMetric.setTimes(resultSet.getLong(GCMetricTable.TIMES.getName()));
+        gcMetric.setDuration(resultSet.getLong(GCMetricTable.DURATION.getName()));
 
         gcMetric.setTimeBucket(resultSet.getLong(GCMetricTable.TIME_BUCKET.getName()));
 
@@ -61,6 +59,7 @@ public abstract class AbstractGCMetricH2PersistenceDAO extends AbstractPersisten
         target.put(GCMetricTable.PHRASE.getName(), streamData.getPhrase());
         target.put(GCMetricTable.COUNT.getName(), streamData.getCount());
         target.put(GCMetricTable.TIMES.getName(), streamData.getTimes());
+        target.put(GCMetricTable.DURATION.getName(), streamData.getDuration());
         target.put(GCMetricTable.TIME_BUCKET.getName(), streamData.getTimeBucket());
 
         return target;
diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCDayMetricH2PersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCDayMetricH2PersistenceDAO.java
similarity index 96%
rename from apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCDayMetricH2PersistenceDAO.java
rename to apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCDayMetricH2PersistenceDAO.java
index cd94369..2cd3c40 100644
--- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCDayMetricH2PersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCDayMetricH2PersistenceDAO.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.apm.collector.storage.h2.dao.gcmp;
+package org.apache.skywalking.apm.collector.storage.h2.dao.gc;
 
 import org.apache.skywalking.apm.collector.client.h2.H2Client;
 import org.apache.skywalking.apm.collector.core.storage.TimePyramid;
diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCHourMetricH2PersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCHourMetricH2PersistenceDAO.java
similarity index 96%
rename from apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCHourMetricH2PersistenceDAO.java
rename to apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCHourMetricH2PersistenceDAO.java
index b322c19..eff54bb 100644
--- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCHourMetricH2PersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCHourMetricH2PersistenceDAO.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.apm.collector.storage.h2.dao.gcmp;
+package org.apache.skywalking.apm.collector.storage.h2.dao.gc;
 
 import org.apache.skywalking.apm.collector.client.h2.H2Client;
 import org.apache.skywalking.apm.collector.core.storage.TimePyramid;
diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCMinuteMetricH2PersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCMinuteMetricH2PersistenceDAO.java
similarity index 96%
rename from apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCMinuteMetricH2PersistenceDAO.java
rename to apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCMinuteMetricH2PersistenceDAO.java
index 36d34d0..737c731 100644
--- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCMinuteMetricH2PersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCMinuteMetricH2PersistenceDAO.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.apm.collector.storage.h2.dao.gcmp;
+package org.apache.skywalking.apm.collector.storage.h2.dao.gc;
 
 import org.apache.skywalking.apm.collector.client.h2.H2Client;
 import org.apache.skywalking.apm.collector.core.storage.TimePyramid;
diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCMonthMetricH2PersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCMonthMetricH2PersistenceDAO.java
similarity index 96%
rename from apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCMonthMetricH2PersistenceDAO.java
rename to apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCMonthMetricH2PersistenceDAO.java
index ec555d4..75d711e 100644
--- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gcmp/GCMonthMetricH2PersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/gc/GCMonthMetricH2PersistenceDAO.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.apm.collector.storage.h2.dao.gcmp;
+package org.apache.skywalking.apm.collector.storage.h2.dao.gc;
 
 import org.apache.skywalking.apm.collector.client.h2.H2Client;
 import org.apache.skywalking.apm.collector.core.storage.TimePyramid;
diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ApplicationMetricH2UIDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ApplicationMetricH2UIDAO.java
index 4dac872..5c4f2bc 100644
--- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ApplicationMetricH2UIDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/ApplicationMetricH2UIDAO.java
@@ -24,7 +24,7 @@ import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMetricUIDA
 import org.apache.skywalking.apm.collector.storage.h2.base.dao.H2DAO;
 import org.apache.skywalking.apm.collector.storage.table.MetricSource;
 import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.overview.ApplicationTPS;
+import org.apache.skywalking.apm.collector.storage.ui.overview.ApplicationThroughput;
 
 /**
  * @author peng-yongsheng
@@ -36,8 +36,8 @@ public class ApplicationMetricH2UIDAO extends H2DAO implements IApplicationMetri
     }
 
     @Override
-    public List<ApplicationTPS> getTopNApplicationThroughput(Step step, long startTimeBucket, long endTimeBucket,
-        int betweenSecond, int topN, MetricSource metricSource) {
+    public List<ApplicationThroughput> getTopNApplicationThroughput(Step step, long startTimeBucket, long endTimeBucket,
+        int minutesBetween, int topN, MetricSource metricSource) {
         return null;
     }
 
diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/GCMetricH2UIDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/GCMetricH2UIDAO.java
index e3aa9df..6975adb 100644
--- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/GCMetricH2UIDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/GCMetricH2UIDAO.java
@@ -18,23 +18,18 @@
 
 package org.apache.skywalking.apm.collector.storage.h2.dao.ui;
 
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.LinkedList;
-import java.util.List;
-import org.apache.skywalking.apm.collector.client.h2.H2Client;
-import org.apache.skywalking.apm.collector.client.h2.H2ClientException;
+import java.sql.*;
+import java.util.*;
+import org.apache.skywalking.apm.collector.client.h2.*;
 import org.apache.skywalking.apm.collector.core.util.Const;
 import org.apache.skywalking.apm.collector.storage.base.sql.SqlBuilder;
 import org.apache.skywalking.apm.collector.storage.dao.ui.IGCMetricUIDAO;
 import org.apache.skywalking.apm.collector.storage.h2.base.dao.H2DAO;
 import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetricTable;
 import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.utils.DurationPoint;
-import org.apache.skywalking.apm.collector.storage.utils.TimePyramidTableNameBuilder;
+import org.apache.skywalking.apm.collector.storage.utils.*;
 import org.apache.skywalking.apm.network.proto.GCPhrase;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.slf4j.*;
 
 /**
  * @author peng-yongsheng, clevertension
@@ -48,33 +43,35 @@ public class GCMetricH2UIDAO extends H2DAO implements IGCMetricUIDAO {
         super(client);
     }
 
-    @Override public List<Integer> getYoungGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
+    @Override public List<Trend> getYoungGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
         return getGCTrend(instanceId, step, durationPoints, GCPhrase.NEW_VALUE);
     }
 
-    @Override public List<Integer> getOldGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
+    @Override public List<Trend> getOldGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
         return getGCTrend(instanceId, step, durationPoints, GCPhrase.OLD_VALUE);
     }
 
-    private List<Integer> getGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints, int gcPhrase) {
+    private List<Trend> getGCTrend(int instanceId, Step step, List<DurationPoint> durationPoints, int gcPhrase) {
         String tableName = TimePyramidTableNameBuilder.build(step, GCMetricTable.TABLE);
 
         H2Client client = getClient();
         String sql = SqlBuilder.buildSql(GET_GC_METRIC_SQL, tableName, GCMetricTable.ID.getName());
 
-        List<Integer> gcTrends = new LinkedList<>();
+        List<Trend> gcTrends = new LinkedList<>();
         durationPoints.forEach(durationPoint -> {
             String id = durationPoint.getPoint() + Const.ID_SPLIT + instanceId + Const.ID_SPLIT + gcPhrase;
             try (ResultSet rs = client.executeQuery(sql, new String[] {id})) {
                 if (rs.next()) {
                     long count = rs.getLong(GCMetricTable.COUNT.getName());
+                    long duration = rs.getLong(GCMetricTable.DURATION.getName());
                     long times = rs.getLong(GCMetricTable.TIMES.getName());
-                    gcTrends.add((int)(count / times));
+                    gcTrends.add(new Trend((int)(count / times), (int)(duration / times)));
                 } else {
-                    gcTrends.add(0);
+                    gcTrends.add(new Trend(0, 0));
                 }
             } catch (SQLException | H2ClientException e) {
                 logger.error(e.getMessage(), e);
+                gcTrends.add(new Trend(0, 0));
             }
         });
 
diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/InstanceMetricH2UIDAO.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/InstanceMetricH2UIDAO.java
index a2913a1..84115ef 100644
--- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/InstanceMetricH2UIDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/dao/ui/InstanceMetricH2UIDAO.java
@@ -18,12 +18,9 @@
 
 package org.apache.skywalking.apm.collector.storage.h2.dao.ui;
 
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.LinkedList;
-import java.util.List;
-import org.apache.skywalking.apm.collector.client.h2.H2Client;
-import org.apache.skywalking.apm.collector.client.h2.H2ClientException;
+import java.sql.*;
+import java.util.*;
+import org.apache.skywalking.apm.collector.client.h2.*;
 import org.apache.skywalking.apm.collector.core.util.Const;
 import org.apache.skywalking.apm.collector.storage.base.sql.SqlBuilder;
 import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceMetricUIDAO;
@@ -32,10 +29,8 @@ import org.apache.skywalking.apm.collector.storage.table.MetricSource;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetricTable;
 import org.apache.skywalking.apm.collector.storage.ui.common.Step;
 import org.apache.skywalking.apm.collector.storage.ui.server.AppServerInfo;
-import org.apache.skywalking.apm.collector.storage.utils.DurationPoint;
-import org.apache.skywalking.apm.collector.storage.utils.TimePyramidTableNameBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.skywalking.apm.collector.storage.utils.*;
+import org.slf4j.*;
 
 /**
  * @author peng-yongsheng, clevertension
@@ -49,12 +44,14 @@ public class InstanceMetricH2UIDAO extends H2DAO implements IInstanceMetricUIDAO
         super(client);
     }
 
-    @Override public List<AppServerInfo> getServerThroughput(int applicationId, Step step, long startTimeBucket, long endTimeBucket,
-        int secondBetween, int topN, MetricSource metricSource) {
+    @Override public List<AppServerInfo> getServerThroughput(int applicationId, Step step, long startTimeBucket,
+        long endTimeBucket,
+        int minutesBetween, int topN, MetricSource metricSource) {
         return null;
     }
 
-    @Override public List<Integer> getServerTPSTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
+    @Override
+    public List<Integer> getServerThroughputTrend(int instanceId, Step step, List<DurationPoint> durationPoints) {
         H2Client client = getClient();
         String tableName = TimePyramidTableNameBuilder.build(step, InstanceMetricTable.TABLE);
 
@@ -66,7 +63,7 @@ public class InstanceMetricH2UIDAO extends H2DAO implements IInstanceMetricUIDAO
             try (ResultSet rs = client.executeQuery(sql, new Object[] {id})) {
                 if (rs.next()) {
                     long callTimes = rs.getLong(InstanceMetricTable.TRANSACTION_CALLS.getName());
-                    throughputTrend.add((int)(callTimes / durationPoint.getSecondsBetween()));
+                    throughputTrend.add((int)(callTimes / durationPoint.getMinutesBetween()));
                 } else {
                     throughputTrend.add(0);
                 }
@@ -91,7 +88,7 @@ public class InstanceMetricH2UIDAO extends H2DAO implements IInstanceMetricUIDAO
                 if (rs.next()) {
                     long callTimes = rs.getLong(InstanceMetricTable.TRANSACTION_CALLS.getName());
                     long durationSum = rs.getLong(InstanceMetricTable.TRANSACTION_DURATION_SUM.getName());
-                    responseTimeTrends.add((int) (durationSum / callTimes));
+                    responseTimeTrends.add((int)(durationSum / callTimes));
                 } else {
                     responseTimeTrends.add(0);
                 }
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 0ca58b8..ca8e85b 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
@@ -18,26 +18,19 @@
 
 package org.apache.skywalking.apm.collector.storage.h2.dao.ui;
 
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-import org.apache.skywalking.apm.collector.client.h2.H2Client;
-import org.apache.skywalking.apm.collector.client.h2.H2ClientException;
+import java.sql.*;
+import java.util.*;
+import org.apache.skywalking.apm.collector.client.h2.*;
 import org.apache.skywalking.apm.collector.core.util.Const;
 import org.apache.skywalking.apm.collector.storage.base.sql.SqlBuilder;
 import org.apache.skywalking.apm.collector.storage.dao.ui.IServiceMetricUIDAO;
 import org.apache.skywalking.apm.collector.storage.h2.base.dao.H2DAO;
 import org.apache.skywalking.apm.collector.storage.table.MetricSource;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetricTable;
-import org.apache.skywalking.apm.collector.storage.ui.common.Node;
-import org.apache.skywalking.apm.collector.storage.ui.common.Step;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
 import org.apache.skywalking.apm.collector.storage.ui.service.ServiceMetric;
-import org.apache.skywalking.apm.collector.storage.utils.DurationPoint;
-import org.apache.skywalking.apm.collector.storage.utils.TimePyramidTableNameBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.skywalking.apm.collector.storage.utils.*;
+import org.slf4j.*;
 
 /**
  * @author peng-yongsheng
@@ -66,7 +59,7 @@ public class ServiceMetricH2UIDAO extends H2DAO implements IServiceMetricUIDAO {
                 if (rs.next()) {
                     long calls = rs.getLong(ServiceMetricTable.TRANSACTION_CALLS.getName());
                     long durationSum = rs.getLong(ServiceMetricTable.TRANSACTION_DURATION_SUM.getName());
-                    trends.add((int) (durationSum / calls));
+                    trends.add((int)(durationSum / calls));
                 } else {
                     trends.add(0);
                 }
@@ -78,7 +71,8 @@ public class ServiceMetricH2UIDAO extends H2DAO implements IServiceMetricUIDAO {
         return trends;
     }
 
-    @Override public List<Integer> getServiceTPSTrend(int serviceId, Step step, List<DurationPoint> durationPoints) {
+    @Override
+    public List<Integer> getServiceThroughputTrend(int serviceId, Step step, List<DurationPoint> durationPoints) {
         return null;
     }
 
@@ -109,12 +103,15 @@ public class ServiceMetricH2UIDAO extends H2DAO implements IServiceMetricUIDAO {
         return trends;
     }
 
-    @Override public List<Node> getServicesMetric(Step step, long startTimeBucket, long endTimeBucket, MetricSource metricSource,
+    @Override
+    public List<Node> getServicesMetric(Step step, long startTimeBucket, long endTimeBucket, MetricSource metricSource,
         Collection<Integer> serviceIds) {
         return null;
     }
 
-    @Override public List<ServiceMetric> getSlowService(int applicationId, Step step, long startTimeBucket, long endTimeBucket, Integer topN,
+    @Override
+    public List<ServiceMetric> getSlowService(int applicationId, Step step, long startTimeBucket, long endTimeBucket,
+        Integer topN,
         MetricSource metricSource) {
         return null;
     }
diff --git a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/define/gc/AbstractGCMetricH2TableDefine.java b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/define/gc/AbstractGCMetricH2TableDefine.java
index a9655b5..78f4603 100644
--- a/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/define/gc/AbstractGCMetricH2TableDefine.java
+++ b/apm-collector/apm-collector-storage/collector-storage-h2-provider/src/main/java/org/apache/skywalking/apm/collector/storage/h2/define/gc/AbstractGCMetricH2TableDefine.java
@@ -18,8 +18,7 @@
 
 package org.apache.skywalking.apm.collector.storage.h2.define.gc;
 
-import org.apache.skywalking.apm.collector.storage.h2.base.define.H2ColumnDefine;
-import org.apache.skywalking.apm.collector.storage.h2.base.define.H2TableDefine;
+import org.apache.skywalking.apm.collector.storage.h2.base.define.*;
 import org.apache.skywalking.apm.collector.storage.table.jvm.GCMetricTable;
 
 /**
@@ -37,6 +36,7 @@ public abstract class AbstractGCMetricH2TableDefine extends H2TableDefine {
         addColumn(new H2ColumnDefine(GCMetricTable.INSTANCE_ID, H2ColumnDefine.Type.Int.name()));
         addColumn(new H2ColumnDefine(GCMetricTable.PHRASE, H2ColumnDefine.Type.Int.name()));
         addColumn(new H2ColumnDefine(GCMetricTable.COUNT, H2ColumnDefine.Type.Bigint.name()));
+        addColumn(new H2ColumnDefine(GCMetricTable.DURATION, H2ColumnDefine.Type.Bigint.name()));
         addColumn(new H2ColumnDefine(GCMetricTable.TIMES, H2ColumnDefine.Type.Bigint.name()));
         addColumn(new H2ColumnDefine(GCMetricTable.TIME_BUCKET, H2ColumnDefine.Type.Bigint.name()));
     }
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/OverViewLayerQuery.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/OverViewLayerQuery.java
index 0e1bd9d..dcfd4d1 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/OverViewLayerQuery.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/OverViewLayerQuery.java
@@ -25,7 +25,7 @@ import org.apache.skywalking.apm.collector.storage.ui.common.Duration;
 import org.apache.skywalking.apm.collector.storage.ui.common.Topology;
 import org.apache.skywalking.apm.collector.storage.ui.common.ValueType;
 import org.apache.skywalking.apm.collector.storage.ui.overview.AlarmTrend;
-import org.apache.skywalking.apm.collector.storage.ui.overview.ApplicationTPS;
+import org.apache.skywalking.apm.collector.storage.ui.overview.ApplicationThroughput;
 import org.apache.skywalking.apm.collector.storage.ui.overview.ClusterBrief;
 import org.apache.skywalking.apm.collector.storage.ui.overview.ConjecturalAppBrief;
 import org.apache.skywalking.apm.collector.storage.ui.overview.Thermodynamic;
@@ -150,7 +150,7 @@ public class OverViewLayerQuery implements Query {
         return getServiceNameService().getSlowService(duration.getStep(), startTimeBucket, endTimeBucket, startSecondTimeBucket, endSecondTimeBucket, topN);
     }
 
-    public List<ApplicationTPS> getTopNApplicationThroughput(Duration duration,
+    public List<ApplicationThroughput> getTopNApplicationThroughput(Duration duration,
         int topN) throws ParseException {
         long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
         long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/ServerQuery.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/ServerQuery.java
index 22bd5dc..b8f1b9d 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/ServerQuery.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/ServerQuery.java
@@ -18,21 +18,15 @@
 
 package org.apache.skywalking.apm.collector.ui.query;
 
+import java.text.ParseException;
+import java.util.List;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
-import org.apache.skywalking.apm.collector.storage.ui.common.Duration;
-import org.apache.skywalking.apm.collector.storage.ui.common.ResponseTimeTrend;
-import org.apache.skywalking.apm.collector.storage.ui.common.ThroughputTrend;
-import org.apache.skywalking.apm.collector.storage.ui.server.AppServerInfo;
-import org.apache.skywalking.apm.collector.storage.ui.server.CPUTrend;
-import org.apache.skywalking.apm.collector.storage.ui.server.GCTrend;
-import org.apache.skywalking.apm.collector.storage.ui.server.MemoryTrend;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
+import org.apache.skywalking.apm.collector.storage.ui.server.*;
 import org.apache.skywalking.apm.collector.ui.graphql.Query;
 import org.apache.skywalking.apm.collector.ui.service.ServerService;
 import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
 
-import java.text.ParseException;
-import java.util.List;
-
 import static java.util.Objects.isNull;
 
 /**
@@ -54,13 +48,13 @@ public class ServerQuery implements Query {
         return serverService;
     }
 
-    public List<AppServerInfo> searchServer(String keyword, Duration duration) throws ParseException {
+    public List<AppServerInfo> searchServer(String keyword, Duration duration) {
         long startSecondTimeBucket = DurationUtils.INSTANCE.startTimeDurationToSecondTimeBucket(duration.getStep(), duration.getStart());
         long endSecondTimeBucket = DurationUtils.INSTANCE.endTimeDurationToSecondTimeBucket(duration.getStep(), duration.getEnd());
         return getServerService().searchServer(keyword, startSecondTimeBucket, endSecondTimeBucket);
     }
 
-    public List<AppServerInfo> getAllServer(int applicationId, Duration duration) throws ParseException {
+    public List<AppServerInfo> getAllServer(int applicationId, Duration duration) {
         long startSecondTimeBucket = DurationUtils.INSTANCE.startTimeDurationToSecondTimeBucket(duration.getStep(), duration.getStart());
         long endSecondTimeBucket = DurationUtils.INSTANCE.endTimeDurationToSecondTimeBucket(duration.getStep(), duration.getEnd());
         return getServerService().getAllServer(applicationId, startSecondTimeBucket, endSecondTimeBucket);
@@ -72,10 +66,10 @@ public class ServerQuery implements Query {
         return getServerService().getServerResponseTimeTrend(serverId, duration.getStep(), startTimeBucket, endTimeBucket);
     }
 
-    public ThroughputTrend getServerTPSTrend(int serverId, Duration duration) throws ParseException {
+    public ThroughputTrend getServerThroughputTrend(int serverId, Duration duration) throws ParseException {
         long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
         long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
-        return getServerService().getServerTPSTrend(serverId, duration.getStep(), startTimeBucket, endTimeBucket);
+        return getServerService().getServerThroughputTrend(serverId, duration.getStep(), startTimeBucket, endTimeBucket);
     }
 
     public CPUTrend getCPUTrend(int serverId, Duration duration) throws ParseException {
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 3e1ff63..05d9d96 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
@@ -68,11 +68,11 @@ public class ServiceQuery implements Query {
         return getServiceNameService().getServiceResponseTimeTrend(serviceId, duration.getStep(), startTimeBucket, endTimeBucket);
     }
 
-    public ThroughputTrend getServiceTPSTrend(int serviceId, Duration duration) throws ParseException {
+    public ThroughputTrend getServiceThroughputTrend(int serviceId, Duration duration) throws ParseException {
         long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
         long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
 
-        return getServiceNameService().getServiceTPSTrend(serviceId, duration.getStep(), startTimeBucket, endTimeBucket);
+        return getServiceNameService().getServiceThroughputTrend(serviceId, duration.getStep(), startTimeBucket, endTimeBucket);
     }
 
     public SLATrend getServiceSLATrend(int serviceId, Duration duration) throws ParseException {
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationService.java
index 95828f8..8dc09e7 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationService.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ApplicationService.java
@@ -21,28 +21,21 @@ package org.apache.skywalking.apm.collector.ui.service;
 import java.text.ParseException;
 import java.util.List;
 import org.apache.skywalking.apm.collector.cache.CacheModule;
-import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService;
-import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService;
+import org.apache.skywalking.apm.collector.cache.service.*;
 import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
 import org.apache.skywalking.apm.collector.configuration.service.IComponentLibraryCatalogService;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.core.util.Const;
 import org.apache.skywalking.apm.collector.storage.StorageModule;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.INetworkAddressUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IServiceMetricUIDAO;
+import org.apache.skywalking.apm.collector.storage.dao.ui.*;
 import org.apache.skywalking.apm.collector.storage.table.MetricSource;
 import org.apache.skywalking.apm.collector.storage.table.register.ServiceName;
 import org.apache.skywalking.apm.collector.storage.ui.application.Application;
 import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.overview.ApplicationTPS;
-import org.apache.skywalking.apm.collector.storage.ui.overview.ConjecturalApp;
-import org.apache.skywalking.apm.collector.storage.ui.overview.ConjecturalAppBrief;
+import org.apache.skywalking.apm.collector.storage.ui.overview.*;
 import org.apache.skywalking.apm.collector.storage.ui.service.ServiceMetric;
 import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.slf4j.*;
 
 /**
  * @author peng-yongsheng
@@ -57,7 +50,7 @@ public class ApplicationService {
     private final INetworkAddressUIDAO networkAddressUIDAO;
     private final ApplicationCacheService applicationCacheService;
     private final ServiceNameCacheService serviceNameCacheService;
-    private final SecondBetweenService secondBetweenService;
+    private final DateBetweenService dateBetweenService;
     private final IComponentLibraryCatalogService componentLibraryCatalogService;
 
     public ApplicationService(ModuleManager moduleManager) {
@@ -68,7 +61,7 @@ public class ApplicationService {
         this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class);
         this.serviceNameCacheService = moduleManager.find(CacheModule.NAME).getService(ServiceNameCacheService.class);
         this.componentLibraryCatalogService = moduleManager.find(ConfigurationModule.NAME).getService(IComponentLibraryCatalogService.class);
-        this.secondBetweenService = new SecondBetweenService(moduleManager);
+        this.dateBetweenService = new DateBetweenService(moduleManager);
     }
 
     public List<Application> getApplications(long startSecondTimeBucket, long endSecondTimeBucket,
@@ -90,13 +83,13 @@ public class ApplicationService {
     }
 
     public List<ServiceMetric> getSlowService(int applicationId, Step step, long startTimeBucket, long endTimeBucket,
-        long startSecondTimeBucket, long endSecondTimeBucket, Integer topN) throws ParseException {
+        long startSecondTimeBucket, long endSecondTimeBucket, Integer topN) {
         List<ServiceMetric> slowServices = serviceMetricUIDAO.getSlowService(applicationId, step, startTimeBucket, endTimeBucket, topN, MetricSource.Callee);
         slowServices.forEach(slowService -> {
             ServiceName serviceName = serviceNameCacheService.get(slowService.getId());
 
             try {
-                slowService.setCallsPerSec((int)(slowService.getCalls() / secondBetweenService.calculate(serviceName.getApplicationId(), startSecondTimeBucket, endSecondTimeBucket)));
+                slowService.setCpm((int)(slowService.getCalls() / dateBetweenService.minutesBetween(serviceName.getApplicationId(), startSecondTimeBucket, endSecondTimeBucket)));
             } catch (ParseException e) {
                 logger.error(e.getMessage(), e);
             }
@@ -105,19 +98,19 @@ public class ApplicationService {
         return slowServices;
     }
 
-    public List<ApplicationTPS> getTopNApplicationThroughput(Step step, long startTimeBucket, long endTimeBucket,
+    public List<ApplicationThroughput> getTopNApplicationThroughput(Step step, long startTimeBucket, long endTimeBucket,
         int topN) throws ParseException {
-        int secondsBetween = DurationUtils.INSTANCE.secondsBetween(step, startTimeBucket, endTimeBucket);
-        List<ApplicationTPS> applicationThroughput = applicationMetricUIDAO.getTopNApplicationThroughput(step, startTimeBucket, endTimeBucket, secondsBetween, topN, MetricSource.Callee);
-        applicationThroughput.forEach(applicationTPS -> {
-            String applicationCode = applicationCacheService.getApplicationById(applicationTPS.getApplicationId()).getApplicationCode();
-            applicationTPS.setApplicationCode(applicationCode);
+        int minutesBetween = DurationUtils.INSTANCE.minutesBetween(step, startTimeBucket, endTimeBucket);
+        List<ApplicationThroughput> applicationThroughputList = applicationMetricUIDAO.getTopNApplicationThroughput(step, startTimeBucket, endTimeBucket, minutesBetween, topN, MetricSource.Callee);
+        applicationThroughputList.forEach(applicationThroughput -> {
+            String applicationCode = applicationCacheService.getApplicationById(applicationThroughput.getApplicationId()).getApplicationCode();
+            applicationThroughput.setApplicationCode(applicationCode);
         });
-        return applicationThroughput;
+        return applicationThroughputList;
     }
 
     public ConjecturalAppBrief getConjecturalApps(Step step, long startSecondTimeBucket,
-        long endSecondTimeBucket) throws ParseException {
+        long endSecondTimeBucket) {
         List<ConjecturalApp> conjecturalApps = networkAddressUIDAO.getConjecturalApps();
         conjecturalApps.forEach(conjecturalApp -> {
             String serverType = componentLibraryCatalogService.getServerName(conjecturalApp.getId());
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ClusterTopologyService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ClusterTopologyService.java
index 372f15b..6616df6 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ClusterTopologyService.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ClusterTopologyService.java
@@ -18,23 +18,15 @@
 
 package org.apache.skywalking.apm.collector.ui.service;
 
-import java.text.ParseException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
 import org.apache.skywalking.apm.collector.configuration.service.IComponentLibraryCatalogService;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.storage.StorageModule;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationComponentUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMappingUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationReferenceMetricUIDAO;
+import org.apache.skywalking.apm.collector.storage.dao.ui.*;
 import org.apache.skywalking.apm.collector.storage.table.MetricSource;
-import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.common.Topology;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
+import org.slf4j.*;
 
 /**
  * @author peng-yongsheng
@@ -60,7 +52,7 @@ public class ClusterTopologyService {
     }
 
     public Topology getClusterTopology(Step step, long startTimeBucket, long endTimeBucket, long startSecondTimeBucket,
-        long endSecondTimeBucket) throws ParseException {
+        long endSecondTimeBucket) {
         logger.debug("startTimeBucket: {}, endTimeBucket: {}, startSecondTimeBucket: {}, endSecondTimeBucket: {}", startTimeBucket, endTimeBucket, startSecondTimeBucket, endSecondTimeBucket);
         List<IApplicationComponentUIDAO.ApplicationComponent> applicationComponents = applicationComponentUIDAO.load(step, startTimeBucket, endTimeBucket);
         List<IApplicationMappingUIDAO.ApplicationMapping> applicationMappings = applicationMappingUIDAO.load(step, startTimeBucket, endTimeBucket);
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/SecondBetweenService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/DateBetweenService.java
similarity index 65%
rename from apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/SecondBetweenService.java
rename to apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/DateBetweenService.java
index 63de261..140073f 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/SecondBetweenService.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/DateBetweenService.java
@@ -18,27 +18,25 @@
 
 package org.apache.skywalking.apm.collector.ui.service;
 
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
+import java.text.*;
 import java.util.Date;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.storage.StorageModule;
 import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceUIDAO;
-import org.joda.time.DateTime;
-import org.joda.time.Seconds;
+import org.joda.time.*;
 
 /**
  * @author peng-yongsheng
  */
-class SecondBetweenService {
+class DateBetweenService {
 
     private final IInstanceUIDAO instanceUIDAO;
 
-    SecondBetweenService(ModuleManager moduleManager) {
+    DateBetweenService(ModuleManager moduleManager) {
         this.instanceUIDAO = moduleManager.find(StorageModule.NAME).getService(IInstanceUIDAO.class);
     }
 
-    int calculate(int applicationId, long startSecondTimeBucket,
+    int secondsBetween(int applicationId, long startSecondTimeBucket,
         long endSecondTimeBucket) throws ParseException {
         long registerTime = instanceUIDAO.getEarliestRegisterTime(applicationId);
         if (startSecondTimeBucket < registerTime) {
@@ -59,4 +57,26 @@ class SecondBetweenService {
         }
         return seconds;
     }
+
+    int minutesBetween(int applicationId, long startSecondTimeBucket,
+        long endSecondTimeBucket) throws ParseException {
+        long registerTime = instanceUIDAO.getEarliestRegisterTime(applicationId);
+        if (startSecondTimeBucket < registerTime) {
+            startSecondTimeBucket = registerTime;
+        }
+
+        long heartBeatTime = instanceUIDAO.getLatestHeartBeatTime(applicationId);
+        if (endSecondTimeBucket > heartBeatTime) {
+            endSecondTimeBucket = heartBeatTime;
+        }
+
+        Date startDate = new SimpleDateFormat("yyyyMMddHHmmss").parse(String.valueOf(startSecondTimeBucket));
+        Date endDate = new SimpleDateFormat("yyyyMMddHHmmss").parse(String.valueOf(endSecondTimeBucket));
+
+        int minutes = Minutes.minutesBetween(new DateTime(startDate), new DateTime(endDate)).getMinutes();
+        if (minutes == 0) {
+            minutes = 1;
+        }
+        return minutes;
+    }
 }
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServerService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServerService.java
index 6ddc2d0..9e67813 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServerService.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServerService.java
@@ -18,33 +18,19 @@
 
 package org.apache.skywalking.apm.collector.ui.service;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
+import com.google.gson.*;
 import java.text.ParseException;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 import org.apache.skywalking.apm.collector.cache.CacheModule;
-import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService;
-import org.apache.skywalking.apm.collector.cache.service.InstanceCacheService;
+import org.apache.skywalking.apm.collector.cache.service.*;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
-import org.apache.skywalking.apm.collector.core.util.Const;
-import org.apache.skywalking.apm.collector.core.util.StringUtils;
+import org.apache.skywalking.apm.collector.core.util.*;
 import org.apache.skywalking.apm.collector.storage.StorageModule;
-import org.apache.skywalking.apm.collector.storage.dao.ui.ICpuMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IGCMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IMemoryMetricUIDAO;
+import org.apache.skywalking.apm.collector.storage.dao.ui.*;
 import org.apache.skywalking.apm.collector.storage.table.MetricSource;
 import org.apache.skywalking.apm.collector.storage.table.register.Instance;
-import org.apache.skywalking.apm.collector.storage.ui.common.ResponseTimeTrend;
-import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.common.ThroughputTrend;
-import org.apache.skywalking.apm.collector.storage.ui.server.AppServerInfo;
-import org.apache.skywalking.apm.collector.storage.ui.server.CPUTrend;
-import org.apache.skywalking.apm.collector.storage.ui.server.GCTrend;
-import org.apache.skywalking.apm.collector.storage.ui.server.MemoryTrend;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
+import org.apache.skywalking.apm.collector.storage.ui.server.*;
 import org.apache.skywalking.apm.collector.storage.utils.DurationPoint;
 import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
 
@@ -61,7 +47,7 @@ public class ServerService {
     private final IMemoryMetricUIDAO memoryMetricUIDAO;
     private final ApplicationCacheService applicationCacheService;
     private final InstanceCacheService instanceCacheService;
-    private final SecondBetweenService secondBetweenService;
+    private final DateBetweenService dateBetweenService;
 
     public ServerService(ModuleManager moduleManager) {
         this.instanceUIDAO = moduleManager.find(StorageModule.NAME).getService(IInstanceUIDAO.class);
@@ -71,7 +57,7 @@ public class ServerService {
         this.memoryMetricUIDAO = moduleManager.find(StorageModule.NAME).getService(IMemoryMetricUIDAO.class);
         this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class);
         this.instanceCacheService = moduleManager.find(CacheModule.NAME).getService(InstanceCacheService.class);
-        this.secondBetweenService = new SecondBetweenService(moduleManager);
+        this.dateBetweenService = new DateBetweenService(moduleManager);
     }
 
     public List<AppServerInfo> searchServer(String keyword, long startSecondTimeBucket, long endSecondTimeBucket) {
@@ -104,9 +90,9 @@ public class ServerService {
 
     public List<AppServerInfo> getServerThroughput(int applicationId, Step step, long startTimeBucket,
         long endTimeBucket, long startSecondTimeBucket, long endSecondTimeBucket, Integer topN) throws ParseException {
-        int secondBetween = secondBetweenService.calculate(applicationId, startSecondTimeBucket, endSecondTimeBucket);
+        int minutesBetween = dateBetweenService.minutesBetween(applicationId, startSecondTimeBucket, endSecondTimeBucket);
 
-        List<AppServerInfo> serverThroughput = instanceMetricUIDAO.getServerThroughput(applicationId, step, startTimeBucket, endTimeBucket, secondBetween, topN, MetricSource.Callee);
+        List<AppServerInfo> serverThroughput = instanceMetricUIDAO.getServerThroughput(applicationId, step, startTimeBucket, endTimeBucket, minutesBetween, topN, MetricSource.Callee);
         serverThroughput.forEach(appServerInfo -> {
             appServerInfo.setApplicationId(instanceCacheService.getApplicationId(appServerInfo.getId()));
             String applicationCode = applicationCacheService.getApplicationById(appServerInfo.getApplicationId()).getApplicationCode();
@@ -119,11 +105,11 @@ public class ServerService {
         return serverThroughput;
     }
 
-    public ThroughputTrend getServerTPSTrend(int instanceId, Step step, long startTimeBucket,
+    public ThroughputTrend getServerThroughputTrend(int instanceId, Step step, long startTimeBucket,
         long endTimeBucket) throws ParseException {
         ThroughputTrend throughputTrend = new ThroughputTrend();
         List<DurationPoint> durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, startTimeBucket, endTimeBucket);
-        List<Integer> trends = instanceMetricUIDAO.getServerTPSTrend(instanceId, step, durationPoints);
+        List<Integer> trends = instanceMetricUIDAO.getServerThroughputTrend(instanceId, step, durationPoints);
         throughputTrend.setTrendList(trends);
         return throughputTrend;
     }
@@ -141,10 +127,18 @@ public class ServerService {
         long endTimeBucket) throws ParseException {
         GCTrend gcTrend = new GCTrend();
         List<DurationPoint> durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, startTimeBucket, endTimeBucket);
-        List<Integer> youngGCTrend = gcMetricUIDAO.getYoungGCTrend(instanceId, step, durationPoints);
-        gcTrend.setYoungGC(youngGCTrend);
-        List<Integer> oldGCTrend = gcMetricUIDAO.getOldGCTrend(instanceId, step, durationPoints);
-        gcTrend.setOldGC(oldGCTrend);
+        List<IGCMetricUIDAO.Trend> youngGCTrend = gcMetricUIDAO.getYoungGCTrend(instanceId, step, durationPoints);
+        youngGCTrend.forEach(young -> {
+            gcTrend.getYoungGCCount().add(young.getAverageCount());
+            gcTrend.getYoungGCTime().add(young.getAverageDuration());
+        });
+
+        List<IGCMetricUIDAO.Trend> oldGCTrend = gcMetricUIDAO.getOldGCTrend(instanceId, step, durationPoints);
+        oldGCTrend.forEach(old -> {
+            gcTrend.getOldGCount().add(old.getAverageCount());
+            gcTrend.getOldGCTime().add(old.getAverageDuration());
+        });
+
         return gcTrend;
     }
 
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 36535ee..73cd0ad 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
@@ -24,20 +24,14 @@ import org.apache.skywalking.apm.collector.cache.CacheModule;
 import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 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.dao.ui.*;
 import org.apache.skywalking.apm.collector.storage.table.MetricSource;
 import org.apache.skywalking.apm.collector.storage.table.register.ServiceName;
-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.common.ThroughputTrend;
-import org.apache.skywalking.apm.collector.storage.ui.service.ServiceInfo;
-import org.apache.skywalking.apm.collector.storage.ui.service.ServiceMetric;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
+import org.apache.skywalking.apm.collector.storage.ui.service.*;
 import org.apache.skywalking.apm.collector.storage.utils.DurationPoint;
 import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.slf4j.*;
 
 /**
  * @author peng-yongsheng
@@ -49,13 +43,13 @@ public class ServiceNameService {
     private final IServiceNameServiceUIDAO serviceNameServiceUIDAO;
     private final IServiceMetricUIDAO serviceMetricUIDAO;
     private final ServiceNameCacheService serviceNameCacheService;
-    private final SecondBetweenService secondBetweenService;
+    private final DateBetweenService dateBetweenService;
 
     public ServiceNameService(ModuleManager moduleManager) {
         this.serviceNameServiceUIDAO = moduleManager.find(StorageModule.NAME).getService(IServiceNameServiceUIDAO.class);
         this.serviceMetricUIDAO = moduleManager.find(StorageModule.NAME).getService(IServiceMetricUIDAO.class);
         this.serviceNameCacheService = moduleManager.find(CacheModule.NAME).getService(ServiceNameCacheService.class);
-        this.secondBetweenService = new SecondBetweenService(moduleManager);
+        this.dateBetweenService = new DateBetweenService(moduleManager);
     }
 
     public int getCount() {
@@ -66,11 +60,11 @@ public class ServiceNameService {
         return serviceNameServiceUIDAO.searchService(keyword, topN);
     }
 
-    public ThroughputTrend getServiceTPSTrend(int serviceId, Step step, long startTimeBucket,
+    public ThroughputTrend getServiceThroughputTrend(int serviceId, Step step, long startTimeBucket,
         long endTimeBucket) throws ParseException {
         ThroughputTrend throughputTrend = new ThroughputTrend();
         List<DurationPoint> durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, startTimeBucket, endTimeBucket);
-        List<Integer> throughputTrends = serviceMetricUIDAO.getServiceTPSTrend(serviceId, step, durationPoints);
+        List<Integer> throughputTrends = serviceMetricUIDAO.getServiceThroughputTrend(serviceId, step, durationPoints);
         throughputTrend.setTrendList(throughputTrends);
         return throughputTrend;
     }
@@ -92,14 +86,13 @@ public class ServiceNameService {
     }
 
     public List<ServiceMetric> getSlowService(Step step, long startTimeBucket, long endTimeBucket,
-        long startSecondTimeBucket, long endSecondTimeBucket,
-        Integer topN) throws ParseException {
+        long startSecondTimeBucket, long endSecondTimeBucket, Integer topN) {
         List<ServiceMetric> slowServices = serviceMetricUIDAO.getSlowService(0, step, startTimeBucket, endTimeBucket, topN, MetricSource.Callee);
         slowServices.forEach(slowService -> {
             ServiceName serviceName = serviceNameCacheService.get(slowService.getId());
             slowService.setName(serviceName.getServiceName());
             try {
-                slowService.setCallsPerSec((int)(slowService.getCalls() / secondBetweenService.calculate(serviceName.getApplicationId(), startSecondTimeBucket, endSecondTimeBucket)));
+                slowService.setCpm((int)(slowService.getCalls() / dateBetweenService.minutesBetween(serviceName.getApplicationId(), startSecondTimeBucket, endSecondTimeBucket)));
             } catch (ParseException e) {
                 logger.error(e.getMessage(), e);
             }
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyService.java
index 296bebc..7e7ba8d 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyService.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyService.java
@@ -19,12 +19,7 @@
 package org.apache.skywalking.apm.collector.ui.service;
 
 import java.text.ParseException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import org.apache.skywalking.apm.collector.cache.CacheModule;
 import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService;
 import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
@@ -32,18 +27,11 @@ import org.apache.skywalking.apm.collector.configuration.service.IComponentLibra
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.core.util.Const;
 import org.apache.skywalking.apm.collector.storage.StorageModule;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationComponentUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IServiceMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IServiceReferenceMetricUIDAO;
+import org.apache.skywalking.apm.collector.storage.dao.ui.*;
 import org.apache.skywalking.apm.collector.storage.table.MetricSource;
 import org.apache.skywalking.apm.collector.storage.table.register.ServiceName;
-import org.apache.skywalking.apm.collector.storage.ui.common.Call;
-import org.apache.skywalking.apm.collector.storage.ui.common.Node;
-import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.common.Topology;
-import org.apache.skywalking.apm.collector.storage.ui.common.VisualUserNode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
+import org.slf4j.*;
 
 /**
  * @author peng-yongsheng
@@ -56,7 +44,7 @@ public class ServiceTopologyService {
     private final IServiceMetricUIDAO serviceMetricUIDAO;
     private final IServiceReferenceMetricUIDAO serviceReferenceMetricUIDAO;
     private final ServiceNameCacheService serviceNameCacheService;
-    private final SecondBetweenService secondBetweenService;
+    private final DateBetweenService dateBetweenService;
     private final IComponentLibraryCatalogService componentLibraryCatalogService;
 
     public ServiceTopologyService(ModuleManager moduleManager) {
@@ -64,12 +52,12 @@ public class ServiceTopologyService {
         this.serviceReferenceMetricUIDAO = moduleManager.find(StorageModule.NAME).getService(IServiceReferenceMetricUIDAO.class);
         this.applicationComponentUIDAO = moduleManager.find(StorageModule.NAME).getService(IApplicationComponentUIDAO.class);
         this.serviceNameCacheService = moduleManager.find(CacheModule.NAME).getService(ServiceNameCacheService.class);
-        this.secondBetweenService = new SecondBetweenService(moduleManager);
+        this.dateBetweenService = new DateBetweenService(moduleManager);
         this.componentLibraryCatalogService = moduleManager.find(ConfigurationModule.NAME).getService(IComponentLibraryCatalogService.class);
     }
 
     public Topology getServiceTopology(Step step, int serviceId, long startTimeBucket,
-        long endTimeBucket, long startSecondTimeBucket, long endSecondTimeBucket) throws ParseException {
+        long endTimeBucket, long startSecondTimeBucket, long endSecondTimeBucket) {
         logger.debug("startTimeBucket: {}, endTimeBucket: {}", startTimeBucket, endTimeBucket);
         List<IApplicationComponentUIDAO.ApplicationComponent> applicationComponents = applicationComponentUIDAO.load(step, startTimeBucket, endTimeBucket);
 
@@ -93,7 +81,7 @@ public class ServiceTopologyService {
             call.setCallType(components.getOrDefault(serviceNameCacheService.get(referenceMetric.getTarget()).getApplicationId(), Const.UNKNOWN));
             try {
                 int applicationId = serviceNameCacheService.get(referenceMetric.getTarget()).getApplicationId();
-                call.setCallsPerSec(referenceMetric.getCalls() / secondBetweenService.calculate(applicationId, startSecondTimeBucket, endSecondTimeBucket));
+                call.setCpm(referenceMetric.getCalls() / dateBetweenService.minutesBetween(applicationId, startSecondTimeBucket, endSecondTimeBucket));
             } catch (ParseException e) {
                 logger.error(e.getMessage(), e);
             }
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java
index 3a3357f..55d1371 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java
@@ -19,36 +19,20 @@
 package org.apache.skywalking.apm.collector.ui.service;
 
 import java.text.ParseException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import org.apache.skywalking.apm.collector.cache.CacheModule;
 import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService;
 import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
 import org.apache.skywalking.apm.collector.configuration.service.IComponentLibraryCatalogService;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
-import org.apache.skywalking.apm.collector.core.util.BooleanUtils;
-import org.apache.skywalking.apm.collector.core.util.Const;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationComponentUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMappingUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationReferenceMetricUIDAO;
+import org.apache.skywalking.apm.collector.core.util.*;
+import org.apache.skywalking.apm.collector.storage.dao.ui.*;
 import org.apache.skywalking.apm.collector.storage.table.register.Application;
 import org.apache.skywalking.apm.collector.storage.ui.alarm.Alarm;
-import org.apache.skywalking.apm.collector.storage.ui.application.ApplicationNode;
-import org.apache.skywalking.apm.collector.storage.ui.application.ConjecturalNode;
-import org.apache.skywalking.apm.collector.storage.ui.common.Call;
-import org.apache.skywalking.apm.collector.storage.ui.common.Node;
-import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.common.Topology;
-import org.apache.skywalking.apm.collector.storage.ui.common.VisualUserNode;
-import org.apache.skywalking.apm.collector.ui.utils.ApdexCalculator;
-import org.apache.skywalking.apm.collector.ui.utils.SLACalculator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.skywalking.apm.collector.storage.ui.application.*;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
+import org.apache.skywalking.apm.collector.ui.utils.*;
+import org.slf4j.*;
 
 /**
  * @author peng-yongsheng
@@ -59,14 +43,14 @@ class TopologyBuilder {
 
     private final ApplicationCacheService applicationCacheService;
     private final ServerService serverService;
-    private final SecondBetweenService secondBetweenService;
+    private final DateBetweenService dateBetweenService;
     private final AlarmService alarmService;
     private final IComponentLibraryCatalogService componentLibraryCatalogService;
 
     TopologyBuilder(ModuleManager moduleManager) {
         this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class);
         this.serverService = new ServerService(moduleManager);
-        this.secondBetweenService = new SecondBetweenService(moduleManager);
+        this.dateBetweenService = new DateBetweenService(moduleManager);
         this.alarmService = new AlarmService(moduleManager);
         this.componentLibraryCatalogService = moduleManager.find(ConfigurationModule.NAME).getService(IComponentLibraryCatalogService.class);
     }
@@ -96,7 +80,7 @@ class TopologyBuilder {
 
             applicationNode.setSla(SLACalculator.INSTANCE.calculate(applicationMetric.getErrorCalls(), applicationMetric.getCalls()));
             try {
-                applicationNode.setCallsPerSec(applicationMetric.getCalls() / secondBetweenService.calculate(applicationId, startSecondTimeBucket, endSecondTimeBucket));
+                applicationNode.setCpm(applicationMetric.getCalls() / dateBetweenService.minutesBetween(applicationId, startSecondTimeBucket, endSecondTimeBucket));
             } catch (ParseException e) {
                 logger.error(e.getMessage(), e);
             }
@@ -167,7 +151,7 @@ class TopologyBuilder {
             call.setAlert(false);
             call.setCallType(components.get(referenceMetric.getTarget()));
             try {
-                call.setCallsPerSec(referenceMetric.getCalls() / secondBetweenService.calculate(source.getApplicationId(), startSecondTimeBucket, endSecondTimeBucket));
+                call.setCpm(referenceMetric.getCalls() / dateBetweenService.minutesBetween(source.getApplicationId(), startSecondTimeBucket, endSecondTimeBucket));
             } catch (ParseException e) {
                 logger.error(e.getMessage(), e);
             }
@@ -214,7 +198,7 @@ class TopologyBuilder {
                 call.setCallType(components.get(referenceMetric.getTarget()));
             }
             try {
-                call.setCallsPerSec(referenceMetric.getCalls() / secondBetweenService.calculate(target.getApplicationId(), startSecondTimeBucket, endSecondTimeBucket));
+                call.setCpm(referenceMetric.getCalls() / dateBetweenService.minutesBetween(target.getApplicationId(), startSecondTimeBucket, endSecondTimeBucket));
             } catch (ParseException e) {
                 logger.error(e.getMessage(), e);
             }
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/DurationUtils.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/DurationUtils.java
index f14f741..9f84306 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/DurationUtils.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/utils/DurationUtils.java
@@ -18,17 +18,13 @@
 
 package org.apache.skywalking.apm.collector.ui.utils;
 
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
+import java.text.*;
+import java.util.*;
 import org.apache.skywalking.apm.collector.core.UnexpectedException;
 import org.apache.skywalking.apm.collector.core.util.Const;
 import org.apache.skywalking.apm.collector.storage.ui.common.Step;
 import org.apache.skywalking.apm.collector.storage.utils.DurationPoint;
-import org.joda.time.DateTime;
-import org.joda.time.Seconds;
+import org.joda.time.*;
 
 /**
  * @author peng-yongsheng
@@ -36,13 +32,13 @@ import org.joda.time.Seconds;
 public enum DurationUtils {
     INSTANCE;
 
-    public long exchangeToTimeBucket(String dateStr) throws ParseException {
+    public long exchangeToTimeBucket(String dateStr) {
         dateStr = dateStr.replaceAll("-", Const.EMPTY_STRING);
         dateStr = dateStr.replaceAll(" ", Const.EMPTY_STRING);
         return Long.valueOf(dateStr);
     }
 
-    public long startTimeDurationToSecondTimeBucket(Step step, String dateStr) throws ParseException {
+    public long startTimeDurationToSecondTimeBucket(Step step, String dateStr) {
         long secondTimeBucket = 0;
         switch (step) {
             case MONTH:
@@ -64,7 +60,7 @@ public enum DurationUtils {
         return secondTimeBucket;
     }
 
-    public long endTimeDurationToSecondTimeBucket(Step step, String dateStr) throws ParseException {
+    public long endTimeDurationToSecondTimeBucket(Step step, String dateStr) {
         long secondTimeBucket = 0;
         switch (step) {
             case MONTH:
@@ -86,36 +82,38 @@ public enum DurationUtils {
         return secondTimeBucket;
     }
 
-    public int secondsBetween(Step step, long startTimeBucket, long endTimeBucket) throws ParseException {
-        Date startDate = null;
-        Date endDate = null;
+    public int minutesBetween(Step step, long startTimeBucket, long endTimeBucket) throws ParseException {
+        Date startDate = formatDate(step, startTimeBucket);
+        Date endDate = formatDate(step, endTimeBucket);
+
+        return Minutes.minutesBetween(new DateTime(startDate), new DateTime(endDate)).getMinutes();
+    }
+
+    public int minutesBetween(Step step, DateTime dateTime) {
         switch (step) {
             case MONTH:
-                startDate = new SimpleDateFormat("yyyyMM").parse(String.valueOf(startTimeBucket));
-                endDate = new SimpleDateFormat("yyyyMM").parse(String.valueOf(endTimeBucket));
-                break;
+                return dateTime.dayOfMonth().getMaximumValue() * 24 * 60;
             case DAY:
-                startDate = new SimpleDateFormat("yyyyMMdd").parse(String.valueOf(startTimeBucket));
-                endDate = new SimpleDateFormat("yyyyMMdd").parse(String.valueOf(endTimeBucket));
-                break;
+                return 24 * 60;
             case HOUR:
-                startDate = new SimpleDateFormat("yyyyMMddHH").parse(String.valueOf(startTimeBucket));
-                endDate = new SimpleDateFormat("yyyyMMddHH").parse(String.valueOf(endTimeBucket));
-                break;
+                return 60;
             case MINUTE:
-                startDate = new SimpleDateFormat("yyyyMMddHHmm").parse(String.valueOf(startTimeBucket));
-                endDate = new SimpleDateFormat("yyyyMMddHHmm").parse(String.valueOf(endTimeBucket));
-                break;
+                return 1;
             case SECOND:
-                startDate = new SimpleDateFormat("yyyyMMddHHmmss").parse(String.valueOf(startTimeBucket));
-                endDate = new SimpleDateFormat("yyyyMMddHHmmss").parse(String.valueOf(endTimeBucket));
-                break;
+                return 1;
+            default:
+                return 1;
         }
+    }
+
+    public int secondsBetween(Step step, long startTimeBucket, long endTimeBucket) throws ParseException {
+        Date startDate = formatDate(step, startTimeBucket);
+        Date endDate = formatDate(step, endTimeBucket);
 
         return Seconds.secondsBetween(new DateTime(startDate), new DateTime(endDate)).getSeconds();
     }
 
-    public int secondsBetween(Step step, DateTime dateTime) throws ParseException {
+    public int secondsBetween(Step step, DateTime dateTime) {
         switch (step) {
             case MONTH:
                 return dateTime.dayOfMonth().getMaximumValue() * 24 * 60 * 60;
@@ -132,6 +130,28 @@ public enum DurationUtils {
         }
     }
 
+    private Date formatDate(Step step, long timeBucket) throws ParseException {
+        Date date = null;
+        switch (step) {
+            case MONTH:
+                date = new SimpleDateFormat("yyyyMM").parse(String.valueOf(timeBucket));
+                break;
+            case DAY:
+                date = new SimpleDateFormat("yyyyMMdd").parse(String.valueOf(timeBucket));
+                break;
+            case HOUR:
+                date = new SimpleDateFormat("yyyyMMddHH").parse(String.valueOf(timeBucket));
+                break;
+            case MINUTE:
+                date = new SimpleDateFormat("yyyyMMddHHmm").parse(String.valueOf(timeBucket));
+                break;
+            case SECOND:
+                date = new SimpleDateFormat("yyyyMMddHHmmss").parse(String.valueOf(timeBucket));
+                break;
+        }
+        return date;
+    }
+
     public DateTime parseToDateTime(Step step, long time) throws ParseException {
         DateTime dateTime = null;
 
@@ -166,7 +186,7 @@ public enum DurationUtils {
         DateTime dateTime = parseToDateTime(step, startTimeBucket);
 
         List<DurationPoint> durations = new LinkedList<>();
-        durations.add(new DurationPoint(startTimeBucket, secondsBetween(step, dateTime)));
+        durations.add(new DurationPoint(startTimeBucket, secondsBetween(step, dateTime), minutesBetween(step, dateTime)));
 
         int i = 0;
         do {
@@ -174,27 +194,27 @@ public enum DurationUtils {
                 case MONTH:
                     dateTime = dateTime.plusMonths(1);
                     String timeBucket = new SimpleDateFormat("yyyyMM").format(dateTime.toDate());
-                    durations.add(new DurationPoint(Long.valueOf(timeBucket), secondsBetween(step, dateTime)));
+                    durations.add(new DurationPoint(Long.valueOf(timeBucket), secondsBetween(step, dateTime), minutesBetween(step, dateTime)));
                     break;
                 case DAY:
                     dateTime = dateTime.plusDays(1);
                     timeBucket = new SimpleDateFormat("yyyyMMdd").format(dateTime.toDate());
-                    durations.add(new DurationPoint(Long.valueOf(timeBucket), secondsBetween(step, dateTime)));
+                    durations.add(new DurationPoint(Long.valueOf(timeBucket), secondsBetween(step, dateTime), minutesBetween(step, dateTime)));
                     break;
                 case HOUR:
                     dateTime = dateTime.plusHours(1);
                     timeBucket = new SimpleDateFormat("yyyyMMddHH").format(dateTime.toDate());
-                    durations.add(new DurationPoint(Long.valueOf(timeBucket), secondsBetween(step, dateTime)));
+                    durations.add(new DurationPoint(Long.valueOf(timeBucket), secondsBetween(step, dateTime), minutesBetween(step, dateTime)));
                     break;
                 case MINUTE:
                     dateTime = dateTime.plusMinutes(1);
                     timeBucket = new SimpleDateFormat("yyyyMMddHHmm").format(dateTime.toDate());
-                    durations.add(new DurationPoint(Long.valueOf(timeBucket), secondsBetween(step, dateTime)));
+                    durations.add(new DurationPoint(Long.valueOf(timeBucket), secondsBetween(step, dateTime), minutesBetween(step, dateTime)));
                     break;
                 case SECOND:
                     dateTime = dateTime.plusSeconds(1);
                     timeBucket = new SimpleDateFormat("yyyyMMddHHmmss").format(dateTime.toDate());
-                    durations.add(new DurationPoint(Long.valueOf(timeBucket), secondsBetween(step, dateTime)));
+                    durations.add(new DurationPoint(Long.valueOf(timeBucket), secondsBetween(step, dateTime), minutesBetween(step, dateTime)));
                     break;
             }
             i++;
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/query/ServerQueryTest.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/query/ServerQueryTest.java
index aab63ef..e4b28b9 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/query/ServerQueryTest.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/query/ServerQueryTest.java
@@ -94,8 +94,8 @@ public class ServerQueryTest {
     }
 
     @Test
-    public void getServerTPSTrend() throws ParseException {
-        Mockito.when(serverService.getServerTPSTrend(Mockito.anyInt(), Mockito.anyObject(), Mockito.anyLong(), Mockito.anyLong())).then(invocation -> {
+    public void getServerThroughputTrend() throws ParseException {
+        Mockito.when(serverService.getServerThroughputTrend(Mockito.anyInt(), Mockito.anyObject(), Mockito.anyLong(), Mockito.anyLong())).then(invocation -> {
             Object[] arguments = invocation.getArguments();
             Assert.assertEquals(201701L, arguments[2]);
             Assert.assertEquals(201702L, arguments[3]);
@@ -106,7 +106,7 @@ public class ServerQueryTest {
         duration.setEnd("2017-02");
         duration.setStep(Step.MONTH);
 
-        serverQuery.getServerTPSTrend(-1, duration);
+        serverQuery.getServerThroughputTrend(-1, duration);
     }
 
     @Test
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/query/ServiceQueryTest.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/query/ServiceQueryTest.java
index f30dec5..fd0b99c 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/query/ServiceQueryTest.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/query/ServiceQueryTest.java
@@ -72,8 +72,8 @@ public class ServiceQueryTest {
     }
 
     @Test
-    public void getServiceTPSTrend() throws ParseException {
-        Mockito.when(serviceNameService.getServiceTPSTrend(
+    public void getServiceThroughputTrend() throws ParseException {
+        Mockito.when(serviceNameService.getServiceThroughputTrend(
                 Mockito.anyInt(), Mockito.anyObject(),
                 Mockito.anyLong(), Mockito.anyLong())
         ).then(invocation -> {
@@ -86,7 +86,7 @@ public class ServiceQueryTest {
         duration.setStart("2017-01");
         duration.setEnd("2017-02");
         duration.setStep(Step.MONTH);
-        serviceQuery.getServiceTPSTrend(-1, duration);
+        serviceQuery.getServiceThroughputTrend(-1, duration);
     }
 
     @Test
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ApplicationServiceTest.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ApplicationServiceTest.java
index d74edc4..64a38b1 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ApplicationServiceTest.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ApplicationServiceTest.java
@@ -17,34 +17,21 @@
 
 package org.apache.skywalking.apm.collector.ui.service;
 
-import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService;
-import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService;
-import org.apache.skywalking.apm.collector.core.module.MockModule;
-import org.apache.skywalking.apm.collector.core.module.ModuleManager;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.INetworkAddressUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IServiceMetricUIDAO;
+import java.text.ParseException;
+import java.util.*;
+import org.apache.skywalking.apm.collector.cache.service.*;
+import org.apache.skywalking.apm.collector.core.module.*;
+import org.apache.skywalking.apm.collector.storage.dao.ui.*;
 import org.apache.skywalking.apm.collector.storage.table.register.ServiceName;
 import org.apache.skywalking.apm.collector.storage.ui.application.Application;
-import org.apache.skywalking.apm.collector.storage.ui.common.Duration;
-import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.overview.ApplicationTPS;
-import org.apache.skywalking.apm.collector.storage.ui.overview.ConjecturalApp;
-import org.apache.skywalking.apm.collector.storage.ui.overview.ConjecturalAppBrief;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
+import org.apache.skywalking.apm.collector.storage.ui.overview.*;
 import org.apache.skywalking.apm.collector.storage.ui.service.ServiceMetric;
 import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.*;
 import org.mockito.Mockito;
 import org.mockito.internal.util.reflection.Whitebox;
 
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
 import static org.mockito.Matchers.*;
 import static org.mockito.Mockito.mock;
 import static org.powermock.api.mockito.PowerMockito.when;
@@ -60,11 +47,10 @@ public class ApplicationServiceTest {
     private INetworkAddressUIDAO networkAddressUIDAO;
     private ApplicationCacheService applicationCacheService;
     private ServiceNameCacheService serviceNameCacheService;
-    private SecondBetweenService secondBetweenService;
+    private DateBetweenService dateBetweenService;
     private ApplicationService applicationService;
     private Duration duration;
 
-
     @Before
     public void setUp() throws Exception {
         ModuleManager moduleManager = mock(ModuleManager.class);
@@ -76,14 +62,14 @@ public class ApplicationServiceTest {
         networkAddressUIDAO = mock(INetworkAddressUIDAO.class);
         applicationCacheService = mock(ApplicationCacheService.class);
         serviceNameCacheService = mock(ServiceNameCacheService.class);
-        secondBetweenService = mock(SecondBetweenService.class);
+        dateBetweenService = mock(DateBetweenService.class);
         Whitebox.setInternalState(applicationService, "instanceDAO", instanceDAO);
         Whitebox.setInternalState(applicationService, "serviceMetricUIDAO", serviceMetricUIDAO);
         Whitebox.setInternalState(applicationService, "applicationMetricUIDAO", applicationMetricUIDAO);
         Whitebox.setInternalState(applicationService, "networkAddressUIDAO", networkAddressUIDAO);
         Whitebox.setInternalState(applicationService, "applicationCacheService", applicationCacheService);
         Whitebox.setInternalState(applicationService, "serviceNameCacheService", serviceNameCacheService);
-        Whitebox.setInternalState(applicationService, "secondBetweenService", secondBetweenService);
+        Whitebox.setInternalState(applicationService, "dateBetweenService", dateBetweenService);
         duration = new Duration();
         duration.setEnd("2018-02");
         duration.setStart("2018-01");
@@ -139,9 +125,9 @@ public class ApplicationServiceTest {
             serviceName.setServiceName("serviceName");
             return serviceName;
         });
-        when(secondBetweenService.calculate(anyInt(), anyLong(), anyLong())).then(invocation -> 20L);
+        when(dateBetweenService.minutesBetween(anyInt(), anyLong(), anyLong())).then(invocation -> 20L);
         List<ServiceMetric> slowService = applicationService.getSlowService(-1, duration.getStep(), startTimeBucket, endTimeBucket, startSecondTimeBucket, endSecondTimeBucket, 10);
-        Assert.assertTrue(slowService.get(0).getCallsPerSec() > 0);
+        Assert.assertTrue(slowService.get(0).getCpm() > 0);
     }
 
     @Test
@@ -149,12 +135,12 @@ public class ApplicationServiceTest {
         long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
         long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
         when(applicationMetricUIDAO.getTopNApplicationThroughput(anyObject(), anyLong(), anyLong(), anyInt(), anyInt(), anyObject())).then(invocation -> {
-            ApplicationTPS applicationTPS = new ApplicationTPS();
-            applicationTPS.setApplicationId(-1);
-            return Collections.singletonList(applicationTPS);
+            ApplicationThroughput applicationThroughput = new ApplicationThroughput();
+            applicationThroughput.setApplicationId(-1);
+            return Collections.singletonList(applicationThroughput);
         });
         mockCache();
-        List<ApplicationTPS> topNApplicationThroughput = applicationService.getTopNApplicationThroughput(duration.getStep(), startTimeBucket, endTimeBucket, 10);
+        List<ApplicationThroughput> topNApplicationThroughput = applicationService.getTopNApplicationThroughput(duration.getStep(), startTimeBucket, endTimeBucket, 10);
         Assert.assertTrue(topNApplicationThroughput.size() > 0);
     }
 
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/SecondBetweenServiceTest.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/DateBetweenServiceTest.java
similarity index 86%
rename from apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/SecondBetweenServiceTest.java
rename to apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/DateBetweenServiceTest.java
index e7a204f..753b3dd 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/SecondBetweenServiceTest.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/DateBetweenServiceTest.java
@@ -38,9 +38,9 @@ import static org.powermock.api.mockito.PowerMockito.when;
 /**
  * @author lican
  */
-public class SecondBetweenServiceTest {
+public class DateBetweenServiceTest {
 
-    private SecondBetweenService secondBetweenService;
+    private DateBetweenService dateBetweenService;
 
     private IInstanceUIDAO instanceUIDAO;
 
@@ -50,9 +50,9 @@ public class SecondBetweenServiceTest {
     public void setUp() throws Exception {
         ModuleManager moduleManager = mock(ModuleManager.class);
         when(moduleManager.find(anyString())).then(invocation -> new MockModule());
-        secondBetweenService = new SecondBetweenService(moduleManager);
+        dateBetweenService = new DateBetweenService(moduleManager);
         instanceUIDAO = mock(IInstanceUIDAO.class);
-        Whitebox.setInternalState(secondBetweenService, "instanceUIDAO", instanceUIDAO);
+        Whitebox.setInternalState(dateBetweenService, "instanceUIDAO", instanceUIDAO);
         duration = new Duration();
         duration.setEnd("2018-02");
         duration.setStart("2018-01");
@@ -60,11 +60,11 @@ public class SecondBetweenServiceTest {
     }
 
     @Test
-    public void calculate() throws ParseException {
+    public void secondsBetween() throws ParseException {
         long startSecondTimeBucket = DurationUtils.INSTANCE.startTimeDurationToSecondTimeBucket(duration.getStep(), duration.getStart());
         long endSecondTimeBucket = DurationUtils.INSTANCE.endTimeDurationToSecondTimeBucket(duration.getStep(), duration.getEnd());
         when(instanceUIDAO.getLatestHeartBeatTime(anyInt())).then(invocation -> endSecondTimeBucket);
-        int seconds = secondBetweenService.calculate(1, startSecondTimeBucket, endSecondTimeBucket);
+        int seconds = dateBetweenService.secondsBetween(1, startSecondTimeBucket, endSecondTimeBucket);
         Assert.assertTrue(seconds > 0);
     }
 }
\ No newline at end of file
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServerServiceTest.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServerServiceTest.java
index b67653b..5ded746 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServerServiceTest.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServerServiceTest.java
@@ -17,43 +17,21 @@
 
 package org.apache.skywalking.apm.collector.ui.service;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
+import com.google.gson.*;
 import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService;
-import org.apache.skywalking.apm.collector.cache.service.InstanceCacheService;
-import org.apache.skywalking.apm.collector.core.module.MockModule;
-import org.apache.skywalking.apm.collector.core.module.ModuleManager;
-import org.apache.skywalking.apm.collector.storage.dao.ui.ICpuMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IGCMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IInstanceUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IMemoryMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.table.register.Application;
-import org.apache.skywalking.apm.collector.storage.table.register.Instance;
-import org.apache.skywalking.apm.collector.storage.ui.common.Duration;
-import org.apache.skywalking.apm.collector.storage.ui.common.ResponseTimeTrend;
-import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.common.ThroughputTrend;
-import org.apache.skywalking.apm.collector.storage.ui.server.AppServerInfo;
-import org.apache.skywalking.apm.collector.storage.ui.server.CPUTrend;
-import org.apache.skywalking.apm.collector.storage.ui.server.GCTrend;
-import org.apache.skywalking.apm.collector.storage.ui.server.MemoryTrend;
+import java.util.*;
+import org.apache.skywalking.apm.collector.cache.service.*;
+import org.apache.skywalking.apm.collector.core.module.*;
+import org.apache.skywalking.apm.collector.storage.dao.ui.*;
+import org.apache.skywalking.apm.collector.storage.table.register.*;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
+import org.apache.skywalking.apm.collector.storage.ui.server.*;
 import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.*;
 import org.mockito.Mockito;
 import org.mockito.internal.util.reflection.Whitebox;
 
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.*;
 import static org.mockito.Mockito.mock;
 import static org.powermock.api.mockito.PowerMockito.when;
 
@@ -69,7 +47,7 @@ public class ServerServiceTest {
     private IMemoryMetricUIDAO memoryMetricUIDAO;
     private ApplicationCacheService applicationCacheService;
     private InstanceCacheService instanceCacheService;
-    private SecondBetweenService secondBetweenService;
+    private DateBetweenService dateBetweenService;
     private ServerService serverService;
     private Duration duration;
     private long startSecondTimeBucket;
@@ -89,7 +67,7 @@ public class ServerServiceTest {
         memoryMetricUIDAO = mock(IMemoryMetricUIDAO.class);
         applicationCacheService = mock(ApplicationCacheService.class);
         instanceCacheService = mock(InstanceCacheService.class);
-        secondBetweenService = mock(SecondBetweenService.class);
+        dateBetweenService = mock(DateBetweenService.class);
         Whitebox.setInternalState(serverService, "instanceUIDAO", instanceUIDAO);
         Whitebox.setInternalState(serverService, "instanceMetricUIDAO", instanceMetricUIDAO);
         Whitebox.setInternalState(serverService, "cpuMetricUIDAO", cpuMetricUIDAO);
@@ -97,7 +75,7 @@ public class ServerServiceTest {
         Whitebox.setInternalState(serverService, "memoryMetricUIDAO", memoryMetricUIDAO);
         Whitebox.setInternalState(serverService, "applicationCacheService", applicationCacheService);
         Whitebox.setInternalState(serverService, "instanceCacheService", instanceCacheService);
-        Whitebox.setInternalState(serverService, "secondBetweenService", secondBetweenService);
+        Whitebox.setInternalState(serverService, "dateBetweenService", dateBetweenService);
         duration = new Duration();
         duration.setEnd("2018-02");
         duration.setStart("2018-01");
@@ -176,8 +154,8 @@ public class ServerServiceTest {
     }
 
     @Test
-    public void getServerTPSTrend() throws ParseException {
-        ThroughputTrend serverTPSTrend = serverService.getServerTPSTrend(1, duration.getStep(), startTimeBucket, endTimeBucket);
+    public void getServerThroughputTrend() throws ParseException {
+        ThroughputTrend serverTPSTrend = serverService.getServerThroughputTrend(1, duration.getStep(), startTimeBucket, endTimeBucket);
         Assert.assertNotNull(serverTPSTrend);
     }
 
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServiceNameServiceTest.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServiceNameServiceTest.java
index b57195e..dfb0651 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServiceNameServiceTest.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServiceNameServiceTest.java
@@ -17,26 +17,19 @@
 
 package org.apache.skywalking.apm.collector.ui.service;
 
+import java.text.ParseException;
+import java.util.*;
 import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService;
-import org.apache.skywalking.apm.collector.core.module.MockModule;
-import org.apache.skywalking.apm.collector.core.module.ModuleManager;
-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.core.module.*;
+import org.apache.skywalking.apm.collector.storage.dao.ui.*;
 import org.apache.skywalking.apm.collector.storage.table.register.ServiceName;
 import org.apache.skywalking.apm.collector.storage.ui.common.*;
-import org.apache.skywalking.apm.collector.storage.ui.service.ServiceInfo;
-import org.apache.skywalking.apm.collector.storage.ui.service.ServiceMetric;
+import org.apache.skywalking.apm.collector.storage.ui.service.*;
 import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.*;
 import org.mockito.Mockito;
 import org.mockito.internal.util.reflection.Whitebox;
 
-import java.text.ParseException;
-import java.util.Collections;
-import java.util.List;
-
 import static org.mockito.Matchers.*;
 import static org.mockito.Mockito.mock;
 import static org.powermock.api.mockito.PowerMockito.when;
@@ -49,7 +42,7 @@ public class ServiceNameServiceTest {
     private IServiceNameServiceUIDAO serviceNameServiceUIDAO;
     private IServiceMetricUIDAO serviceMetricUIDAO;
     private ServiceNameCacheService serviceNameCacheService;
-    private SecondBetweenService secondBetweenService;
+    private DateBetweenService dateBetweenService;
     private ServiceNameService serverNameService;
     private Duration duration;
     private long startSecondTimeBucket;
@@ -64,10 +57,10 @@ public class ServiceNameServiceTest {
         serverNameService = new ServiceNameService(moduleManager);
         serviceNameCacheService = mock(ServiceNameCacheService.class);
         serviceMetricUIDAO = mock(IServiceMetricUIDAO.class);
-        secondBetweenService = mock(SecondBetweenService.class);
+        dateBetweenService = mock(DateBetweenService.class);
         Whitebox.setInternalState(serverNameService, "serviceNameCacheService", serviceNameCacheService);
         Whitebox.setInternalState(serverNameService, "serviceMetricUIDAO", serviceMetricUIDAO);
-        Whitebox.setInternalState(serverNameService, "secondBetweenService", secondBetweenService);
+        Whitebox.setInternalState(serverNameService, "dateBetweenService", dateBetweenService);
         duration = new Duration();
         duration.setEnd("2018-02");
         duration.setStart("2018-01");
@@ -91,8 +84,8 @@ public class ServiceNameServiceTest {
     }
 
     @Test
-    public void getServiceTPSTrend() throws ParseException {
-        ThroughputTrend serviceTPSTrend = serverNameService.getServiceTPSTrend(1, duration.getStep(), startTimeBucket, endTimeBucket);
+    public void getServiceThroughputTrend() throws ParseException {
+        ThroughputTrend serviceTPSTrend = serverNameService.getServiceThroughputTrend(1, duration.getStep(), startTimeBucket, endTimeBucket);
         Assert.assertNotNull(serviceTPSTrend);
     }
 
@@ -118,7 +111,7 @@ public class ServiceNameServiceTest {
             serviceMetric.setId(1);
             return Collections.singletonList(serviceMetric);
         });
-        when(secondBetweenService.calculate(anyInt(), anyLong(), anyLong())).then(invocation -> 20L);
+        when(dateBetweenService.minutesBetween(anyInt(), anyLong(), anyLong())).then(invocation -> 20L);
         mockCache();
         List<ServiceMetric> slowService = serverNameService.getSlowService(duration.getStep(), startTimeBucket, endTimeBucket, startSecondTimeBucket, endSecondTimeBucket, 10);
         Assert.assertTrue(slowService.size() > 0);
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyServiceTest.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyServiceTest.java
index a81fc41..e156d66 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyServiceTest.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/ServiceTopologyServiceTest.java
@@ -17,30 +17,19 @@
 
 package org.apache.skywalking.apm.collector.ui.service;
 
+import java.text.ParseException;
+import java.util.*;
 import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService;
-import org.apache.skywalking.apm.collector.core.module.MockModule;
-import org.apache.skywalking.apm.collector.core.module.ModuleManager;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationComponentUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IServiceMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IServiceReferenceMetricUIDAO;
+import org.apache.skywalking.apm.collector.core.module.*;
+import org.apache.skywalking.apm.collector.storage.dao.ui.*;
 import org.apache.skywalking.apm.collector.storage.table.register.ServiceName;
-import org.apache.skywalking.apm.collector.storage.ui.common.Duration;
-import org.apache.skywalking.apm.collector.storage.ui.common.Node;
-import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.common.Topology;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
 import org.apache.skywalking.apm.collector.storage.ui.service.ServiceNode;
 import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.*;
 import org.mockito.Mockito;
 import org.mockito.internal.util.reflection.Whitebox;
 
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
 import static org.mockito.Matchers.*;
 import static org.mockito.Mockito.mock;
 import static org.powermock.api.mockito.PowerMockito.when;
@@ -54,7 +43,7 @@ public class ServiceTopologyServiceTest {
     private IServiceMetricUIDAO serviceMetricUIDAO;
     private IServiceReferenceMetricUIDAO serviceReferenceMetricUIDAO;
     private ServiceNameCacheService serviceNameCacheService;
-    private SecondBetweenService secondBetweenService;
+    private DateBetweenService dateBetweenService;
     private ServiceTopologyService serviceTopologyService;
     private Duration duration;
     private long startSecondTimeBucket;
@@ -71,12 +60,12 @@ public class ServiceTopologyServiceTest {
         serviceMetricUIDAO = mock(IServiceMetricUIDAO.class);
         serviceReferenceMetricUIDAO = mock(IServiceReferenceMetricUIDAO.class);
         serviceNameCacheService = mock(ServiceNameCacheService.class);
-        secondBetweenService = mock(SecondBetweenService.class);
+        dateBetweenService = mock(DateBetweenService.class);
         Whitebox.setInternalState(serviceTopologyService, "applicationComponentUIDAO", applicationComponentUIDAO);
         Whitebox.setInternalState(serviceTopologyService, "serviceMetricUIDAO", serviceMetricUIDAO);
         Whitebox.setInternalState(serviceTopologyService, "serviceReferenceMetricUIDAO", serviceReferenceMetricUIDAO);
         Whitebox.setInternalState(serviceTopologyService, "serviceNameCacheService", serviceNameCacheService);
-        Whitebox.setInternalState(serviceTopologyService, "secondBetweenService", secondBetweenService);
+        Whitebox.setInternalState(serviceTopologyService, "dateBetweenService", dateBetweenService);
         duration = new Duration();
         duration.setEnd("2018-02");
         duration.setStart("2018-01");
@@ -113,7 +102,7 @@ public class ServiceTopologyServiceTest {
         });
         mockCache();
 
-        when(secondBetweenService.calculate(anyInt(), anyLong(), anyLong())).then(invocation -> 20L);
+        when(dateBetweenService.minutesBetween(anyInt(), anyLong(), anyLong())).then(invocation -> 20L);
         when(serviceMetricUIDAO.getServicesMetric(anyObject(), anyLong(), anyLong(), anyObject(), anyObject())).then(invocation -> {
             List<Node> nodes = new LinkedList<>();
             ServiceNode serviceNode = new ServiceNode();
diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilderTest.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilderTest.java
index fc5a592..cdffc72 100644
--- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilderTest.java
+++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/test/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilderTest.java
@@ -17,31 +17,19 @@
 
 package org.apache.skywalking.apm.collector.ui.service;
 
+import java.text.ParseException;
+import java.util.*;
 import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService;
-import org.apache.skywalking.apm.collector.core.module.MockModule;
-import org.apache.skywalking.apm.collector.core.module.ModuleManager;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationComponentUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMappingUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationMetricUIDAO;
-import org.apache.skywalking.apm.collector.storage.dao.ui.IApplicationReferenceMetricUIDAO;
+import org.apache.skywalking.apm.collector.core.module.*;
+import org.apache.skywalking.apm.collector.storage.dao.ui.*;
 import org.apache.skywalking.apm.collector.storage.table.register.Application;
-import org.apache.skywalking.apm.collector.storage.ui.alarm.Alarm;
-import org.apache.skywalking.apm.collector.storage.ui.alarm.AlarmItem;
-import org.apache.skywalking.apm.collector.storage.ui.common.Duration;
-import org.apache.skywalking.apm.collector.storage.ui.common.Step;
-import org.apache.skywalking.apm.collector.storage.ui.common.Topology;
+import org.apache.skywalking.apm.collector.storage.ui.alarm.*;
+import org.apache.skywalking.apm.collector.storage.ui.common.*;
 import org.apache.skywalking.apm.collector.ui.utils.DurationUtils;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.*;
 import org.mockito.Mockito;
 import org.mockito.internal.util.reflection.Whitebox;
 
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
 import static org.mockito.Matchers.*;
 import static org.mockito.Mockito.mock;
 import static org.powermock.api.mockito.PowerMockito.when;
@@ -53,7 +41,7 @@ public class TopologyBuilderTest {
 
     private ApplicationCacheService applicationCacheService;
     private ServerService serverService;
-    private SecondBetweenService secondBetweenService;
+    private DateBetweenService dateBetweenService;
     private AlarmService alarmService;
     private TopologyBuilder topologyBuilder;
     private Duration duration;
@@ -69,10 +57,10 @@ public class TopologyBuilderTest {
         topologyBuilder = new TopologyBuilder(moduleManager);
         applicationCacheService = mock(ApplicationCacheService.class);
         alarmService = mock(AlarmService.class);
-        secondBetweenService = mock(SecondBetweenService.class);
+        dateBetweenService = mock(DateBetweenService.class);
         Whitebox.setInternalState(topologyBuilder, "applicationCacheService", applicationCacheService);
         Whitebox.setInternalState(topologyBuilder, "alarmService", alarmService);
-        Whitebox.setInternalState(topologyBuilder, "secondBetweenService", secondBetweenService);
+        Whitebox.setInternalState(topologyBuilder, "dateBetweenService", dateBetweenService);
         duration = new Duration();
         duration.setEnd("2018-02");
         duration.setStart("2018-01");
@@ -140,7 +128,7 @@ public class TopologyBuilderTest {
             alarm.setItems(Collections.singletonList(new AlarmItem()));
             return alarm;
         });
-        when(secondBetweenService.calculate(anyInt(), anyLong(), anyLong())).then(invocation -> 20L);
+        when(dateBetweenService.minutesBetween(anyInt(), anyLong(), anyLong())).then(invocation -> 20L);
         Topology topology = topologyBuilder.build(applicationComponents, applicationMappings, applicationMetrics, callerReferenceMetric, calleeReferenceMetric, duration.getStep(), startTimeBucket, endTimeBucket, startSecondTimeBucket, endSecondTimeBucket);
         Assert.assertNotNull(topology);
     }
diff --git a/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/application-layer.graphqls b/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/application-layer.graphqls
index 7f44b24..0ee04fe 100644
--- a/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/application-layer.graphqls
+++ b/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/application-layer.graphqls
@@ -24,7 +24,7 @@ type ApplicationNode implements Node {
     # 2 Digits after floating point in UI, need to division by 100. 10000 -> 100.00
     sla: Int!
     # The number of incoming calls
-    callsPerSec: Long!
+    cpm: Long!
     # Unit: millisecond
     avgResponseTime: Long!
     # ref: http://www.apdex.org/
diff --git a/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/common.graphqls b/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/common.graphqls
index 82eca5e..f25cbe4 100644
--- a/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/common.graphqls
+++ b/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/common.graphqls
@@ -120,7 +120,7 @@ type Call {
     isAlert: Boolean
     # The protocol and tech stack used in this distributed call
     callType: String!
-    callsPerSec: Long!
+    cpm: Long!
     # Unit: millisecond
     avgResponseTime: Long!
 }
diff --git a/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/overview-layer.graphqls b/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/overview-layer.graphqls
index 87261b9..4998a8b 100644
--- a/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/overview-layer.graphqls
+++ b/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/overview-layer.graphqls
@@ -43,10 +43,10 @@ type ConjecturalApp {
     num: Int!
 }
 
-type ApplicationTPS {
+type ApplicationThroughput {
     applicationId: Int!
     applicationCode: String
-    callsPerSec: Int!
+    cpm: Int!
 }
 
 type Thermodynamic {
@@ -71,6 +71,6 @@ extend type Query {
     getAlarmTrend(duration: Duration!): AlarmTrend
     getConjecturalApps(duration: Duration!): ConjecturalAppBrief
     getTopNSlowService(duration: Duration!, topN: Int!): [ServiceMetric!]!
-    getTopNApplicationThroughput(duration: Duration!, topN: Int!): [ApplicationTPS!]!
+    getTopNApplicationThroughput(duration: Duration!, topN: Int!): [ApplicationThroughput!]!
     getThermodynamic(duration: Duration!, type: ValueType!): Thermodynamic!
 }
diff --git a/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/server-layer.graphqls b/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/server-layer.graphqls
index 808532a..abbffed 100644
--- a/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/server-layer.graphqls
+++ b/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/server-layer.graphqls
@@ -24,7 +24,7 @@ type AppServerInfo {
     osName: String!
     applicationId: Int!
     applicationCode: String
-    callsPerSec: Int!
+    cpm: Int!
     host: String
     pid: Int
     ipv4: [String!]!
@@ -34,10 +34,12 @@ type CPUTrend {
     cost: [Int!]!
 }
 
-# The gc trend represents the numbers of Garbage Collector execution
+# The gc trend represents the numbers and time of Garbage Collector execution
 type GCTrend {
-    youngGC: [Int!]!
-    oldGC: [Int!]!
+    youngGCCount: [Int!]!
+    oldGCount: [Int!]!
+    youngGCTime: [Int!]!
+    oldGCTime: [Int!]!
 }
 
 # The memory used and max limit in heap and noheap space.
@@ -52,7 +54,7 @@ extend type Query {
     searchServer(keyword: String!, duration: Duration!): [AppServerInfo!]!
     getAllServer(applicationId: ID!, duration: Duration!): [AppServerInfo!]!
     getServerResponseTimeTrend(serverId: ID!, duration: Duration!): ResponseTimeTrend
-    getServerTPSTrend(serverId: ID!, duration: Duration!): ThroughputTrend
+    getServerThroughputTrend(serverId: ID!, duration: Duration!): ThroughputTrend
     getCPUTrend(serverId: ID!, duration: Duration!): CPUTrend
     getGCTrend(serverId: ID!, duration: Duration!): GCTrend
     getMemoryTrend(serverId: ID!, duration: Duration!): MemoryTrend
diff --git a/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/service-layer.graphqls b/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/service-layer.graphqls
index b561ad8..8faa7e9 100644
--- a/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/service-layer.graphqls
+++ b/apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql/service-layer.graphqls
@@ -37,7 +37,7 @@ type ServiceMetric {
     name: String
     # The unit is millisecond.
     avgResponseTime: Int!
-    callsPerSec: Int!
+    cpm: Int!
 }
 
 type TraceItem {
@@ -49,7 +49,7 @@ type TraceItem {
 extend type Query {
     searchService(keyword: String!, topN: Int!): [ServiceInfo!]!
     getServiceResponseTimeTrend(serviceId: ID!, duration: Duration!): ResponseTimeTrend
-    getServiceTPSTrend(serviceId: ID!, duration: Duration!): ThroughputTrend
+    getServiceThroughputTrend(serviceId: ID!, duration: Duration!): ThroughputTrend
     getServiceSLATrend(serviceId: ID!, duration: Duration!): SLATrend
     getServiceTopology(serviceId: ID!, duration: Duration!): Topology
 }

-- 
To stop receiving notification emails like this one, please contact
pengys@apache.org.