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/07 09:17:16 UTC

[incubator-skywalking] branch master updated: 1. Add the performance collection point. (#1041)

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 cc655e1  1. Add the performance collection point. (#1041)
cc655e1 is described below

commit cc655e143521d90c564176a739b9c30a9e86b0ae
Author: 彭勇升 pengys <80...@qq.com>
AuthorDate: Sat Apr 7 17:17:12 2018 +0800

    1. Add the performance collection point. (#1041)
    
    2. Report formatter.
    
    #1032
---
 .../ApplicationComponentDayPersistenceWorker.java  |  9 +-
 .../ApplicationComponentHourPersistenceWorker.java |  9 +-
 ...pplicationComponentMinuteAggregationWorker.java | 10 ++-
 ...pplicationComponentMinutePersistenceWorker.java |  9 +-
 .../ApplicationComponentMinuteRemoteWorker.java    |  5 +-
 ...ApplicationComponentMonthPersistenceWorker.java |  9 +-
 .../ApplicationComponentSpanListener.java          |  2 +-
 .../ApplicationMappingDayPersistenceWorker.java    |  9 +-
 .../ApplicationMappingHourPersistenceWorker.java   |  9 +-
 .../ApplicationMappingMinuteAggregationWorker.java | 10 ++-
 .../ApplicationMappingMinutePersistenceWorker.java |  9 +-
 .../ApplicationMappingMinuteRemoteWorker.java      |  5 +-
 .../ApplicationMappingMonthPersistenceWorker.java  |  9 +-
 .../mapping/ApplicationMappingSpanListener.java    |  2 +-
 .../ApplicationDayMetricPersistenceWorker.java     |  9 +-
 .../ApplicationHourMetricPersistenceWorker.java    |  9 +-
 .../ApplicationMinuteMetricAggregationWorker.java  | 10 ++-
 .../ApplicationMinuteMetricPersistenceWorker.java  |  9 +-
 .../ApplicationMinuteMetricRemoteWorker.java       |  5 +-
 .../ApplicationMonthMetricPersistenceWorker.java   |  9 +-
 ...icationReferenceDayMetricPersistenceWorker.java |  9 +-
 ...cationReferenceHourMetricPersistenceWorker.java |  9 +-
 ...tionReferenceMinuteMetricAggregationWorker.java | 10 ++-
 ...tionReferenceMinuteMetricPersistenceWorker.java |  9 +-
 ...plicationReferenceMinuteMetricRemoteWorker.java |  5 +-
 ...ationReferenceMonthMetricPersistenceWorker.java |  9 +-
 .../global/GlobalTracePersistenceWorker.java       |  9 +-
 .../heartbeat/InstHeartBeatPersistenceWorker.java  |  8 +-
 .../InstanceMappingDayPersistenceWorker.java       |  9 +-
 .../InstanceMappingHourPersistenceWorker.java      |  9 +-
 .../InstanceMappingMinuteAggregationWorker.java    | 10 ++-
 .../InstanceMappingMinutePersistenceWorker.java    |  9 +-
 .../mapping/InstanceMappingMinuteRemoteWorker.java |  5 +-
 .../InstanceMappingMonthPersistenceWorker.java     |  9 +-
 .../metric/InstanceDayMetricPersistenceWorker.java |  9 +-
 .../InstanceHourMetricPersistenceWorker.java       |  9 +-
 .../InstanceMinuteMetricAggregationWorker.java     | 10 ++-
 .../InstanceMinuteMetricPersistenceWorker.java     |  9 +-
 .../metric/InstanceMinuteMetricRemoteWorker.java   |  5 +-
 .../InstanceMonthMetricPersistenceWorker.java      |  9 +-
 ...nstanceReferenceDayMetricPersistenceWorker.java |  9 +-
 ...stanceReferenceHourMetricPersistenceWorker.java |  9 +-
 ...anceReferenceMinuteMetricAggregationWorker.java | 10 ++-
 ...anceReferenceMinuteMetricPersistenceWorker.java |  9 +-
 .../InstanceReferenceMinuteMetricRemoteWorker.java |  5 +-
 ...tanceReferenceMonthMetricPersistenceWorker.java |  9 +-
 .../segment/SegmentDurationPersistenceWorker.java  |  9 +-
 .../metric/ServiceDayMetricPersistenceWorker.java  |  9 +-
 .../metric/ServiceHourMetricPersistenceWorker.java |  9 +-
 .../ServiceMetricMinuteAggregationWorker.java      | 10 ++-
 .../ServiceMinuteMetricPersistenceWorker.java      |  9 +-
 .../metric/ServiceMinuteMetricRemoteWorker.java    |  5 +-
 .../ServiceMonthMetricPersistenceWorker.java       |  9 +-
 ...ServiceReferenceDayMetricPersistenceWorker.java | 14 +++-
 ...erviceReferenceHourMetricPersistenceWorker.java | 14 +++-
 ...viceReferenceMinuteMetricAggregationWorker.java | 10 ++-
 ...viceReferenceMinuteMetricPersistenceWorker.java | 14 +++-
 .../ServiceReferenceMinuteMetricRemoteWorker.java  |  5 +-
 ...rviceReferenceMonthMetricPersistenceWorker.java | 14 +++-
 .../parser/provider/parser/SegmentParse.java       |  7 +-
 .../worker/model/base/LocalAsyncWorkerRef.java     |  2 -
 .../worker/model/impl/AggregationWorker.java       |  2 +-
 .../worker/model/impl/PersistenceWorker.java       |  9 +-
 .../analysis/worker/timer/PersistenceTimer.java    | 14 ++--
 .../instrument/CollectorInstrumentAgent.java       |  8 +-
 .../apm/collector/instrument/MetricTree.java       | 98 +++++++++-------------
 .../apm/collector/instrument/ReportWriter.java     |  1 -
 .../apm/collector/instrument/ServiceMetric.java    | 36 ++++----
 .../instrument/ServiceMetricBatchRecord.java       | 10 +--
 .../collector/instrument/ServiceMetricRecord.java  | 24 +++---
 .../collector/instrument/ServiceMetricTracing.java | 12 +--
 .../apm/collector/instrument/tools/Metric.java     | 96 +++++++++++++++++++++
 .../collector/instrument/tools/MetricReader.java   | 79 +++++++++++++++++
 .../{ReportWriter.java => tools/Report.java}       | 23 +++--
 .../instrument/tools/ReportBufferReader.java       | 62 ++++++++++++++
 .../instrument/tools/ReportFormatRunner.java       | 57 +++++++++++++
 .../instrument/tools/ReportFormatter.java          | 66 +++++++++++++++
 .../src/main/resources/log4j2.xml                  | 31 +++++++
 .../instrument/MetricTreePrintTestCase.java        | 51 +++++++++++
 .../src/test/resources/log4j2.xml                  | 31 +++++++
 .../es/base/dao/AbstractPersistenceEsDAO.java      | 11 ++-
 .../collector/storage/es/base/dao/BatchEsDAO.java  |  5 +-
 .../es/dao/InstanceHeartBeatEsPersistenceDAO.java  |  2 +
 ...stractApplicationComponentEsPersistenceDAO.java |  6 ++
 .../ApplicationComponentDayEsPersistenceDAO.java   |  4 -
 .../AbstractApplicationMetricEsPersistenceDAO.java |  6 ++
 ...AbstractApplicationMappingEsPersistenceDAO.java |  6 ++
 ...ApplicationReferenceMetricEsPersistenceDAO.java |  6 ++
 .../dao/cpu/AbstractCpuMetricEsPersistenceDAO.java |  6 ++
 .../dao/gc/AbstractGCMetricEsPersistenceDAO.java   |  6 ++
 .../AbstractInstanceMetricEsPersistenceDAO.java    |  9 +-
 .../AbstractInstanceMappingEsPersistenceDAO.java   |  6 ++
 ...actInstanceReferenceMetricEsPersistenceDAO.java |  6 ++
 .../AbstractMemoryMetricEsPersistenceDAO.java      |  6 ++
 .../AbstractMemoryPoolMetricEsPersistenceDAO.java  | 29 ++++---
 .../smp/AbstractServiceMetricEsPersistenceDAO.java |  6 ++
 ...ractServiceReferenceMetricEsPersistenceDAO.java |  6 ++
 apm-collector/pom.xml                              |  2 +-
 98 files changed, 1129 insertions(+), 227 deletions(-)

diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentDayPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentDayPersistenceWorker.java
index 4da338c..93b11d3 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentDayPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentDayPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.acp.IApplicationComponentDayPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponent;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponentTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationComponentDayPersistenceWorker extends PersistenceWorker<ApplicationComponent> {
 
-    public ApplicationComponentDayPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationComponentDayPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationComponentDayPersistenceWorker extends PersistenceWorker<
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationComponentTable.TABLE + "/day")
+    @Override protected void onWork(ApplicationComponent input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentHourPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentHourPersistenceWorker.java
index fc18f82..6e04770 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentHourPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentHourPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.acp.IApplicationComponentHourPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponent;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponentTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationComponentHourPersistenceWorker extends PersistenceWorker<ApplicationComponent> {
 
-    public ApplicationComponentHourPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationComponentHourPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationComponentHourPersistenceWorker extends PersistenceWorker
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationComponentTable.TABLE + "/hour")
+    @Override protected void onWork(ApplicationComponent input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinuteAggregationWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinuteAggregationWorker.java
index bfadf6b..3ca4287 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinuteAggregationWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinuteAggregationWorker.java
@@ -20,16 +20,19 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractLocalAsyncWorkerProvider;
+import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.AggregationWorker;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponent;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponentTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationComponentMinuteAggregationWorker extends AggregationWorker<ApplicationComponent, ApplicationComponent> {
 
-    public ApplicationComponentMinuteAggregationWorker(ModuleManager moduleManager) {
+    private ApplicationComponentMinuteAggregationWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -52,4 +55,9 @@ public class ApplicationComponentMinuteAggregationWorker extends AggregationWork
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/aggregation/onWork/" + ApplicationComponentTable.TABLE)
+    @Override protected void onWork(ApplicationComponent message) throws WorkerException {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinutePersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinutePersistenceWorker.java
index 78ca9cd..4642775 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinutePersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinutePersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.acp.IApplicationComponentMinutePersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponent;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponentTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationComponentMinutePersistenceWorker extends PersistenceWorker<ApplicationComponent> {
 
-    public ApplicationComponentMinutePersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationComponentMinutePersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationComponentMinutePersistenceWorker extends PersistenceWork
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationComponentTable.TABLE + "/minute")
+    @Override protected void onWork(ApplicationComponent message) {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinuteRemoteWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinuteRemoteWorker.java
index d262b71..71c6caf 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinuteRemoteWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMinuteRemoteWorker.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorker;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorkerProvider;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.remote.service.RemoteSenderService;
 import org.apache.skywalking.apm.collector.remote.service.Selector;
@@ -32,7 +31,7 @@ import org.apache.skywalking.apm.collector.storage.table.application.Application
  */
 public class ApplicationComponentMinuteRemoteWorker extends AbstractRemoteWorker<ApplicationComponent, ApplicationComponent> {
 
-    ApplicationComponentMinuteRemoteWorker(ModuleManager moduleManager) {
+    private ApplicationComponentMinuteRemoteWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -40,7 +39,7 @@ public class ApplicationComponentMinuteRemoteWorker extends AbstractRemoteWorker
         return MetricWorkerIdDefine.APPLICATION_COMPONENT_MINUTE_REMOTE_WORKER_ID;
     }
 
-    @Override protected void onWork(ApplicationComponent applicationComponent) throws WorkerException {
+    @Override protected void onWork(ApplicationComponent applicationComponent) {
         onNext(applicationComponent);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMonthPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMonthPersistenceWorker.java
index bd5d2f0..bcd3578 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMonthPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentMonthPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.acp.IApplicationComponentMonthPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponent;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponentTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationComponentMonthPersistenceWorker extends PersistenceWorker<ApplicationComponent> {
 
-    public ApplicationComponentMonthPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationComponentMonthPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationComponentMonthPersistenceWorker extends PersistenceWorke
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationComponentTable.TABLE + "/month")
+    @Override protected void onWork(ApplicationComponent message) {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentSpanListener.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentSpanListener.java
index aa9ddee..1ca67f5 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentSpanListener.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/component/ApplicationComponentSpanListener.java
@@ -45,7 +45,7 @@ public class ApplicationComponentSpanListener implements EntrySpanListener, Exit
     private List<ApplicationComponent> applicationComponents = new ArrayList<>();
     private long timeBucket;
 
-    ApplicationComponentSpanListener(ModuleManager moduleManager) {
+    private ApplicationComponentSpanListener(ModuleManager moduleManager) {
         this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingDayPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingDayPersistenceWorker.java
index 7160009..78ad182 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingDayPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingDayPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.ampp.IApplicationMappingDayPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMapping;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMappingTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationMappingDayPersistenceWorker extends PersistenceWorker<ApplicationMapping> {
 
-    ApplicationMappingDayPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationMappingDayPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationMappingDayPersistenceWorker extends PersistenceWorker<Ap
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationMappingTable.TABLE + "/day")
+    @Override protected void onWork(ApplicationMapping input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingHourPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingHourPersistenceWorker.java
index 953876e..5604959 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingHourPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingHourPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.ampp.IApplicationMappingHourPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMapping;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMappingTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationMappingHourPersistenceWorker extends PersistenceWorker<ApplicationMapping> {
 
-    ApplicationMappingHourPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationMappingHourPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationMappingHourPersistenceWorker extends PersistenceWorker<A
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationMappingTable.TABLE + "/hour")
+    @Override protected void onWork(ApplicationMapping input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinuteAggregationWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinuteAggregationWorker.java
index 60aa45d..823703a 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinuteAggregationWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinuteAggregationWorker.java
@@ -20,16 +20,19 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractLocalAsyncWorkerProvider;
+import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.AggregationWorker;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMapping;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMappingTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationMappingMinuteAggregationWorker extends AggregationWorker<ApplicationMapping, ApplicationMapping> {
 
-    ApplicationMappingMinuteAggregationWorker(ModuleManager moduleManager) {
+    private ApplicationMappingMinuteAggregationWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -52,4 +55,9 @@ public class ApplicationMappingMinuteAggregationWorker extends AggregationWorker
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/aggregation/onWork/" + ApplicationMappingTable.TABLE)
+    @Override protected void onWork(ApplicationMapping message) throws WorkerException {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinutePersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinutePersistenceWorker.java
index 71ebf4d..ab45203 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinutePersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinutePersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.ampp.IApplicationMappingMinutePersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMapping;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMappingTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationMappingMinutePersistenceWorker extends PersistenceWorker<ApplicationMapping> {
 
-    ApplicationMappingMinutePersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationMappingMinutePersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationMappingMinutePersistenceWorker extends PersistenceWorker
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationMappingTable.TABLE + "/minute")
+    @Override protected void onWork(ApplicationMapping input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinuteRemoteWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinuteRemoteWorker.java
index 585af25..b8d6a3d 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinuteRemoteWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMinuteRemoteWorker.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorker;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorkerProvider;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.remote.service.RemoteSenderService;
 import org.apache.skywalking.apm.collector.remote.service.Selector;
@@ -32,7 +31,7 @@ import org.apache.skywalking.apm.collector.storage.table.application.Application
  */
 public class ApplicationMappingMinuteRemoteWorker extends AbstractRemoteWorker<ApplicationMapping, ApplicationMapping> {
 
-    ApplicationMappingMinuteRemoteWorker(ModuleManager moduleManager) {
+    private ApplicationMappingMinuteRemoteWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -40,7 +39,7 @@ public class ApplicationMappingMinuteRemoteWorker extends AbstractRemoteWorker<A
         return MetricWorkerIdDefine.APPLICATION_MAPPING_MINUTE_REMOTE_WORKER_ID;
     }
 
-    @Override protected void onWork(ApplicationMapping applicationMapping) throws WorkerException {
+    @Override protected void onWork(ApplicationMapping applicationMapping) {
         onNext(applicationMapping);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMonthPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMonthPersistenceWorker.java
index 51aaf31..7e0b084 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMonthPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingMonthPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.ampp.IApplicationMappingMonthPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMapping;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMappingTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationMappingMonthPersistenceWorker extends PersistenceWorker<ApplicationMapping> {
 
-    ApplicationMappingMonthPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationMappingMonthPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationMappingMonthPersistenceWorker extends PersistenceWorker<
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationMappingTable.TABLE + "/month")
+    @Override protected void onWork(ApplicationMapping input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingSpanListener.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingSpanListener.java
index 15de2c7..3f2d0ca 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingSpanListener.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/mapping/ApplicationMappingSpanListener.java
@@ -49,7 +49,7 @@ public class ApplicationMappingSpanListener implements FirstSpanListener, EntryS
     private List<ApplicationMapping> applicationMappings = new LinkedList<>();
     private long timeBucket;
 
-    ApplicationMappingSpanListener(ModuleManager moduleManager) {
+    private ApplicationMappingSpanListener(ModuleManager moduleManager) {
         this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationDayMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationDayMetricPersistenceWorker.java
index 4a64714..53b25d8 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationDayMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationDayMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.amp.IApplicationDayMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetric;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationDayMetricPersistenceWorker extends PersistenceWorker<ApplicationMetric> {
 
-    public ApplicationDayMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationDayMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationDayMetricPersistenceWorker extends PersistenceWorker<App
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationMetricTable.TABLE + "/day")
+    @Override protected void onWork(ApplicationMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationHourMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationHourMetricPersistenceWorker.java
index 4f7d4e7..f30186e 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationHourMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationHourMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.amp.IApplicationHourMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetric;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationHourMetricPersistenceWorker extends PersistenceWorker<ApplicationMetric> {
 
-    public ApplicationHourMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationHourMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationHourMetricPersistenceWorker extends PersistenceWorker<Ap
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationMetricTable.TABLE + "/hour")
+    @Override protected void onWork(ApplicationMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricAggregationWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricAggregationWorker.java
index 4c21b95..0824970 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricAggregationWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricAggregationWorker.java
@@ -20,10 +20,13 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractLocalAsyncWorkerProvider;
+import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.AggregationWorker;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 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.table.application.ApplicationMetric;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetricTable;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetric;
 
 /**
@@ -31,7 +34,7 @@ import org.apache.skywalking.apm.collector.storage.table.application.Application
  */
 public class ApplicationMinuteMetricAggregationWorker extends AggregationWorker<ApplicationReferenceMetric, ApplicationMetric> {
 
-    public ApplicationMinuteMetricAggregationWorker(ModuleManager moduleManager) {
+    private ApplicationMinuteMetricAggregationWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -94,4 +97,9 @@ public class ApplicationMinuteMetricAggregationWorker extends AggregationWorker<
             return 256;
         }
     }
+
+    @GraphComputingMetric(name = "/aggregate/onWork/" + ApplicationMetricTable.TABLE)
+    @Override protected void onWork(ApplicationReferenceMetric message) throws WorkerException {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricPersistenceWorker.java
index 89c97a0..ed0dd95 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.amp.IApplicationMinuteMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetric;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationMinuteMetricPersistenceWorker extends PersistenceWorker<ApplicationMetric> {
 
-    public ApplicationMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationMinuteMetricPersistenceWorker extends PersistenceWorker<
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationMetricTable.TABLE + "/minute")
+    @Override protected void onWork(ApplicationMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricRemoteWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricRemoteWorker.java
index 6aea536..dffdc2e 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricRemoteWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMinuteMetricRemoteWorker.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorker;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorkerProvider;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.remote.service.RemoteSenderService;
 import org.apache.skywalking.apm.collector.remote.service.Selector;
@@ -32,7 +31,7 @@ import org.apache.skywalking.apm.collector.storage.table.application.Application
  */
 public class ApplicationMinuteMetricRemoteWorker extends AbstractRemoteWorker<ApplicationMetric, ApplicationMetric> {
 
-    public ApplicationMinuteMetricRemoteWorker(ModuleManager moduleManager) {
+    private ApplicationMinuteMetricRemoteWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -40,7 +39,7 @@ public class ApplicationMinuteMetricRemoteWorker extends AbstractRemoteWorker<Ap
         return MetricWorkerIdDefine.APPLICATION_MINUTE_METRIC_REMOTE_WORKER_ID;
     }
 
-    @Override protected void onWork(ApplicationMetric applicationMetric) throws WorkerException {
+    @Override protected void onWork(ApplicationMetric applicationMetric) {
         onNext(applicationMetric);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMonthMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMonthMetricPersistenceWorker.java
index 8419cdb..366d988 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMonthMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/metric/ApplicationMonthMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.amp.IApplicationMonthMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetric;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationMonthMetricPersistenceWorker extends PersistenceWorker<ApplicationMetric> {
 
-    public ApplicationMonthMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationMonthMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationMonthMetricPersistenceWorker extends PersistenceWorker<A
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationMetricTable.TABLE + "/month")
+    @Override protected void onWork(ApplicationMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceDayMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceDayMetricPersistenceWorker.java
index 2741c3c..0a37e84 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceDayMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceDayMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.armp.IApplicationReferenceDayMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationReferenceDayMetricPersistenceWorker extends PersistenceWorker<ApplicationReferenceMetric> {
 
-    public ApplicationReferenceDayMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationReferenceDayMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationReferenceDayMetricPersistenceWorker extends PersistenceW
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationReferenceMetricTable.TABLE + "/day")
+    @Override protected void onWork(ApplicationReferenceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceHourMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceHourMetricPersistenceWorker.java
index 7a74d2e..2720fe6 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceHourMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceHourMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.armp.IApplicationReferenceHourMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationReferenceHourMetricPersistenceWorker extends PersistenceWorker<ApplicationReferenceMetric> {
 
-    public ApplicationReferenceHourMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationReferenceHourMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationReferenceHourMetricPersistenceWorker extends Persistence
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationReferenceMetricTable.TABLE + "/hour")
+    @Override protected void onWork(ApplicationReferenceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricAggregationWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricAggregationWorker.java
index 3910de5..b3de61d 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricAggregationWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricAggregationWorker.java
@@ -20,15 +20,18 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractLocalAsyncWorkerProvider;
+import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.AggregationWorker;
 import org.apache.skywalking.apm.collector.cache.CacheModule;
 import org.apache.skywalking.apm.collector.cache.service.InstanceCacheService;
 import org.apache.skywalking.apm.collector.configuration.ConfigurationModule;
 import org.apache.skywalking.apm.collector.configuration.service.IApdexThresholdService;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.core.util.ApdexThresholdUtils;
 import org.apache.skywalking.apm.collector.core.util.Const;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetricTable;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetric;
 
 /**
@@ -39,7 +42,7 @@ public class ApplicationReferenceMinuteMetricAggregationWorker extends Aggregati
     private final InstanceCacheService instanceCacheService;
     private final IApdexThresholdService apdexThresholdService;
 
-    public ApplicationReferenceMinuteMetricAggregationWorker(ModuleManager moduleManager) {
+    private ApplicationReferenceMinuteMetricAggregationWorker(ModuleManager moduleManager) {
         super(moduleManager);
         this.instanceCacheService = moduleManager.find(CacheModule.NAME).getService(InstanceCacheService.class);
         this.apdexThresholdService = moduleManager.find(ConfigurationModule.NAME).getService(IApdexThresholdService.class);
@@ -111,4 +114,9 @@ public class ApplicationReferenceMinuteMetricAggregationWorker extends Aggregati
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/aggregate/onWork/" + ApplicationReferenceMetricTable.TABLE)
+    @Override protected void onWork(InstanceReferenceMetric message) throws WorkerException {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricPersistenceWorker.java
index 72b5429..dc08610 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.armp.IApplicationReferenceMinuteMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationReferenceMinuteMetricPersistenceWorker extends PersistenceWorker<ApplicationReferenceMetric> {
 
-    public ApplicationReferenceMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationReferenceMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationReferenceMinuteMetricPersistenceWorker extends Persisten
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationReferenceMetricTable.TABLE + "/minute")
+    @Override protected void onWork(ApplicationReferenceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricRemoteWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricRemoteWorker.java
index a39bd7a..d11329f 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricRemoteWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMinuteMetricRemoteWorker.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorker;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorkerProvider;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.remote.service.RemoteSenderService;
 import org.apache.skywalking.apm.collector.remote.service.Selector;
@@ -32,7 +31,7 @@ import org.apache.skywalking.apm.collector.storage.table.application.Application
  */
 public class ApplicationReferenceMinuteMetricRemoteWorker extends AbstractRemoteWorker<ApplicationReferenceMetric, ApplicationReferenceMetric> {
 
-    ApplicationReferenceMinuteMetricRemoteWorker(ModuleManager moduleManager) {
+    private ApplicationReferenceMinuteMetricRemoteWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -40,7 +39,7 @@ public class ApplicationReferenceMinuteMetricRemoteWorker extends AbstractRemote
         return MetricWorkerIdDefine.APPLICATION_REFERENCE_MINUTE_METRIC_REMOTE_WORKER_ID;
     }
 
-    @Override protected void onWork(ApplicationReferenceMetric applicationReferenceMetric) throws WorkerException {
+    @Override protected void onWork(ApplicationReferenceMetric applicationReferenceMetric) {
         onNext(applicationReferenceMetric);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMonthMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMonthMetricPersistenceWorker.java
index ac6f3b5..7c5e4c9 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMonthMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/application/refmetric/ApplicationReferenceMonthMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.appl
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.armp.IApplicationReferenceMonthMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationReferenceMonthMetricPersistenceWorker extends PersistenceWorker<ApplicationReferenceMetric> {
 
-    public ApplicationReferenceMonthMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ApplicationReferenceMonthMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ApplicationReferenceMonthMetricPersistenceWorker extends Persistenc
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ApplicationReferenceMetricTable.TABLE + "/month")
+    @Override protected void onWork(ApplicationReferenceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/global/GlobalTracePersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/global/GlobalTracePersistenceWorker.java
index bb4bd64..d3c66a8 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/global/GlobalTracePersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/global/GlobalTracePersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.glob
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.IGlobalTracePersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.global.GlobalTrace;
+import org.apache.skywalking.apm.collector.storage.table.global.GlobalTraceTable;
 
 /**
  * @author peng-yongsheng
  */
 public class GlobalTracePersistenceWorker extends PersistenceWorker<GlobalTrace> {
 
-    public GlobalTracePersistenceWorker(ModuleManager moduleManager) {
+    private GlobalTracePersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class GlobalTracePersistenceWorker extends PersistenceWorker<GlobalTrace>
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + GlobalTraceTable.TABLE)
+    @Override protected void onWork(GlobalTrace input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/heartbeat/InstHeartBeatPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/heartbeat/InstHeartBeatPersistenceWorker.java
index d157d0a..e7bb00b 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/heartbeat/InstHeartBeatPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/heartbeat/InstHeartBeatPersistenceWorker.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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 +33,7 @@ import org.apache.skywalking.apm.collector.storage.table.register.Instance;
  */
 public class InstHeartBeatPersistenceWorker extends PersistenceWorker<Instance> {
 
-    public InstHeartBeatPersistenceWorker(ModuleManager moduleManager) {
+    private InstHeartBeatPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +65,9 @@ public class InstHeartBeatPersistenceWorker extends PersistenceWorker<Instance>
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/instance/heartbeat")
+    @Override protected void onWork(Instance input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingDayPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingDayPersistenceWorker.java
index d0f31f9..94c3790 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingDayPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingDayPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.impp.IInstanceMappingDayPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMapping;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMappingTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceMappingDayPersistenceWorker extends PersistenceWorker<InstanceMapping> {
 
-    InstanceMappingDayPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceMappingDayPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceMappingDayPersistenceWorker extends PersistenceWorker<Insta
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceMappingTable.TABLE + "/day")
+    @Override protected void onWork(InstanceMapping input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingHourPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingHourPersistenceWorker.java
index 9c9307d..026b1f7 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingHourPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingHourPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.impp.IInstanceMappingHourPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMapping;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMappingTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceMappingHourPersistenceWorker extends PersistenceWorker<InstanceMapping> {
 
-    InstanceMappingHourPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceMappingHourPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceMappingHourPersistenceWorker extends PersistenceWorker<Inst
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceMappingTable.TABLE + "/hour")
+    @Override protected void onWork(InstanceMapping input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinuteAggregationWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinuteAggregationWorker.java
index 1154641..ec35a2c 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinuteAggregationWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinuteAggregationWorker.java
@@ -20,16 +20,19 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractLocalAsyncWorkerProvider;
+import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.AggregationWorker;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMapping;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMappingTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceMappingMinuteAggregationWorker extends AggregationWorker<InstanceMapping, InstanceMapping> {
 
-    InstanceMappingMinuteAggregationWorker(ModuleManager moduleManager) {
+    private InstanceMappingMinuteAggregationWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -52,4 +55,9 @@ public class InstanceMappingMinuteAggregationWorker extends AggregationWorker<In
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/aggregate/onWork/" + InstanceMappingTable.TABLE)
+    @Override protected void onWork(InstanceMapping message) throws WorkerException {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinutePersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinutePersistenceWorker.java
index 3a95ce0..6c0b0a7 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinutePersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinutePersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.impp.IInstanceMappingMinutePersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMapping;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMappingTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceMappingMinutePersistenceWorker extends PersistenceWorker<InstanceMapping> {
 
-    InstanceMappingMinutePersistenceWorker(ModuleManager moduleManager) {
+    private InstanceMappingMinutePersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceMappingMinutePersistenceWorker extends PersistenceWorker<In
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceMappingTable.TABLE + "/minute")
+    @Override protected void onWork(InstanceMapping input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinuteRemoteWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinuteRemoteWorker.java
index ced825b..c01ebee 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinuteRemoteWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMinuteRemoteWorker.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorker;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorkerProvider;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.remote.service.RemoteSenderService;
 import org.apache.skywalking.apm.collector.remote.service.Selector;
@@ -32,7 +31,7 @@ import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMappin
  */
 public class InstanceMappingMinuteRemoteWorker extends AbstractRemoteWorker<InstanceMapping, InstanceMapping> {
 
-    InstanceMappingMinuteRemoteWorker(ModuleManager moduleManager) {
+    private InstanceMappingMinuteRemoteWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -40,7 +39,7 @@ public class InstanceMappingMinuteRemoteWorker extends AbstractRemoteWorker<Inst
         return MetricWorkerIdDefine.INSTANCE_MAPPING_MINUTE_REMOTE_WORKER_ID;
     }
 
-    @Override protected void onWork(InstanceMapping instanceMapping) throws WorkerException {
+    @Override protected void onWork(InstanceMapping instanceMapping) {
         onNext(instanceMapping);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMonthPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMonthPersistenceWorker.java
index 0752040..c017d52 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMonthPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/mapping/InstanceMappingMonthPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.impp.IInstanceMappingMonthPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMapping;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMappingTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceMappingMonthPersistenceWorker extends PersistenceWorker<InstanceMapping> {
 
-    InstanceMappingMonthPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceMappingMonthPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceMappingMonthPersistenceWorker extends PersistenceWorker<Ins
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceMappingTable.TABLE + "/month")
+    @Override protected void onWork(InstanceMapping input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceDayMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceDayMetricPersistenceWorker.java
index e65280b..bd12880 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceDayMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceDayMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.imp.IInstanceDayMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetric;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceDayMetricPersistenceWorker extends PersistenceWorker<InstanceMetric> {
 
-    public InstanceDayMetricPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceDayMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceDayMetricPersistenceWorker extends PersistenceWorker<Instan
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceMetricTable.TABLE + "/day")
+    @Override protected void onWork(InstanceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceHourMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceHourMetricPersistenceWorker.java
index 0250bf1..5c01d5c 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceHourMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceHourMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.imp.IInstanceHourMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetric;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceHourMetricPersistenceWorker extends PersistenceWorker<InstanceMetric> {
 
-    public InstanceHourMetricPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceHourMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceHourMetricPersistenceWorker extends PersistenceWorker<Insta
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceMetricTable.TABLE + "/hour")
+    @Override protected void onWork(InstanceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricAggregationWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricAggregationWorker.java
index ff0f92a..36ff02b 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricAggregationWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricAggregationWorker.java
@@ -20,10 +20,13 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractLocalAsyncWorkerProvider;
+import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.AggregationWorker;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 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.table.instance.InstanceMetric;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetricTable;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetric;
 
 /**
@@ -31,7 +34,7 @@ import org.apache.skywalking.apm.collector.storage.table.instance.InstanceRefere
  */
 public class InstanceMinuteMetricAggregationWorker extends AggregationWorker<InstanceReferenceMetric, InstanceMetric> {
 
-    public InstanceMinuteMetricAggregationWorker(ModuleManager moduleManager) {
+    private InstanceMinuteMetricAggregationWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -85,4 +88,9 @@ public class InstanceMinuteMetricAggregationWorker extends AggregationWorker<Ins
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/aggregate/onWork/" + InstanceMetricTable.TABLE)
+    @Override protected void onWork(InstanceReferenceMetric message) throws WorkerException {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricPersistenceWorker.java
index 7b92c60..5d4892d 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.imp.IInstanceMinuteMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetric;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceMinuteMetricPersistenceWorker extends PersistenceWorker<InstanceMetric> {
 
-    public InstanceMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceMinuteMetricPersistenceWorker extends PersistenceWorker<Ins
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceMetricTable.TABLE + "/minute")
+    @Override protected void onWork(InstanceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricRemoteWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricRemoteWorker.java
index 1d32554..f311e12 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricRemoteWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMinuteMetricRemoteWorker.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorker;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorkerProvider;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.remote.service.RemoteSenderService;
 import org.apache.skywalking.apm.collector.remote.service.Selector;
@@ -32,7 +31,7 @@ import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetric
  */
 public class InstanceMinuteMetricRemoteWorker extends AbstractRemoteWorker<InstanceMetric, InstanceMetric> {
 
-    public InstanceMinuteMetricRemoteWorker(ModuleManager moduleManager) {
+    private InstanceMinuteMetricRemoteWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -44,7 +43,7 @@ public class InstanceMinuteMetricRemoteWorker extends AbstractRemoteWorker<Insta
         return Selector.HashCode;
     }
 
-    @Override protected void onWork(InstanceMetric instanceMetric) throws WorkerException {
+    @Override protected void onWork(InstanceMetric instanceMetric) {
         onNext(instanceMetric);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMonthMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMonthMetricPersistenceWorker.java
index d11f827..e492b94 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMonthMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/metric/InstanceMonthMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.imp.IInstanceMonthMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetric;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceMonthMetricPersistenceWorker extends PersistenceWorker<InstanceMetric> {
 
-    public InstanceMonthMetricPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceMonthMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceMonthMetricPersistenceWorker extends PersistenceWorker<Inst
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceMetricTable.TABLE + "/month")
+    @Override protected void onWork(InstanceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceDayMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceDayMetricPersistenceWorker.java
index 2cbd7c1..961321d 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceDayMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceDayMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.irmp.IInstanceReferenceDayMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceReferenceDayMetricPersistenceWorker extends PersistenceWorker<InstanceReferenceMetric> {
 
-    public InstanceReferenceDayMetricPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceReferenceDayMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceReferenceDayMetricPersistenceWorker extends PersistenceWork
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceReferenceMetricTable.TABLE + "/day")
+    @Override protected void onWork(InstanceReferenceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceHourMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceHourMetricPersistenceWorker.java
index f5b2672..621c593 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceHourMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceHourMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.irmp.IInstanceReferenceHourMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceReferenceHourMetricPersistenceWorker extends PersistenceWorker<InstanceReferenceMetric> {
 
-    public InstanceReferenceHourMetricPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceReferenceHourMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceReferenceHourMetricPersistenceWorker extends PersistenceWor
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceReferenceMetricTable.TABLE + "/hour")
+    @Override protected void onWork(InstanceReferenceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricAggregationWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricAggregationWorker.java
index 04b6238..408c70c 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricAggregationWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricAggregationWorker.java
@@ -20,10 +20,13 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractLocalAsyncWorkerProvider;
+import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.AggregationWorker;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 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.table.instance.InstanceReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetricTable;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetric;
 
 /**
@@ -31,7 +34,7 @@ import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenc
  */
 public class InstanceReferenceMinuteMetricAggregationWorker extends AggregationWorker<ServiceReferenceMetric, InstanceReferenceMetric> {
 
-    public InstanceReferenceMinuteMetricAggregationWorker(ModuleManager moduleManager) {
+    private InstanceReferenceMinuteMetricAggregationWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -90,4 +93,9 @@ public class InstanceReferenceMinuteMetricAggregationWorker extends AggregationW
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/aggregate/onWork/" + InstanceReferenceMetricTable.TABLE)
+    @Override protected void onWork(ServiceReferenceMetric message) throws WorkerException {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricPersistenceWorker.java
index c38aa3d..b2980ae 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.irmp.IInstanceReferenceMinuteMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceReferenceMinuteMetricPersistenceWorker extends PersistenceWorker<InstanceReferenceMetric> {
 
-    public InstanceReferenceMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceReferenceMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceReferenceMinuteMetricPersistenceWorker extends PersistenceW
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceReferenceMetricTable.TABLE + "/minute")
+    @Override protected void onWork(InstanceReferenceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricRemoteWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricRemoteWorker.java
index 0ee6609..3d528d5 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricRemoteWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMinuteMetricRemoteWorker.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorker;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorkerProvider;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.remote.service.RemoteSenderService;
 import org.apache.skywalking.apm.collector.remote.service.Selector;
@@ -32,7 +31,7 @@ import org.apache.skywalking.apm.collector.storage.table.instance.InstanceRefere
  */
 public class InstanceReferenceMinuteMetricRemoteWorker extends AbstractRemoteWorker<InstanceReferenceMetric, InstanceReferenceMetric> {
 
-    public InstanceReferenceMinuteMetricRemoteWorker(ModuleManager moduleManager) {
+    private InstanceReferenceMinuteMetricRemoteWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -44,7 +43,7 @@ public class InstanceReferenceMinuteMetricRemoteWorker extends AbstractRemoteWor
         return Selector.HashCode;
     }
 
-    @Override protected void onWork(InstanceReferenceMetric instanceReferenceMetric) throws WorkerException {
+    @Override protected void onWork(InstanceReferenceMetric instanceReferenceMetric) {
         onNext(instanceReferenceMetric);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMonthMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMonthMetricPersistenceWorker.java
index 03972af..28d4841 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMonthMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/instance/refmetric/InstanceReferenceMonthMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.inst
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.irmp.IInstanceReferenceMonthMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class InstanceReferenceMonthMetricPersistenceWorker extends PersistenceWorker<InstanceReferenceMetric> {
 
-    public InstanceReferenceMonthMetricPersistenceWorker(ModuleManager moduleManager) {
+    private InstanceReferenceMonthMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class InstanceReferenceMonthMetricPersistenceWorker extends PersistenceWo
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + InstanceReferenceMetricTable.TABLE + "/month")
+    @Override protected void onWork(InstanceReferenceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/segment/SegmentDurationPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/segment/SegmentDurationPersistenceWorker.java
index 17e9d77..ea9a517 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/segment/SegmentDurationPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/segment/SegmentDurationPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.segm
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.ISegmentDurationPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.segment.SegmentDuration;
+import org.apache.skywalking.apm.collector.storage.table.segment.SegmentDurationTable;
 
 /**
  * @author peng-yongsheng
  */
 public class SegmentDurationPersistenceWorker extends PersistenceWorker<SegmentDuration> {
 
-    SegmentDurationPersistenceWorker(ModuleManager moduleManager) {
+    private SegmentDurationPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class SegmentDurationPersistenceWorker extends PersistenceWorker<SegmentD
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + SegmentDurationTable.TABLE)
+    @Override protected void onWork(SegmentDuration input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceDayMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceDayMetricPersistenceWorker.java
index fb2e112..ac81d42 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceDayMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceDayMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.smp.IServiceDayMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetric;
+import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ServiceDayMetricPersistenceWorker extends PersistenceWorker<ServiceMetric> {
 
-    public ServiceDayMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ServiceDayMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ServiceDayMetricPersistenceWorker extends PersistenceWorker<Service
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ServiceMetricTable.TABLE + "/day")
+    @Override protected void onWork(ServiceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceHourMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceHourMetricPersistenceWorker.java
index 712735f..902dd2c 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceHourMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceHourMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.smp.IServiceHourMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetric;
+import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ServiceHourMetricPersistenceWorker extends PersistenceWorker<ServiceMetric> {
 
-    public ServiceHourMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ServiceHourMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ServiceHourMetricPersistenceWorker extends PersistenceWorker<Servic
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ServiceMetricTable.TABLE + "/hour")
+    @Override protected void onWork(ServiceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMetricMinuteAggregationWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMetricMinuteAggregationWorker.java
index 59c49c0..ad7685d 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMetricMinuteAggregationWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMetricMinuteAggregationWorker.java
@@ -20,10 +20,13 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractLocalAsyncWorkerProvider;
+import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.AggregationWorker;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 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.table.service.ServiceMetric;
+import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetricTable;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetric;
 
 /**
@@ -31,7 +34,7 @@ import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenc
  */
 public class ServiceMetricMinuteAggregationWorker extends AggregationWorker<ServiceReferenceMetric, ServiceMetric> {
 
-    public ServiceMetricMinuteAggregationWorker(ModuleManager moduleManager) {
+    private ServiceMetricMinuteAggregationWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -90,4 +93,9 @@ public class ServiceMetricMinuteAggregationWorker extends AggregationWorker<Serv
             return 256;
         }
     }
+
+    @GraphComputingMetric(name = "/aggregate/onWork/" + ServiceMetricTable.TABLE)
+    @Override protected void onWork(ServiceReferenceMetric message) throws WorkerException {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMinuteMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMinuteMetricPersistenceWorker.java
index e874851..453b1df 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMinuteMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMinuteMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.smp.IServiceMinuteMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetric;
+import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ServiceMinuteMetricPersistenceWorker extends PersistenceWorker<ServiceMetric> {
 
-    public ServiceMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ServiceMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ServiceMinuteMetricPersistenceWorker extends PersistenceWorker<Serv
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ServiceMetricTable.TABLE + "/minute")
+    @Override protected void onWork(ServiceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMinuteMetricRemoteWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMinuteMetricRemoteWorker.java
index e9375aa..f149f5c 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMinuteMetricRemoteWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMinuteMetricRemoteWorker.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorker;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorkerProvider;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.remote.service.RemoteSenderService;
 import org.apache.skywalking.apm.collector.remote.service.Selector;
@@ -32,7 +31,7 @@ import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetric;
  */
 public class ServiceMinuteMetricRemoteWorker extends AbstractRemoteWorker<ServiceMetric, ServiceMetric> {
 
-    public ServiceMinuteMetricRemoteWorker(ModuleManager moduleManager) {
+    private ServiceMinuteMetricRemoteWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -40,7 +39,7 @@ public class ServiceMinuteMetricRemoteWorker extends AbstractRemoteWorker<Servic
         return MetricWorkerIdDefine.SERVICE_MINUTE_METRIC_REMOTE_WORKER_ID;
     }
 
-    @Override protected void onWork(ServiceMetric serviceMetric) throws WorkerException {
+    @Override protected void onWork(ServiceMetric serviceMetric) {
         onNext(serviceMetric);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMonthMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMonthMetricPersistenceWorker.java
index cce30ab..cde7d13 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMonthMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/metric/ServiceMonthMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.smp.IServiceMonthMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetric;
+import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ServiceMonthMetricPersistenceWorker extends PersistenceWorker<ServiceMetric> {
 
-    public ServiceMonthMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ServiceMonthMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,9 @@ public class ServiceMonthMetricPersistenceWorker extends PersistenceWorker<Servi
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ServiceMetricTable.TABLE + "/month")
+    @Override protected void onWork(ServiceMetric input) {
+        super.onWork(input);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceDayMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceDayMetricPersistenceWorker.java
index 4fa92ec..715f627 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceDayMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceDayMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.srmp.IServiceReferenceDayMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ServiceReferenceDayMetricPersistenceWorker extends PersistenceWorker<ServiceReferenceMetric> {
 
-    public ServiceReferenceDayMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ServiceReferenceDayMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,14 @@ public class ServiceReferenceDayMetricPersistenceWorker extends PersistenceWorke
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ServiceReferenceMetricTable.TABLE)
+    @Override protected void onWork(ServiceReferenceMetric input) {
+        super.onWork(input);
+    }
+
+    @GraphComputingMetric(name = "/persistence/flushAndSwitch/" + ServiceReferenceMetricTable.TABLE)
+    @Override public void flushAndSwitch() {
+        super.flushAndSwitch();
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceHourMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceHourMetricPersistenceWorker.java
index 53b8263..35491de 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceHourMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceHourMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.srmp.IServiceReferenceHourMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ServiceReferenceHourMetricPersistenceWorker extends PersistenceWorker<ServiceReferenceMetric> {
 
-    public ServiceReferenceHourMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ServiceReferenceHourMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,14 @@ public class ServiceReferenceHourMetricPersistenceWorker extends PersistenceWork
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ServiceReferenceMetricTable.TABLE + "/hour")
+    @Override protected void onWork(ServiceReferenceMetric input) {
+        super.onWork(input);
+    }
+
+    @GraphComputingMetric(name = "/persistence/flushAndSwitch/" + ServiceReferenceMetricTable.TABLE + "/hour")
+    @Override public void flushAndSwitch() {
+        super.flushAndSwitch();
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricAggregationWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricAggregationWorker.java
index 4ac0d98..8a23417 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricAggregationWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricAggregationWorker.java
@@ -20,16 +20,19 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractLocalAsyncWorkerProvider;
+import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.AggregationWorker;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ServiceReferenceMinuteMetricAggregationWorker extends AggregationWorker<ServiceReferenceMetric, ServiceReferenceMetric> {
 
-    public ServiceReferenceMinuteMetricAggregationWorker(ModuleManager moduleManager) {
+    private ServiceReferenceMinuteMetricAggregationWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -52,4 +55,9 @@ public class ServiceReferenceMinuteMetricAggregationWorker extends AggregationWo
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/aggregate/onWork/" + ServiceReferenceMetricTable.TABLE)
+    @Override protected void onWork(ServiceReferenceMetric message) throws WorkerException {
+        super.onWork(message);
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricPersistenceWorker.java
index 1eeef72..a9a026c 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.srmp.IServiceReferenceMinuteMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ServiceReferenceMinuteMetricPersistenceWorker extends PersistenceWorker<ServiceReferenceMetric> {
 
-    public ServiceReferenceMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ServiceReferenceMinuteMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,14 @@ public class ServiceReferenceMinuteMetricPersistenceWorker extends PersistenceWo
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ServiceReferenceMetricTable.TABLE + "/minute")
+    @Override protected void onWork(ServiceReferenceMetric input) {
+        super.onWork(input);
+    }
+
+    @GraphComputingMetric(name = "/persistence/flushAndSwitch/" + ServiceReferenceMetricTable.TABLE + "/minute")
+    @Override public void flushAndSwitch() {
+        super.flushAndSwitch();
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricRemoteWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricRemoteWorker.java
index 500d006..f92e12e 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricRemoteWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMinuteMetricRemoteWorker.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorker;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractRemoteWorkerProvider;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.remote.service.RemoteSenderService;
 import org.apache.skywalking.apm.collector.remote.service.Selector;
@@ -32,7 +31,7 @@ import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenc
  */
 public class ServiceReferenceMinuteMetricRemoteWorker extends AbstractRemoteWorker<ServiceReferenceMetric, ServiceReferenceMetric> {
 
-    public ServiceReferenceMinuteMetricRemoteWorker(ModuleManager moduleManager) {
+    private ServiceReferenceMinuteMetricRemoteWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -40,7 +39,7 @@ public class ServiceReferenceMinuteMetricRemoteWorker extends AbstractRemoteWork
         return MetricWorkerIdDefine.SERVICE_REFERENCE_MINUTE_METRIC_REMOTE_WORKER_ID;
     }
 
-    @Override protected void onWork(ServiceReferenceMetric serviceReferenceMetric) throws WorkerException {
+    @Override protected void onWork(ServiceReferenceMetric serviceReferenceMetric) {
         onNext(serviceReferenceMetric);
     }
 
diff --git a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMonthMetricPersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMonthMetricPersistenceWorker.java
index 7135166..137f436 100644
--- a/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMonthMetricPersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-metric/metric-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/metric/provider/worker/service/refmetric/ServiceReferenceMonthMetricPersistenceWorker.java
@@ -21,18 +21,20 @@ package org.apache.skywalking.apm.collector.analysis.metric.provider.worker.serv
 import org.apache.skywalking.apm.collector.analysis.metric.define.graph.MetricWorkerIdDefine;
 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.core.annotations.trace.GraphComputingMetric;
 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;
 import org.apache.skywalking.apm.collector.storage.dao.srmp.IServiceReferenceMonthMetricPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetric;
+import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetricTable;
 
 /**
  * @author peng-yongsheng
  */
 public class ServiceReferenceMonthMetricPersistenceWorker extends PersistenceWorker<ServiceReferenceMetric> {
 
-    public ServiceReferenceMonthMetricPersistenceWorker(ModuleManager moduleManager) {
+    private ServiceReferenceMonthMetricPersistenceWorker(ModuleManager moduleManager) {
         super(moduleManager);
     }
 
@@ -64,4 +66,14 @@ public class ServiceReferenceMonthMetricPersistenceWorker extends PersistenceWor
             return 1024;
         }
     }
+
+    @GraphComputingMetric(name = "/persistence/onWork/" + ServiceReferenceMetricTable.TABLE + "/month")
+    @Override protected void onWork(ServiceReferenceMetric input) {
+        super.onWork(input);
+    }
+
+    @GraphComputingMetric(name = "/persistence/flushAndSwitch/" + ServiceReferenceMetricTable.TABLE + "/month")
+    @Override public void flushAndSwitch() {
+        super.flushAndSwitch();
+    }
 }
diff --git a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/parser/SegmentParse.java b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/parser/SegmentParse.java
index b8094cb..f251740 100644
--- a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/parser/SegmentParse.java
+++ b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/parser/SegmentParse.java
@@ -74,7 +74,7 @@ public class SegmentParse {
 
         try {
             List<UniqueId> traceIds = segment.getGlobalTraceIdsList();
-            TraceSegmentObject segmentObject = TraceSegmentObject.parseFrom(segment.getSegment());
+            TraceSegmentObject segmentObject = parseBinarySegment(segment);
 
             SegmentDecorator segmentDecorator = new SegmentDecorator(segmentObject);
 
@@ -97,6 +97,11 @@ public class SegmentParse {
         return false;
     }
 
+    @GraphComputingMetric(name = "/segment/parse/parseBinarySegment")
+    private TraceSegmentObject parseBinarySegment(UpstreamSegment segment) throws InvalidProtocolBufferException {
+        return TraceSegmentObject.parseFrom(segment.getSegment());
+    }
+
     @GraphComputingMetric(name = "/segment/parse/preBuild")
     private boolean preBuild(List<UniqueId> traceIds, SegmentDecorator segmentDecorator) {
         StringBuilder segmentIdBuilder = new StringBuilder();
diff --git a/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/base/LocalAsyncWorkerRef.java b/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/base/LocalAsyncWorkerRef.java
index 8d5e43c..7da4828 100644
--- a/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/base/LocalAsyncWorkerRef.java
+++ b/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/base/LocalAsyncWorkerRef.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.collector.analysis.worker.model.base;
 import java.util.Iterator;
 import java.util.List;
 import org.apache.skywalking.apm.collector.core.annotations.trace.BatchParameter;
-import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 import org.apache.skywalking.apm.collector.core.data.QueueData;
 import org.apache.skywalking.apm.collector.core.graph.NodeProcessor;
 import org.apache.skywalking.apm.collector.core.queue.EndOfBatchContext;
@@ -47,7 +46,6 @@ public class LocalAsyncWorkerRef<INPUT extends QueueData, OUTPUT extends QueueDa
         this.dataCarrier = dataCarrier;
     }
 
-    @GraphComputingMetric(name = "/worker/async/consume")
     @Override
     public void consume(@BatchParameter List<INPUT> data) {
         Iterator<INPUT> inputIterator = data.iterator();
diff --git a/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/impl/AggregationWorker.java b/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/impl/AggregationWorker.java
index 52fb6c4..e8c259c 100644
--- a/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/impl/AggregationWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/impl/AggregationWorker.java
@@ -46,7 +46,7 @@ public abstract class AggregationWorker<INPUT extends StreamData, OUTPUT extends
         return (OUTPUT)message;
     }
 
-    @Override protected final void onWork(INPUT message) throws WorkerException {
+    @Override protected void onWork(INPUT message) throws WorkerException {
         OUTPUT output = transform(message);
 
         messageNum++;
diff --git a/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/impl/PersistenceWorker.java b/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/impl/PersistenceWorker.java
index 4a8a486..ecb757a 100644
--- a/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/impl/PersistenceWorker.java
+++ b/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/model/impl/PersistenceWorker.java
@@ -22,8 +22,8 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import org.apache.skywalking.apm.collector.analysis.worker.model.base.AbstractLocalAsyncWorker;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.data.DataCache;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 import org.apache.skywalking.apm.collector.core.data.StreamData;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.core.util.ObjectUtils;
@@ -49,7 +49,7 @@ public abstract class PersistenceWorker<INPUT_AND_OUTPUT extends StreamData> ext
         this.batchDAO = moduleManager.find(StorageModule.NAME).getService(IBatchDAO.class);
     }
 
-    public final void flushAndSwitch() {
+    public void flushAndSwitch() {
         try {
             if (dataCache.trySwitchPointer()) {
                 dataCache.switchPointer();
@@ -59,7 +59,7 @@ public abstract class PersistenceWorker<INPUT_AND_OUTPUT extends StreamData> ext
         }
     }
 
-    @Override protected final void onWork(INPUT_AND_OUTPUT input) throws WorkerException {
+    @Override protected void onWork(INPUT_AND_OUTPUT input) {
         if (dataCache.currentCollectionSize() >= 5000) {
             try {
                 if (dataCache.trySwitchPointer()) {
@@ -75,7 +75,8 @@ public abstract class PersistenceWorker<INPUT_AND_OUTPUT extends StreamData> ext
         aggregate(input);
     }
 
-    public final List<?> buildBatchCollection() throws WorkerException {
+    @GraphComputingMetric(name = "/persistence/buildBatchCollection/")
+    public final List<?> buildBatchCollection() {
         List<?> batchCollection = new LinkedList<>();
         try {
             while (dataCache.getLast().isWriting()) {
diff --git a/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/timer/PersistenceTimer.java b/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/timer/PersistenceTimer.java
index dd7a342..94dc461 100644
--- a/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/timer/PersistenceTimer.java
+++ b/apm-collector/apm-collector-analysis/analysis-worker-model/src/main/java/org/apache/skywalking/apm/collector/analysis/worker/timer/PersistenceTimer.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
-import org.apache.skywalking.apm.collector.analysis.worker.model.base.WorkerException;
 import org.apache.skywalking.apm.collector.analysis.worker.model.impl.PersistenceWorker;
 import org.apache.skywalking.apm.collector.core.module.ModuleManager;
 import org.apache.skywalking.apm.collector.storage.StorageModule;
@@ -55,19 +54,16 @@ public class PersistenceTimer {
                 t -> logger.error("Extract data and save failure.", t)), 1, timeInterval, TimeUnit.SECONDS);
     }
 
+    @SuppressWarnings("unchecked")
     private void extractDataAndSave(IBatchDAO batchDAO, List<PersistenceWorker> persistenceWorkers) {
         try {
             List batchAllCollection = new ArrayList<>();
             persistenceWorkers.forEach((PersistenceWorker worker) -> {
                 logger.debug("extract {} worker data and save", worker.getClass().getName());
-                try {
-                    worker.flushAndSwitch();
-                    List<?> batchCollection = worker.buildBatchCollection();
-                    logger.debug("extract {} worker data size: {}", worker.getClass().getName(), batchCollection.size());
-                    batchAllCollection.addAll(batchCollection);
-                } catch (WorkerException e) {
-                    logger.error(e.getMessage(), e);
-                }
+                worker.flushAndSwitch();
+                List<?> batchCollection = worker.buildBatchCollection();
+                logger.debug("extract {} worker data size: {}", worker.getClass().getName(), batchCollection.size());
+                batchAllCollection.addAll(batchCollection);
             });
 
             batchDAO.batchPersistence(batchAllCollection);
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/CollectorInstrumentAgent.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/CollectorInstrumentAgent.java
index 53d1553..7b90547 100644
--- a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/CollectorInstrumentAgent.java
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/CollectorInstrumentAgent.java
@@ -41,12 +41,14 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
  * so I will keep all class loader issue out of concern,
  * in order to keep the trace and monitor codes as simple as possible.
  *
- * @author wu-sheng
+ * @author wu-sheng, peng-yongsheng
  */
 public class CollectorInstrumentAgent {
     private final static Logger logger = LoggerFactory.getLogger(CollectorInstrumentAgent.class);
 
     public static void premain(String agentArgs, Instrumentation instrumentation) {
+        logger.info("Collector performance instrument agent startup");
+
         new AgentBuilder.Default().type(
             declaresMethod(isAnnotationedMatch())
         ).transform((builder, typeDescription, classLoader, module) -> {
@@ -57,19 +59,16 @@ public class CollectorInstrumentAgent {
         }).with(new AgentBuilder.Listener() {
             @Override
             public void onDiscovery(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded) {
-
             }
 
             @Override
             public void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module,
                 boolean loaded, DynamicType dynamicType) {
-
             }
 
             @Override
             public void onIgnored(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module,
                 boolean loaded) {
-
             }
 
             @Override public void onError(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded,
@@ -79,7 +78,6 @@ public class CollectorInstrumentAgent {
 
             @Override
             public void onComplete(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded) {
-
             }
         }).installOn(instrumentation);
     }
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/MetricTree.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/MetricTree.java
index b0b5a77..7f03eab 100644
--- a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/MetricTree.java
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/MetricTree.java
@@ -24,26 +24,24 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import org.apache.skywalking.apm.collector.core.annotations.trace.BatchParameter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * @author wusheng
+ * @author wusheng, peng-yongsheng
  */
 public enum MetricTree implements Runnable {
     INSTANCE;
     private final Logger logger = LoggerFactory.getLogger(MetricTree.class);
 
-    private ScheduledFuture<?> scheduledFuture;
     private List<MetricNode> metrics = new LinkedList<>();
     private String lineSeparator = System.getProperty("line.separator");
 
     MetricTree() {
         ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
-        scheduledFuture = service.scheduleAtFixedRate(this, 60, 60, TimeUnit.SECONDS);
+        service.scheduleAtFixedRate(this, 60, 60, TimeUnit.SECONDS);
     }
 
     synchronized MetricNode lookup(String metricName) {
@@ -55,34 +53,26 @@ public enum MetricTree implements Runnable {
     @Override
     public void run() {
         try {
-            metrics.forEach((metric) -> {
-                metric.exchange();
-            });
-
-            try {
-                Thread.sleep(5 * 1000);
-            } catch (InterruptedException e) {
-
-            }
+            metrics.forEach(MetricNode::exchange);
 
             StringBuilder logBuffer = new StringBuilder();
             logBuffer.append(lineSeparator);
             logBuffer.append("##################################################################################################################").append(lineSeparator);
             logBuffer.append("#                                             Collector Service Report                                           #").append(lineSeparator);
             logBuffer.append("##################################################################################################################").append(lineSeparator);
-            metrics.forEach((metric) -> {
-                metric.toOutput(new ReportWriter() {
+            metrics.forEach((MetricNode metric) -> metric.toOutput(new ReportWriter() {
 
-                    @Override public void writeMetricName(String name) {
-                        logBuffer.append(name).append("").append(lineSeparator);
-                    }
+                @Override public void writeMetricName(String name) {
+                    logBuffer.append(name).append(lineSeparator);
+                }
 
-                    @Override public void writeMetric(String metrics) {
-                        logBuffer.append("\t");
-                        logBuffer.append(metrics).append("").append(lineSeparator);
-                    }
-                });
-            });
+                @Override public void writeMetric(String metrics) {
+                    logBuffer.append("\t");
+                    logBuffer.append(metrics).append(lineSeparator);
+                }
+            }));
+
+            metrics.forEach(MetricNode::clear);
 
             logger.warn(logBuffer.toString());
         } catch (Throwable e) {
@@ -91,54 +81,37 @@ public enum MetricTree implements Runnable {
     }
 
     class MetricNode {
-        private String metricName;
+        private final String metricName;
         private volatile ServiceMetric metric;
 
-        public MetricNode(String metricName) {
+        MetricNode(String metricName) {
             this.metricName = metricName;
         }
 
-        ServiceMetric getMetric(Method targetMethod, Object[] allArguments) {
+        ServiceMetric getMetric(Method targetMethod) {
             if (metric == null) {
-                synchronized (metricName) {
-                    if (metric == null) {
-                        int detectedBatchIndex = -1;
-                        String batchNodeNameSuffix = null;
-                        if (targetMethod != null) {
-                            Annotation[][] annotations = targetMethod.getParameterAnnotations();
-                            if (annotations != null) {
-                                int index = 0;
-                                for (Annotation[] parameterAnnotation : annotations) {
-                                    if (parameterAnnotation != null) {
-                                        for (Annotation annotation : parameterAnnotation) {
-                                            if (annotation instanceof BatchParameter) {
-                                                detectedBatchIndex = index;
-                                                break;
-                                            }
-                                        }
-                                    }
-                                    if (detectedBatchIndex > -1) {
+                int detectedBatchIndex = -1;
+                if (targetMethod != null) {
+                    Annotation[][] annotations = targetMethod.getParameterAnnotations();
+                    if (annotations != null) {
+                        int index = 0;
+                        for (Annotation[] parameterAnnotation : annotations) {
+                            if (parameterAnnotation != null) {
+                                for (Annotation annotation : parameterAnnotation) {
+                                    if (annotation instanceof BatchParameter) {
+                                        detectedBatchIndex = index;
                                         break;
                                     }
-                                    index++;
-                                }
-                                if (detectedBatchIndex > -1) {
-                                    Object listArgs = allArguments[index];
-
-                                    if (listArgs instanceof List) {
-                                        List args = (List)listArgs;
-                                        batchNodeNameSuffix = "/" + args.get(0).getClass().getSimpleName();
-                                        metricName += batchNodeNameSuffix;
-                                    }
                                 }
                             }
-                        }
-                        metric = new ServiceMetric(metricName, detectedBatchIndex);
-                        if (batchNodeNameSuffix != null) {
-                            this.metricName += batchNodeNameSuffix;
+                            if (detectedBatchIndex > -1) {
+                                break;
+                            }
+                            index++;
                         }
                     }
                 }
+                metric = new ServiceMetric(detectedBatchIndex);
             }
             return metric;
         }
@@ -149,12 +122,17 @@ public enum MetricTree implements Runnable {
             }
         }
 
+        void clear() {
+            if (metric != null) {
+                metric.clear();
+            }
+        }
+
         void toOutput(ReportWriter writer) {
             writer.writeMetricName(metricName);
             if (metric != null) {
                 metric.toOutput(writer);
             }
-
         }
     }
 }
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ReportWriter.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ReportWriter.java
index 38f36eb..303bccc 100644
--- a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ReportWriter.java
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ReportWriter.java
@@ -25,5 +25,4 @@ public interface ReportWriter {
     void writeMetricName(String name);
 
     void writeMetric(String metrics);
-
 }
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetric.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetric.java
index afd970a..671e7e8 100644
--- a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetric.java
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetric.java
@@ -19,43 +19,51 @@
 package org.apache.skywalking.apm.collector.instrument;
 
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
- * @author wusheng
+ * @author wusheng, peng-yongsheng
  */
 public class ServiceMetric {
-    private String metricName;
     private ServiceMetricRecord winA;
     private ServiceMetricRecord winB;
-    private volatile boolean isUsingWinA;
+    private AtomicBoolean isUsingWinA;
     private volatile int detectedBatchIndex;
 
-    ServiceMetric(String metricName, int detectedBatchIndex) {
-        this.metricName = metricName;
+    ServiceMetric(int detectedBatchIndex) {
         winA = detectedBatchIndex > -1 ? new ServiceMetricBatchRecord() : new ServiceMetricRecord();
         winB = detectedBatchIndex > -1 ? new ServiceMetricBatchRecord() : new ServiceMetricRecord();
-        isUsingWinA = true;
+        isUsingWinA = new AtomicBoolean(true);
         this.detectedBatchIndex = detectedBatchIndex;
     }
 
-    public void trace(long nano, boolean occurException, Object[] allArguments) {
-        ServiceMetricRecord usingRecord = isUsingWinA ? winA : winB;
+    void trace(long nanoseconds, boolean occurException, Object[] allArguments) {
+        ServiceMetricRecord usingRecord = isUsingWinA.get() ? winA : winB;
         if (detectedBatchIndex > -1) {
             List listArgs = (List)allArguments[detectedBatchIndex];
-            ((ServiceMetricBatchRecord)usingRecord).add(nano, occurException, listArgs == null ? 0 : listArgs.size());
+            ((ServiceMetricBatchRecord)usingRecord).add(nanoseconds, occurException, listArgs == null ? 0 : listArgs.size());
         } else {
-            usingRecord.add(nano, occurException);
+            usingRecord.add(nanoseconds, occurException);
         }
     }
 
     void exchangeWindows() {
-        isUsingWinA = !isUsingWinA;
+        isUsingWinA.set(!isUsingWinA.get());
     }
 
-    public void toOutput(ReportWriter writer) {
-        /**
+    void clear() {
+        if (isUsingWinA.get()) {
+            winB.clear();
+        } else {
+            winA.clear();
+        }
+    }
+
+    void toOutput(ReportWriter writer) {
+
+        /*
          * If using A, then B is available and free to output.
          */
-        writer.writeMetric(isUsingWinA ? winB.toString() : winA.toString());
+        writer.writeMetric(isUsingWinA.get() ? winB.toString() : winA.toString());
     }
 }
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricBatchRecord.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricBatchRecord.java
index a9a0cbd..cbe3f06 100644
--- a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricBatchRecord.java
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricBatchRecord.java
@@ -26,13 +26,13 @@ import java.util.concurrent.atomic.AtomicLong;
 public class ServiceMetricBatchRecord extends ServiceMetricRecord {
     private AtomicLong batchRowSize;
 
-    public ServiceMetricBatchRecord() {
+    ServiceMetricBatchRecord() {
         super();
         batchRowSize = new AtomicLong(0);
     }
 
-    void add(long nano, boolean occurException, int rowSize) {
-        super.add(nano, occurException);
+    void add(long nanoseconds, boolean occurException, int rowSize) {
+        super.add(nanoseconds, occurException);
         batchRowSize.addAndGet(rowSize);
     }
 
@@ -43,9 +43,9 @@ public class ServiceMetricBatchRecord extends ServiceMetricRecord {
 
     @Override
     public String toString() {
-        if (counter.longValue() == 0) {
+        if (getMetricRecordCount() == 0) {
             return "Avg=N/A";
         }
-        return super.toString() + " Rows per call = " + (batchRowSize.get() / counter.get());
+        return super.toString() + " Rows per call = " + (batchRowSize.get() / getMetricRecordCount());
     }
 }
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricRecord.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricRecord.java
index 31ade89..ca8bcb9 100644
--- a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricRecord.java
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricRecord.java
@@ -21,38 +21,42 @@ package org.apache.skywalking.apm.collector.instrument;
 import java.util.concurrent.atomic.AtomicLong;
 
 /**
- * @author wusheng
+ * @author wusheng, peng-yongsheng
  */
 public class ServiceMetricRecord {
-    private AtomicLong totalTimeNano;
-    protected AtomicLong counter;
+    private AtomicLong totalNanoseconds;
+    private AtomicLong counter;
     private AtomicLong errorCounter;
 
-    public ServiceMetricRecord() {
-        totalTimeNano = new AtomicLong(0);
+    ServiceMetricRecord() {
+        totalNanoseconds = new AtomicLong(0);
         counter = new AtomicLong(0);
         errorCounter = new AtomicLong(0);
     }
 
-    void add(long nano, boolean occurException) {
-        totalTimeNano.addAndGet(nano);
+    void add(long nanoseconds, boolean occurException) {
+        totalNanoseconds.addAndGet(nanoseconds);
         counter.incrementAndGet();
         if (occurException)
             errorCounter.incrementAndGet();
     }
 
     void clear() {
-        totalTimeNano.set(0);
+        totalNanoseconds.set(0);
         counter.set(0);
         errorCounter.set(0);
     }
 
+    long getMetricRecordCount() {
+        return counter.get();
+    }
+
     @Override public String toString() {
         if (counter.longValue() == 0) {
             return "Avg=N/A";
         }
-        return "Avg=" + (totalTimeNano.longValue() / counter.longValue()) + " (nano)" +
+        return "Avg=" + (totalNanoseconds.longValue() / counter.longValue()) + " (nanosecond)" +
             ", Success Rate=" + (counter.longValue() - errorCounter.longValue()) * 100 / counter.longValue() +
-            "%, Calls=" + counter.longValue();
+            "%, Calls=" + counter.longValue() + ", Total=" + totalNanoseconds.longValue() + " (nanosecond)";
     }
 }
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricTracing.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricTracing.java
index 9462961..29b6af9 100644
--- a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricTracing.java
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ServiceMetricTracing.java
@@ -34,7 +34,7 @@ import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputing
 public class ServiceMetricTracing {
     private volatile ConcurrentHashMap<Method, ServiceMetric> metrics = new ConcurrentHashMap<>();
 
-    public ServiceMetricTracing() {
+    ServiceMetricTracing() {
     }
 
     @RuntimeType
@@ -50,23 +50,23 @@ public class ServiceMetricTracing {
             String metricName = annotation.name();
             synchronized (inst) {
                 MetricTree.MetricNode metricNode = MetricTree.INSTANCE.lookup(metricName);
-                ServiceMetric serviceMetric = metricNode.getMetric(method, allArguments);
+                ServiceMetric serviceMetric = metricNode.getMetric(method);
                 metrics.put(method, serviceMetric);
                 metric = serviceMetric;
             }
         }
         boolean occurError = false;
-        long startNano = System.nanoTime();
-        long endNano;
+        long startNanosecond = System.nanoTime();
+        long endNanosecond;
         try {
             return zuper.call();
         } catch (Throwable t) {
             occurError = true;
             throw t;
         } finally {
-            endNano = System.nanoTime();
+            endNanosecond = System.nanoTime();
 
-            metric.trace(endNano - startNano, occurError, allArguments);
+            metric.trace(endNanosecond - startNanosecond, occurError, allArguments);
         }
     }
 }
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/Metric.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/Metric.java
new file mode 100644
index 0000000..297c823
--- /dev/null
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/Metric.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.collector.instrument.tools;
+
+/**
+ * @author peng-yongsheng
+ */
+public class Metric {
+
+    private String metricName;
+    private long avg;
+    private long rate;
+    private long calls;
+    private long total;
+
+    String getMetricName() {
+        return metricName;
+    }
+
+    void setMetricName(String metricName) {
+        this.metricName = metricName;
+    }
+
+    long getAvg() {
+        return avg;
+    }
+
+    void setAvg(long avg) {
+        this.avg = avg;
+    }
+
+    long getRate() {
+        return rate;
+    }
+
+    void setRate(long rate) {
+        this.rate = rate;
+    }
+
+    long getCalls() {
+        return calls;
+    }
+
+    void setCalls(long calls) {
+        this.calls = calls;
+    }
+
+    long getTotal() {
+        return total;
+    }
+
+    String getTotalWithUnit() {
+        return transport(total);
+    }
+
+    void setTotal(long total) {
+        this.total = total;
+    }
+
+    void merge(Metric metric) {
+        this.total = this.total + metric.getTotal();
+        this.calls = this.calls + metric.getCalls();
+        this.avg = this.total / this.calls;
+    }
+
+    private String transport(long nanoseconds) {
+        long ns2ms = 1000000;
+        long ns2s = ns2ms * 1000;
+        long ns2m = ns2s * 60;
+
+        if (ns2ms <= nanoseconds && nanoseconds < ns2s) {
+            return nanoseconds / ns2ms + "(ms)";
+        } else if (ns2s <= nanoseconds && nanoseconds < ns2m) {
+            return nanoseconds / ns2s + "(s)";
+        } else if (nanoseconds >= ns2m) {
+            return nanoseconds / ns2m + "(m)";
+        }
+        return nanoseconds + "(ns)";
+    }
+}
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/MetricReader.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/MetricReader.java
new file mode 100644
index 0000000..c37f2dd
--- /dev/null
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/MetricReader.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.collector.instrument.tools;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+
+/**
+ * @author peng-yongsheng
+ */
+class MetricReader {
+
+    private static final String AVG = "Avg";
+    private static final String SUCCESS_RATE = "Success Rate";
+    private static final String CALLS = "Calls";
+    private static final String TOTAL = "Total";
+
+    private final BufferedReader bufferedReader;
+
+    MetricReader(BufferedReader bufferedReader) {
+        this.bufferedReader = bufferedReader;
+    }
+
+    void read(Metric metric) throws IOException {
+        String line = bufferedReader.readLine();
+
+        String[] metrics = line.trim().split(",");
+        for (String metricStr : metrics) {
+            String[] keyValue = metricStr.split("=");
+
+            String key = keyValue[0].trim();
+            long value = getValue(keyValue[1]);
+            switch (key) {
+                case AVG:
+                    metric.setAvg(value);
+                    break;
+                case SUCCESS_RATE:
+                    metric.setRate(value);
+                    break;
+                case CALLS:
+                    metric.setCalls(value);
+                    break;
+                case TOTAL:
+                    metric.setTotal(value);
+            }
+        }
+    }
+
+    private long getValue(String valueStr) {
+        char[] chars = valueStr.toCharArray();
+        char[] value = new char[chars.length];
+
+        int index = 0;
+        for (char aChar : chars) {
+            if (Character.isDigit(aChar)) {
+                value[index] = aChar;
+                index++;
+            }
+        }
+
+        return Long.valueOf(String.valueOf(value).substring(0, index));
+    }
+}
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ReportWriter.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/Report.java
similarity index 66%
copy from apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ReportWriter.java
copy to apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/Report.java
index 38f36eb..bf4dcf4 100644
--- a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/ReportWriter.java
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/Report.java
@@ -16,14 +16,27 @@
  *
  */
 
-package org.apache.skywalking.apm.collector.instrument;
+package org.apache.skywalking.apm.collector.instrument.tools;
+
+import java.util.LinkedList;
+import java.util.List;
 
 /**
- * @author wusheng
+ * @author peng-yongsheng
  */
-public interface ReportWriter {
-    void writeMetricName(String name);
+public class Report {
+
+    private final List<Metric> metrics;
+
+    Report() {
+        this.metrics = new LinkedList<>();
+    }
 
-    void writeMetric(String metrics);
+    void addMetric(Metric metric) {
+        this.metrics.add(metric);
+    }
 
+    List<Metric> getMetrics() {
+        return metrics;
+    }
 }
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/ReportBufferReader.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/ReportBufferReader.java
new file mode 100644
index 0000000..c288c85
--- /dev/null
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/ReportBufferReader.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.collector.instrument.tools;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author peng-yongsheng
+ */
+class ReportBufferReader {
+
+    private final Logger logger = LoggerFactory.getLogger(ReportBufferReader.class);
+
+    Report read(BufferedReader bufferedReader) throws IOException {
+        Report report = new Report();
+
+        String line;
+        while ((line = bufferedReader.readLine()) != null) {
+            if (line.startsWith(":end")) {
+                break;
+            }
+
+            if (!line.startsWith("/") && !line.startsWith("\t")) {
+                continue;
+            }
+
+            Metric metric = new Metric();
+            metric.setMetricName(line);
+            new MetricReader(bufferedReader).read(metric);
+
+            logger.info("metric name: {}, avg: {}, rate: {}, calls: {}, total: {}",
+                metric.getMetricName(),
+                metric.getAvg(),
+                metric.getRate(),
+                metric.getCalls(),
+                metric.getTotal());
+
+            report.addMetric(metric);
+        }
+
+        return report;
+    }
+}
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/ReportFormatRunner.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/ReportFormatRunner.java
new file mode 100644
index 0000000..f368dd4
--- /dev/null
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/ReportFormatRunner.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.collector.instrument.tools;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author peng-yongsheng
+ */
+public class ReportFormatRunner {
+
+    private final Logger logger = LoggerFactory.getLogger(ReportFormatRunner.class);
+
+    public static void main(String[] args) {
+        ReportFormatRunner runner = new ReportFormatRunner();
+        Report report = runner.readString();
+
+        ReportFormatter formatter = new ReportFormatter();
+        formatter.format(report);
+    }
+
+    private Report readString() {
+        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
+        logger.info("Please input the report: ");
+
+        ReportBufferReader reader = new ReportBufferReader();
+        try {
+            Report report = reader.read(bufferedReader);
+            bufferedReader.close();
+            return report;
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+        }
+
+        return null;
+    }
+}
diff --git a/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/ReportFormatter.java b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/ReportFormatter.java
new file mode 100644
index 0000000..595b5f1
--- /dev/null
+++ b/apm-collector/apm-collector-instrument/src/main/java/org/apache/skywalking/apm/collector/instrument/tools/ReportFormatter.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.collector.instrument.tools;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author peng-yongsheng
+ */
+class ReportFormatter {
+
+    private final Logger logger = LoggerFactory.getLogger(ReportFormatter.class);
+
+    private Map<String, Metric> metricMap = new LinkedHashMap<>();
+
+    void format(Report report) {
+        logger.info(System.lineSeparator() + "Formatted report: ");
+
+        report.getMetrics().forEach(metric -> {
+            String[] subMetricNames = metric.getMetricName().split("/");
+
+            String metricName = "";
+            for (String subMetricName : subMetricNames) {
+                if (subMetricName != null && !subMetricName.equals("")) {
+                    metricName = metricName + "/" + subMetricName;
+
+                    if (!metricMap.containsKey(metricName)) {
+                        Metric newMetric = new Metric();
+                        newMetric.setMetricName(metricName);
+                        metricMap.put(metricName, newMetric);
+                    }
+                    metricMap.get(metricName).merge(metric);
+                }
+            }
+        });
+
+        logger.info("");
+
+        metricMap.values().forEach(metric ->
+            logger.info("metric name: {}, avg: {}, rate: {}, calls: {}, total: {}",
+                metric.getMetricName(),
+                metric.getAvg(),
+                metric.getRate(),
+                metric.getCalls(),
+                metric.getTotalWithUnit()));
+    }
+}
diff --git a/apm-collector/apm-collector-instrument/src/main/resources/log4j2.xml b/apm-collector/apm-collector-instrument/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..6ec10de
--- /dev/null
+++ b/apm-collector/apm-collector-instrument/src/main/resources/log4j2.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  -->
+
+<Configuration status="info">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout charset="UTF-8" pattern="%m%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/apm-collector/apm-collector-instrument/src/test/java/org/apache/skywalking/apm/collector/instrument/MetricTreePrintTestCase.java b/apm-collector/apm-collector-instrument/src/test/java/org/apache/skywalking/apm/collector/instrument/MetricTreePrintTestCase.java
new file mode 100644
index 0000000..9988ebf
--- /dev/null
+++ b/apm-collector/apm-collector-instrument/src/test/java/org/apache/skywalking/apm/collector/instrument/MetricTreePrintTestCase.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.collector.instrument;
+
+import java.util.ArrayList;
+import org.junit.Test;
+
+/**
+ * @author peng-yongsheng
+ */
+public class MetricTreePrintTestCase {
+
+    @Test
+    public void testPrint() {
+        ServiceMetric table1PersistenceDay = MetricTree.INSTANCE.lookup("/persistence/onWork/table_1/day").getMetric(null);
+        table1PersistenceDay.trace(1000, false, newArguments());
+
+        ServiceMetric table1PersistenceHour = MetricTree.INSTANCE.lookup("/persistence/onWork/table_1/hour").getMetric(null);
+        table1PersistenceHour.trace(2000, false, newArguments());
+
+        ServiceMetric table1Aggregate = MetricTree.INSTANCE.lookup("/aggregate/onWork/table_1").getMetric(null);
+        table1Aggregate.trace(3000, false, newArguments());
+
+        ServiceMetric table2Aggregate = MetricTree.INSTANCE.lookup("/aggregate/onWork/table_2").getMetric(null);
+        table2Aggregate.trace(4000, false, newArguments());
+
+        MetricTree.INSTANCE.run();
+    }
+
+    private Object[] newArguments() {
+        Object[] arguments = new Object[1];
+        arguments[0] = new ArrayList<>(100);
+        return arguments;
+    }
+}
diff --git a/apm-collector/apm-collector-instrument/src/test/resources/log4j2.xml b/apm-collector/apm-collector-instrument/src/test/resources/log4j2.xml
new file mode 100644
index 0000000..c9eec4f
--- /dev/null
+++ b/apm-collector/apm-collector-instrument/src/test/resources/log4j2.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  -->
+
+<Configuration status="info">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout charset="UTF-8" pattern="%d - %c -%-4r [%t] %-5p %x - %m%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/base/dao/AbstractPersistenceEsDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/base/dao/AbstractPersistenceEsDAO.java
index eb22185..9647b97 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/base/dao/AbstractPersistenceEsDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/base/dao/AbstractPersistenceEsDAO.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.apm.collector.storage.es.base.dao;
 
+import java.util.Map;
 import org.apache.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient;
 import org.apache.skywalking.apm.collector.core.data.StreamData;
 import org.apache.skywalking.apm.collector.core.util.TimeBucketUtils;
@@ -30,8 +31,6 @@ import org.elasticsearch.index.reindex.BulkByScrollResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Map;
-
 /**
  * @author peng-yongsheng
  */
@@ -48,7 +47,7 @@ public abstract class AbstractPersistenceEsDAO<STREAM_DATA extends StreamData> e
     protected abstract String tableName();
 
     @Override
-    public final STREAM_DATA get(String id) {
+    public STREAM_DATA get(String id) {
         GetResponse getResponse = getClient().prepareGet(tableName(), id).get();
         if (getResponse.isExists()) {
             STREAM_DATA streamData = esDataToStreamData(getResponse.getSource());
@@ -80,9 +79,9 @@ public abstract class AbstractPersistenceEsDAO<STREAM_DATA extends StreamData> e
         long startTimeBucket = TimeBucketUtils.INSTANCE.getMinuteTimeBucket(startTimestamp);
         long endTimeBucket = TimeBucketUtils.INSTANCE.getMinuteTimeBucket(endTimestamp);
         BulkByScrollResponse response = getClient().prepareDelete(
-                QueryBuilders.rangeQuery(timeBucketColumnNameForDelete()).gte(startTimeBucket).lte(endTimeBucket),
-                tableName())
-                .get();
+            QueryBuilders.rangeQuery(timeBucketColumnNameForDelete()).gte(startTimeBucket).lte(endTimeBucket),
+            tableName())
+            .get();
 
         long deleted = response.getDeleted();
         logger.info("Delete {} rows history from {} index.", deleted, tableName());
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/base/dao/BatchEsDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/base/dao/BatchEsDAO.java
index a006e75..ffcc77d 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/base/dao/BatchEsDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/base/dao/BatchEsDAO.java
@@ -20,6 +20,8 @@ package org.apache.skywalking.apm.collector.storage.es.base.dao;
 
 import java.util.List;
 import org.apache.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient;
+import org.apache.skywalking.apm.collector.core.annotations.trace.BatchParameter;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 import org.apache.skywalking.apm.collector.core.util.CollectionUtils;
 import org.apache.skywalking.apm.collector.storage.base.dao.IBatchDAO;
 import org.elasticsearch.action.bulk.BulkItemResponse;
@@ -41,7 +43,8 @@ public class BatchEsDAO extends EsDAO implements IBatchDAO {
         super(client);
     }
 
-    @Override public void batchPersistence(List<?> batchCollection) {
+    @GraphComputingMetric(name = "/persistence/batchPersistence/")
+    @Override public void batchPersistence(@BatchParameter List<?> batchCollection) {
         BulkRequestBuilder bulkRequest = getClient().prepareBulk();
 
         logger.debug("bulk data size: {}", batchCollection.size());
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/InstanceHeartBeatEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/InstanceHeartBeatEsPersistenceDAO.java
index c17ec3a..5aaf8c2 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/InstanceHeartBeatEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/InstanceHeartBeatEsPersistenceDAO.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
 import java.util.Map;
 import org.apache.skywalking.apm.collector.client.elasticsearch.ElasticSearchClient;
 import org.apache.skywalking.apm.collector.core.UnexpectedException;
+import org.apache.skywalking.apm.collector.core.annotations.trace.GraphComputingMetric;
 import org.apache.skywalking.apm.collector.storage.dao.IInstanceHeartBeatPersistenceDAO;
 import org.apache.skywalking.apm.collector.storage.es.base.dao.EsDAO;
 import org.apache.skywalking.apm.collector.storage.table.register.Instance;
@@ -43,6 +44,7 @@ public class InstanceHeartBeatEsPersistenceDAO extends EsDAO implements IInstanc
         super(client);
     }
 
+    @GraphComputingMetric(name = "/persistence/get/" + InstanceTable.TABLE + "/heartbeat")
     @Override public Instance get(String id) {
         GetResponse getResponse = getClient().prepareGet(InstanceTable.TABLE, id).get();
         if (getResponse.isExists()) {
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/acp/AbstractApplicationComponentEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/acp/AbstractApplicationComponentEsPersistenceDAO.java
index 1842447..e15e0fc 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/acp/AbstractApplicationComponentEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/acp/AbstractApplicationComponentEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.acp;
 import java.util.HashMap;
 import java.util.Map;
 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.application.ApplicationComponent;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponentTable;
@@ -58,4 +59,9 @@ public abstract class AbstractApplicationComponentEsPersistenceDAO extends Abstr
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + ApplicationComponentTable.TABLE)
+    @Override public final ApplicationComponent get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/acp/ApplicationComponentDayEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/acp/ApplicationComponentDayEsPersistenceDAO.java
index 1f1b7ca..487e4fb 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/acp/ApplicationComponentDayEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/acp/ApplicationComponentDayEsPersistenceDAO.java
@@ -26,16 +26,12 @@ import org.apache.skywalking.apm.collector.storage.table.application.Application
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationComponentTable;
 import org.elasticsearch.action.index.IndexRequestBuilder;
 import org.elasticsearch.action.update.UpdateRequestBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * @author peng-yongsheng
  */
 public class ApplicationComponentDayEsPersistenceDAO extends AbstractApplicationComponentEsPersistenceDAO implements IApplicationComponentDayPersistenceDAO<IndexRequestBuilder, UpdateRequestBuilder, ApplicationComponent> {
 
-    private final Logger logger = LoggerFactory.getLogger(ApplicationComponentDayEsPersistenceDAO.class);
-
     public ApplicationComponentDayEsPersistenceDAO(ElasticSearchClient client) {
         super(client);
     }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/amp/AbstractApplicationMetricEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/amp/AbstractApplicationMetricEsPersistenceDAO.java
index 8a74deb..388f6da 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/amp/AbstractApplicationMetricEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/amp/AbstractApplicationMetricEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.amp;
 import java.util.HashMap;
 import java.util.Map;
 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.application.ApplicationMetric;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMetricTable;
@@ -103,4 +104,9 @@ public abstract class AbstractApplicationMetricEsPersistenceDAO extends Abstract
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + ApplicationMetricTable.TABLE)
+    @Override public final ApplicationMetric get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ampp/AbstractApplicationMappingEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ampp/AbstractApplicationMappingEsPersistenceDAO.java
index 080b0f5..53604d3 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ampp/AbstractApplicationMappingEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/ampp/AbstractApplicationMappingEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.ampp;
 import java.util.HashMap;
 import java.util.Map;
 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.application.ApplicationMapping;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationMappingTable;
@@ -58,4 +59,9 @@ public abstract class AbstractApplicationMappingEsPersistenceDAO extends Abstrac
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + ApplicationMappingTable.TABLE)
+    @Override public final ApplicationMapping get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/armp/AbstractApplicationReferenceMetricEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/armp/AbstractApplicationReferenceMetricEsPersistenceDAO.java
index 4b5bd28..714f6ef 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/armp/AbstractApplicationReferenceMetricEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/armp/AbstractApplicationReferenceMetricEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.armp;
 import java.util.HashMap;
 import java.util.Map;
 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.application.ApplicationReferenceMetric;
 import org.apache.skywalking.apm.collector.storage.table.application.ApplicationReferenceMetricTable;
@@ -106,4 +107,9 @@ public abstract class AbstractApplicationReferenceMetricEsPersistenceDAO extends
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + ApplicationReferenceMetricTable.TABLE)
+    @Override public final ApplicationReferenceMetric get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/cpu/AbstractCpuMetricEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/cpu/AbstractCpuMetricEsPersistenceDAO.java
index 9f191f3..420edea 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/cpu/AbstractCpuMetricEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/cpu/AbstractCpuMetricEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.cpu;
 import java.util.HashMap;
 import java.util.Map;
 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.CpuMetric;
 import org.apache.skywalking.apm.collector.storage.table.jvm.CpuMetricTable;
@@ -62,4 +63,9 @@ public abstract class AbstractCpuMetricEsPersistenceDAO extends AbstractPersiste
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + CpuMetricTable.TABLE)
+    @Override public final CpuMetric get(String id) {
+        return super.get(id);
+    }
 }
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 e6f1159..53c6152 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
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.gc;
 import java.util.HashMap;
 import java.util.Map;
 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;
@@ -65,4 +66,9 @@ public abstract class AbstractGCMetricEsPersistenceDAO extends AbstractPersisten
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + GCMetricTable.TABLE)
+    @Override public final GCMetric get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/imp/AbstractInstanceMetricEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/imp/AbstractInstanceMetricEsPersistenceDAO.java
index 811740b..f85c3be 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/imp/AbstractInstanceMetricEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/imp/AbstractInstanceMetricEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.imp;
 import java.util.HashMap;
 import java.util.Map;
 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.instance.InstanceMetric;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMetricTable;
@@ -71,9 +72,6 @@ public abstract class AbstractInstanceMetricEsPersistenceDAO extends AbstractPer
     @Override protected final Map<String, Object> esStreamDataToEsData(InstanceMetric streamData) {
         Map<String, Object> source = new HashMap<>();
         source.put(InstanceMetricTable.COLUMN_METRIC_ID, streamData.getMetricId());
-
-        source.put(InstanceMetricTable.COLUMN_METRIC_ID, streamData.getMetricId());
-
         source.put(InstanceMetricTable.COLUMN_APPLICATION_ID, streamData.getApplicationId());
         source.put(InstanceMetricTable.COLUMN_INSTANCE_ID, streamData.getInstanceId());
         source.put(InstanceMetricTable.COLUMN_SOURCE_VALUE, streamData.getSourceValue());
@@ -100,4 +98,9 @@ public abstract class AbstractInstanceMetricEsPersistenceDAO extends AbstractPer
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + InstanceMetricTable.TABLE)
+    @Override public final InstanceMetric get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/impp/AbstractInstanceMappingEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/impp/AbstractInstanceMappingEsPersistenceDAO.java
index d35baec..8a47fa6 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/impp/AbstractInstanceMappingEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/impp/AbstractInstanceMappingEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.impp;
 import java.util.HashMap;
 import java.util.Map;
 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.instance.InstanceMapping;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceMappingTable;
@@ -60,4 +61,9 @@ public abstract class AbstractInstanceMappingEsPersistenceDAO extends AbstractPe
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + InstanceMappingTable.TABLE)
+    @Override public final InstanceMapping get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/irmp/AbstractInstanceReferenceMetricEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/irmp/AbstractInstanceReferenceMetricEsPersistenceDAO.java
index ea6a3ed..f30e096 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/irmp/AbstractInstanceReferenceMetricEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/irmp/AbstractInstanceReferenceMetricEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.irmp;
 import java.util.HashMap;
 import java.util.Map;
 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.instance.InstanceReferenceMetric;
 import org.apache.skywalking.apm.collector.storage.table.instance.InstanceReferenceMetricTable;
@@ -102,4 +103,9 @@ public abstract class AbstractInstanceReferenceMetricEsPersistenceDAO extends Ab
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + InstanceReferenceMetricTable.TABLE)
+    @Override public final InstanceReferenceMetric get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/memory/AbstractMemoryMetricEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/memory/AbstractMemoryMetricEsPersistenceDAO.java
index 298200e..406dbff 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/memory/AbstractMemoryMetricEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/memory/AbstractMemoryMetricEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.memory;
 import java.util.HashMap;
 import java.util.Map;
 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.MemoryMetric;
 import org.apache.skywalking.apm.collector.storage.table.jvm.MemoryMetricTable;
@@ -70,4 +71,9 @@ public abstract class AbstractMemoryMetricEsPersistenceDAO extends AbstractPersi
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + MemoryMetricTable.TABLE)
+    @Override public final MemoryMetric get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/mpool/AbstractMemoryPoolMetricEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/mpool/AbstractMemoryPoolMetricEsPersistenceDAO.java
index 4741f2e..98b8ab1 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/mpool/AbstractMemoryPoolMetricEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/mpool/AbstractMemoryPoolMetricEsPersistenceDAO.java
@@ -18,14 +18,14 @@
 
 package org.apache.skywalking.apm.collector.storage.es.dao.mpool;
 
+import java.util.HashMap;
+import java.util.Map;
 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.MemoryPoolMetric;
 import org.apache.skywalking.apm.collector.storage.table.jvm.MemoryPoolMetricTable;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * @author peng-yongsheng
  */
@@ -43,18 +43,18 @@ public abstract class AbstractMemoryPoolMetricEsPersistenceDAO extends AbstractP
     @Override
     protected final MemoryPoolMetric esDataToStreamData(Map<String, Object> source) {
         MemoryPoolMetric memoryPoolMetric = new MemoryPoolMetric();
-        memoryPoolMetric.setMetricId((String) source.get(MemoryPoolMetricTable.COLUMN_METRIC_ID));
+        memoryPoolMetric.setMetricId((String)source.get(MemoryPoolMetricTable.COLUMN_METRIC_ID));
 
-        memoryPoolMetric.setInstanceId(((Number) source.get(MemoryPoolMetricTable.COLUMN_INSTANCE_ID)).intValue());
-        memoryPoolMetric.setPoolType(((Number) source.get(MemoryPoolMetricTable.COLUMN_POOL_TYPE)).intValue());
+        memoryPoolMetric.setInstanceId(((Number)source.get(MemoryPoolMetricTable.COLUMN_INSTANCE_ID)).intValue());
+        memoryPoolMetric.setPoolType(((Number)source.get(MemoryPoolMetricTable.COLUMN_POOL_TYPE)).intValue());
 
-        memoryPoolMetric.setInit(((Number) source.get(MemoryPoolMetricTable.COLUMN_INIT)).longValue());
-        memoryPoolMetric.setMax(((Number) source.get(MemoryPoolMetricTable.COLUMN_MAX)).longValue());
-        memoryPoolMetric.setUsed(((Number) source.get(MemoryPoolMetricTable.COLUMN_USED)).longValue());
-        memoryPoolMetric.setCommitted(((Number) source.get(MemoryPoolMetricTable.COLUMN_COMMITTED)).longValue());
-        memoryPoolMetric.setTimes(((Number) source.get(MemoryPoolMetricTable.COLUMN_TIMES)).longValue());
+        memoryPoolMetric.setInit(((Number)source.get(MemoryPoolMetricTable.COLUMN_INIT)).longValue());
+        memoryPoolMetric.setMax(((Number)source.get(MemoryPoolMetricTable.COLUMN_MAX)).longValue());
+        memoryPoolMetric.setUsed(((Number)source.get(MemoryPoolMetricTable.COLUMN_USED)).longValue());
+        memoryPoolMetric.setCommitted(((Number)source.get(MemoryPoolMetricTable.COLUMN_COMMITTED)).longValue());
+        memoryPoolMetric.setTimes(((Number)source.get(MemoryPoolMetricTable.COLUMN_TIMES)).longValue());
 
-        memoryPoolMetric.setTimeBucket(((Number) source.get(MemoryPoolMetricTable.COLUMN_TIME_BUCKET)).longValue());
+        memoryPoolMetric.setTimeBucket(((Number)source.get(MemoryPoolMetricTable.COLUMN_TIME_BUCKET)).longValue());
         return memoryPoolMetric;
     }
 
@@ -74,4 +74,9 @@ public abstract class AbstractMemoryPoolMetricEsPersistenceDAO extends AbstractP
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + MemoryPoolMetricTable.TABLE)
+    @Override public final MemoryPoolMetric get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/smp/AbstractServiceMetricEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/smp/AbstractServiceMetricEsPersistenceDAO.java
index 4aa3841..52a2f0e 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/smp/AbstractServiceMetricEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/smp/AbstractServiceMetricEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.smp;
 import java.util.HashMap;
 import java.util.Map;
 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.service.ServiceMetric;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceMetricTable;
@@ -100,4 +101,9 @@ public abstract class AbstractServiceMetricEsPersistenceDAO extends AbstractPers
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + ServiceMetricTable.TABLE)
+    @Override public final ServiceMetric get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/srmp/AbstractServiceReferenceMetricEsPersistenceDAO.java b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/srmp/AbstractServiceReferenceMetricEsPersistenceDAO.java
index b495315..6753ac8 100644
--- a/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/srmp/AbstractServiceReferenceMetricEsPersistenceDAO.java
+++ b/apm-collector/apm-collector-storage/collector-storage-es-provider/src/main/java/org/apache/skywalking/apm/collector/storage/es/dao/srmp/AbstractServiceReferenceMetricEsPersistenceDAO.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.collector.storage.es.dao.srmp;
 import java.util.HashMap;
 import java.util.Map;
 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.service.ServiceReferenceMetric;
 import org.apache.skywalking.apm.collector.storage.table.service.ServiceReferenceMetricTable;
@@ -106,4 +107,9 @@ public abstract class AbstractServiceReferenceMetricEsPersistenceDAO extends Abs
 
         return source;
     }
+
+    @GraphComputingMetric(name = "/persistence/get/" + ServiceReferenceMetricTable.TABLE)
+    @Override public final ServiceReferenceMetric get(String id) {
+        return super.get(id);
+    }
 }
diff --git a/apm-collector/pom.xml b/apm-collector/pom.xml
index b696c5f..21d581a 100644
--- a/apm-collector/pom.xml
+++ b/apm-collector/pom.xml
@@ -30,6 +30,7 @@
 
     <packaging>pom</packaging>
     <modules>
+        <module>apm-collector-instrument</module>
         <module>apm-collector-boot</module>
         <module>apm-collector-ui</module>
         <module>apm-collector-core</module>
@@ -41,7 +42,6 @@
         <module>apm-collector-grpc-manager</module>
         <module>apm-collector-jetty-manager</module>
         <module>apm-collector-remote</module>
-        <module>apm-collector-instrument</module>
         <module>apm-collector-configuration</module>
         <module>apm-collector-agent</module>
         <module>apm-collector-analysis</module>

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