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

[incubator-servicecomb-java-chassis] 04/05: [SCB-950] change the metrics details output structure

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit 29fff4e905f168b3c57ff90c890983826af8154a
Author: heyile <he...@huawei.com>
AuthorDate: Mon Oct 8 16:20:29 2018 +0800

    [SCB-950] change the metrics details output structure
---
 .../metrics/core/publish/DefaultLogPublisher.java  | 222 +++++++++++++++++----
 .../statistics/MeterDetailStatisticsModel.java     | 204 -------------------
 .../publish/statistics/MeterStatisticsManager.java |  36 ----
 .../statistics/MeterStatisticsMeterType.java       |   7 -
 .../core/publish/TestDefaultLogPublisher.java      |   8 +-
 5 files changed, 184 insertions(+), 293 deletions(-)

diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
index d942b56..e9575fc 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
@@ -16,7 +16,6 @@
  */
 package org.apache.servicecomb.metrics.core.publish;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -32,9 +31,6 @@ import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPer
 import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroup;
 import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroups;
 import org.apache.servicecomb.metrics.core.publish.model.invocation.PerfInfo;
-import org.apache.servicecomb.metrics.core.publish.statistics.MeterDetailStatisticsModel;
-import org.apache.servicecomb.metrics.core.publish.statistics.MeterStatisticsManager;
-import org.apache.servicecomb.metrics.core.publish.statistics.MeterStatisticsMeterType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,6 +47,7 @@ public class DefaultLogPublisher implements MetricsInitializer {
 
   public static final String ENABLED = "servicecomb.metrics.publisher.defaultLog.enabled";
 
+  //sample
   private static final String SIMPLE_HEADER = "%s:\n  simple:\n"
       + "    status          tps           latency                                    operation\n";
 
@@ -58,6 +55,21 @@ public class DefaultLogPublisher implements MetricsInitializer {
 
   private static final String SIMPLE_FORMAT = "                    %-13s %-42s %s\n";
 
+  //details
+  private static final String PRODUCER_DETAILS_FORMAT =
+      "        prepare: %-22s queue       : %-22s filtersReq : %-22s handlersReq: %s\n"
+          + "        execute: %-22s handlersResp: %-22s filtersResp: %-22s sendResp   : %s\n";
+
+  private static final String CONSUMER_DETAILS_FORMAT =
+      "        prepare          : %-22s handlersReq : %-22s clientFiltersReq: %-22s sendReq     : %s\n"
+          + "        getConnect       : %-22s writeBuf    : %-22s waitResp        : %-22s wakeConsumer: %s\n"
+          + "        clientFiltersResp: %-22s handlersResp: %s\n";
+
+  private static final String EDGE_DETAILS_FORMAT =
+      "        prepare          : %-22s queue       : %-22s serverFiltersReq : %-22s handlersReq : %s\n"
+          + "        clientFiltersReq : %-22s sendReq     : %-22s getConnect       : %-22s writeBuf    : %s\n"
+          + "        waitResp         : %-22s wakeConsumer: %-22s clientFiltersResp: %-22s handlersResp: %s\n"
+          + "        serverFiltersResp: %-22s sendResp    : %s\n";
 
   @Override
   public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) {
@@ -125,23 +137,20 @@ public class DefaultLogPublisher implements MetricsInitializer {
       return;
     }
     sb.append(String.format(SIMPLE_HEADER, "edge"));
-    Map<String, MeterDetailStatisticsModel> statisticsModelMap = new HashMap<>();
 
-    StringBuilder sampleBuilder = new StringBuilder();
+    StringBuilder detailsBuilder = new StringBuilder();
     //print sample
     for (Map<String, OperationPerfGroup> statusMap : edgePerf.getGroups().values()) {
       for (OperationPerfGroup perfGroup : statusMap.values()) {
         //append sample
-        sampleBuilder.append(printSamplePerf(perfGroup));
-        //load details
-        MeterStatisticsManager
-            .loadMeterDetailStatisticsModelFromPerfGroup(perfGroup, MeterStatisticsMeterType.EDGE, statisticsModelMap);
+        sb.append(printSamplePerf(perfGroup));
+        //append details
+        detailsBuilder.append(printEdgeDetailsPerf(perfGroup));
       }
     }
-    sb.append(sampleBuilder)
-        .append("  details:\n");
-    statisticsModelMap.values()
-        .forEach(details -> sb.append(details.getFormatDetails()));
+
+    sb.append("  details:\n")
+        .append(detailsBuilder);
   }
 
 
@@ -152,24 +161,19 @@ public class DefaultLogPublisher implements MetricsInitializer {
     }
 
     sb.append(String.format(SIMPLE_HEADER, "consumer"));
-    Map<String, MeterDetailStatisticsModel> statisticsModelMap = new HashMap<>();
 
-    StringBuilder sampleBuilder = new StringBuilder();
+    StringBuilder detailsBuilder = new StringBuilder();
     //print sample
     for (Map<String, OperationPerfGroup> statusMap : consumerPerf.getGroups().values()) {
       for (OperationPerfGroup perfGroup : statusMap.values()) {
         //append sample
-        sampleBuilder.append(printSamplePerf(perfGroup));
-        //load details
-        MeterStatisticsManager
-            .loadMeterDetailStatisticsModelFromPerfGroup(perfGroup, MeterStatisticsMeterType.CONSUMER,
-                statisticsModelMap);
+        sb.append(printSamplePerf(perfGroup));
+        //append details
+        detailsBuilder.append(printConsumerDetailsPerf(perfGroup));
       }
     }
-    sb.append(sampleBuilder)
-        .append("  details:\n");
-    statisticsModelMap.values()
-        .forEach(details -> sb.append(details.getFormatDetails()));
+    sb.append("  details:\n")
+        .append(detailsBuilder);
   }
 
 
@@ -180,24 +184,20 @@ public class DefaultLogPublisher implements MetricsInitializer {
       return;
     }
     sb.append(String.format(SIMPLE_HEADER, "producer"));
-    Map<String, MeterDetailStatisticsModel> statisticsModelMap = new HashMap<>();
-
-    StringBuilder sampleBuilder = new StringBuilder();
+    // use detailsBuilder, we can traverse the map only once
+    StringBuilder detailsBuilder = new StringBuilder();
     //print sample
     for (Map<String, OperationPerfGroup> statusMap : producerPerf.getGroups().values()) {
       for (OperationPerfGroup perfGroup : statusMap.values()) {
         //append sample
-        sampleBuilder.append(printSamplePerf(perfGroup));
-        //load details
-        MeterStatisticsManager
-            .loadMeterDetailStatisticsModelFromPerfGroup(perfGroup, MeterStatisticsMeterType.PRODUCER,
-                statisticsModelMap);
+        sb.append(printSamplePerf(perfGroup));
+        //append details
+        detailsBuilder.append(printProducerDetailsPerf(perfGroup));
       }
     }
     //print details
-    sb.append(sampleBuilder)
-        .append("  details:\n");
-    statisticsModelMap.values().forEach(details -> sb.append(details.getFormatDetails()));
+    sb.append("  details:\n")
+        .append(detailsBuilder);
   }
 
 
@@ -210,23 +210,153 @@ public class DefaultLogPublisher implements MetricsInitializer {
         // first line
         String status = perfGroup.getTransport() + "." + perfGroup.getStatus();
         sb.append(String.format(FIRST_LINE_SIMPLE_FORMAT, status, stageTotal.getTps(),
-            MeterStatisticsManager.getDetailsFromPerf(stageTotal),
-            operationPerf.getOperation()));
+            getDetailsFromPerf(stageTotal), operationPerf.getOperation()));
       } else {
         sb.append(String
-            .format(SIMPLE_FORMAT, stageTotal.getTps(), MeterStatisticsManager.getDetailsFromPerf(stageTotal),
-                operationPerf.getOperation()));
+            .format(SIMPLE_FORMAT, stageTotal.getTps(), getDetailsFromPerf(stageTotal), operationPerf.getOperation()));
       }
     }
     //print summary
     OperationPerf summaryOperation = perfGroup.getSummary();
     PerfInfo stageSummaryTotal = summaryOperation.findStage(MeterInvocationConst.STAGE_TOTAL);
     sb.append(
-        String.format(SIMPLE_FORMAT, stageSummaryTotal.getTps(),
-            MeterStatisticsManager.getDetailsFromPerf(stageSummaryTotal), "(summary)"));
+        String.format(SIMPLE_FORMAT, stageSummaryTotal.getTps(), getDetailsFromPerf(stageSummaryTotal), "(summary)"));
+    return sb;
+  }
+
+  private StringBuilder printProducerDetailsPerf(OperationPerfGroup perfGroup) {
+    StringBuilder sb = new StringBuilder();
+    //append rest.200:
+    sb.append("    ")
+        .append(perfGroup.getTransport())
+        .append(".")
+        .append(perfGroup.getStatus())
+        .append(":\n");
+    PerfInfo prepare, queue, filtersReq, handlersReq, execute, handlersResp, filtersResp, sendResp;
+    for (OperationPerf operationPerf : perfGroup.getOperationPerfs()) {
+
+      prepare = operationPerf.findStage(MeterInvocationConst.STAGE_PREPARE);
+      queue = operationPerf.findStage(MeterInvocationConst.STAGE_EXECUTOR_QUEUE);
+      filtersReq = operationPerf.findStage(MeterInvocationConst.STAGE_SERVER_FILTERS_REQUEST);
+      handlersReq = operationPerf.findStage(MeterInvocationConst.STAGE_HANDLERS_REQUEST);
+      execute = operationPerf.findStage(MeterInvocationConst.STAGE_EXECUTION);
+      handlersResp = operationPerf.findStage(MeterInvocationConst.STAGE_HANDLERS_RESPONSE);
+      filtersResp = operationPerf.findStage(MeterInvocationConst.STAGE_SERVER_FILTERS_RESPONSE);
+      sendResp = operationPerf.findStage(MeterInvocationConst.STAGE_PRODUCER_SEND_RESPONSE);
+
+      sb.append("      ")
+          .append(operationPerf.getOperation())
+          .append(":\n")
+          .append(String.format(PRODUCER_DETAILS_FORMAT,
+              getDetailsFromPerf(prepare),
+              getDetailsFromPerf(queue),
+              getDetailsFromPerf(filtersReq),
+              getDetailsFromPerf(handlersReq),
+              getDetailsFromPerf(execute),
+              getDetailsFromPerf(handlersResp),
+              getDetailsFromPerf(filtersResp),
+              getDetailsFromPerf(sendResp)
+          ));
+    }
+
+    return sb;
+  }
+
+  private StringBuilder printConsumerDetailsPerf(OperationPerfGroup perfGroup) {
+    StringBuilder sb = new StringBuilder();
+    //append rest.200:
+    sb.append("    ")
+        .append(perfGroup.getTransport())
+        .append(".")
+        .append(perfGroup.getStatus())
+        .append(":\n");
+
+    PerfInfo prepare, handlersReq, clientFiltersReq, sendReq, getConnect, writeBuf,
+        waitResp, wakeConsumer, clientFiltersResp, handlersResp;
+    for (OperationPerf operationPerf : perfGroup.getOperationPerfs()) {
+
+      prepare = operationPerf.findStage(MeterInvocationConst.STAGE_PREPARE);
+      handlersReq = operationPerf.findStage(MeterInvocationConst.STAGE_HANDLERS_REQUEST);
+      clientFiltersReq = operationPerf.findStage(MeterInvocationConst.STAGE_CLIENT_FILTERS_REQUEST);
+      sendReq = operationPerf.findStage(MeterInvocationConst.STAGE_CONSUMER_SEND_REQUEST);
+      getConnect = operationPerf.findStage(MeterInvocationConst.STAGE_CONSUMER_GET_CONNECTION);
+      writeBuf = operationPerf.findStage(MeterInvocationConst.STAGE_CONSUMER_WRITE_TO_BUF);
+      waitResp = operationPerf.findStage(MeterInvocationConst.STAGE_CONSUMER_WAIT_RESPONSE);
+      wakeConsumer = operationPerf.findStage(MeterInvocationConst.STAGE_CONSUMER_WAKE_CONSUMER);
+      clientFiltersResp = operationPerf.findStage(MeterInvocationConst.STAGE_CLIENT_FILTERS_RESPONSE);
+      handlersResp = operationPerf.findStage(MeterInvocationConst.STAGE_HANDLERS_RESPONSE);
+
+      sb.append("      ")
+          .append(operationPerf.getOperation())
+          .append(":\n")
+          .append(String.format(CONSUMER_DETAILS_FORMAT,
+              getDetailsFromPerf(prepare),
+              getDetailsFromPerf(handlersReq),
+              getDetailsFromPerf(clientFiltersReq),
+              getDetailsFromPerf(sendReq),
+              getDetailsFromPerf(getConnect),
+              getDetailsFromPerf(writeBuf),
+              getDetailsFromPerf(waitResp),
+              getDetailsFromPerf(wakeConsumer),
+              getDetailsFromPerf(clientFiltersResp),
+              getDetailsFromPerf(handlersResp)
+          ));
+    }
+
     return sb;
   }
 
+  private StringBuilder printEdgeDetailsPerf(OperationPerfGroup perfGroup) {
+    StringBuilder sb = new StringBuilder();
+    //append rest.200:
+    sb.append("    ")
+        .append(perfGroup.getTransport())
+        .append(".")
+        .append(perfGroup.getStatus())
+        .append(":\n");
+
+    PerfInfo prepare, queue, serverFiltersReq, handlersReq, clientFiltersReq, sendReq, getConnect, writeBuf,
+        waitResp, wakeConsumer, clientFiltersResp, handlersResp, serverFiltersResp, sendResp;
+    for (OperationPerf operationPerf : perfGroup.getOperationPerfs()) {
+
+      prepare = operationPerf.findStage(MeterInvocationConst.STAGE_PREPARE);
+      queue = operationPerf.findStage(MeterInvocationConst.STAGE_EXECUTOR_QUEUE);
+      serverFiltersReq = operationPerf.findStage(MeterInvocationConst.STAGE_SERVER_FILTERS_REQUEST);
+      handlersReq = operationPerf.findStage(MeterInvocationConst.STAGE_HANDLERS_REQUEST);
+      clientFiltersReq = operationPerf.findStage(MeterInvocationConst.STAGE_CLIENT_FILTERS_REQUEST);
+      sendReq = operationPerf.findStage(MeterInvocationConst.STAGE_CONSUMER_SEND_REQUEST);
+      getConnect = operationPerf.findStage(MeterInvocationConst.STAGE_CONSUMER_GET_CONNECTION);
+      writeBuf = operationPerf.findStage(MeterInvocationConst.STAGE_CONSUMER_WRITE_TO_BUF);
+      waitResp = operationPerf.findStage(MeterInvocationConst.STAGE_CONSUMER_WAIT_RESPONSE);
+      wakeConsumer = operationPerf.findStage(MeterInvocationConst.STAGE_CONSUMER_WAKE_CONSUMER);
+      clientFiltersResp = operationPerf.findStage(MeterInvocationConst.STAGE_CLIENT_FILTERS_RESPONSE);
+      handlersResp = operationPerf.findStage(MeterInvocationConst.STAGE_HANDLERS_RESPONSE);
+      serverFiltersResp = operationPerf.findStage(MeterInvocationConst.STAGE_SERVER_FILTERS_RESPONSE);
+      sendResp = operationPerf.findStage(MeterInvocationConst.STAGE_PRODUCER_SEND_RESPONSE);
+
+      sb.append("      ")
+          .append(operationPerf.getOperation())
+          .append(":\n")
+          .append(String.format(EDGE_DETAILS_FORMAT,
+              getDetailsFromPerf(prepare),
+              getDetailsFromPerf(queue),
+              getDetailsFromPerf(serverFiltersReq),
+              getDetailsFromPerf(handlersReq),
+              getDetailsFromPerf(clientFiltersReq),
+              getDetailsFromPerf(sendReq),
+              getDetailsFromPerf(getConnect),
+              getDetailsFromPerf(writeBuf),
+              getDetailsFromPerf(waitResp),
+              getDetailsFromPerf(wakeConsumer),
+              getDetailsFromPerf(clientFiltersResp),
+              getDetailsFromPerf(handlersResp),
+              getDetailsFromPerf(serverFiltersResp),
+              getDetailsFromPerf(sendResp)
+          ));
+    }
+
+    return sb;
+  }
 
   protected void printVertxMetrics(StringBuilder sb) {
     sb.append("vertx:\n")
@@ -237,4 +367,12 @@ public class DefaultLogPublisher implements MetricsInitializer {
           entry.getValue().getEventLoopContextCreatedCount()));
     }
   }
+
+  private static String getDetailsFromPerf(PerfInfo perfInfo) {
+    String result = "";
+    if (perfInfo != null) {
+      result = String.format("%.3f/%.3f", perfInfo.calcMsLatency(), perfInfo.getMsMaxLatency());
+    }
+    return result;
+  }
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/statistics/MeterDetailStatisticsModel.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/statistics/MeterDetailStatisticsModel.java
deleted file mode 100644
index c5b3f8e..0000000
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/statistics/MeterDetailStatisticsModel.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package org.apache.servicecomb.metrics.core.publish.statistics;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst;
-import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerf;
-import org.apache.servicecomb.metrics.core.publish.model.invocation.PerfInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MeterDetailStatisticsModel {
-
-  private static final Logger LOGGER = LoggerFactory.getLogger(MeterDetailStatisticsModel.class);
-
-  private static final String PRODUCER_DETAILS_FORMAT = "        %-7s: %-22s %-12s: %-22s %-11s: %-22s %-11s: %s\n"
-      + "        %-7s: %-22s %-12s: %-22s %-11s: %-22s %-11s: %s\n";
-
-  private static final String CONSUMER_DETAILS_FORMAT = "        %-17s: %-22s %-12s: %-22s %-16s: %-22s %-12s: %s\n"
-      + "        %-17s: %-22s %-12s: %-22s %-16s: %-22s %-12s: %s\n"
-      + "        %-17s: %-22s %-12s: %s\n";
-
-  private static final String EDGE_DETAILS_FORMAT = "        %-17s: %-22s %-12s: %-22s %-17s: %-22s %-12s: %s\n"
-      + "        %-17s: %-22s %-12s: %-22s %-17s: %-22s %-12s: %s\n"
-      + "        %-17s: %-22s %-12s: %-22s %-17s: %-22s %-12s: %s\n"
-      + "        %-17s: %-22s %-12s: %s\n";
-
-  private MeterStatisticsMeterType type;
-
-  private String operation;
-
-  // status : rest.400
-  private List<String> status = new ArrayList<>();
-
-  //key : status .  tag -> value
-  private Map<String, Map<String, String>> detailsStatistics = new HashMap<>();
-
-  //keep the order
-  private static Map<String, String> producerKeys = new LinkedHashMap<>();
-
-  private static Map<String, String> consumersKeys = new LinkedHashMap<>();
-
-  private static Map<String, String> edgeKeys = new LinkedHashMap<>();
-
-  static {
-    //producers
-    producerKeys.put("prepare", MeterInvocationConst.STAGE_PREPARE);
-    producerKeys.put("queue", MeterInvocationConst.STAGE_EXECUTOR_QUEUE);
-    producerKeys.put("filtersReq", MeterInvocationConst.STAGE_SERVER_FILTERS_REQUEST);
-    producerKeys.put("handlersReq", MeterInvocationConst.STAGE_HANDLERS_REQUEST);
-    producerKeys.put("execute", MeterInvocationConst.STAGE_EXECUTION);
-    producerKeys.put("handlersResp", MeterInvocationConst.STAGE_HANDLERS_RESPONSE);
-    producerKeys.put("filtersResp", MeterInvocationConst.STAGE_SERVER_FILTERS_RESPONSE);
-    producerKeys.put("sendResp", MeterInvocationConst.STAGE_PRODUCER_SEND_RESPONSE);
-    //consumers
-    consumersKeys.put("prepare", MeterInvocationConst.STAGE_PREPARE);
-    consumersKeys.put("handlersReq", MeterInvocationConst.STAGE_HANDLERS_REQUEST);
-    consumersKeys.put("clientFiltersReq", MeterInvocationConst.STAGE_CLIENT_FILTERS_REQUEST);
-    consumersKeys.put("sendReq", MeterInvocationConst.STAGE_CONSUMER_SEND_REQUEST);
-    consumersKeys.put("getConnect", MeterInvocationConst.STAGE_CONSUMER_GET_CONNECTION);
-    consumersKeys.put("writeBuf", MeterInvocationConst.STAGE_CONSUMER_WRITE_TO_BUF);
-    consumersKeys.put("waitResp", MeterInvocationConst.STAGE_CONSUMER_WAIT_RESPONSE);
-    consumersKeys.put("wakeConsumer", MeterInvocationConst.STAGE_CONSUMER_WAKE_CONSUMER);
-    consumersKeys.put("clientFiltersResp", MeterInvocationConst.STAGE_CLIENT_FILTERS_RESPONSE);
-    consumersKeys.put("handlersResp", MeterInvocationConst.STAGE_HANDLERS_RESPONSE);
-    //edge
-    edgeKeys.put("prepare", MeterInvocationConst.STAGE_PREPARE);
-    edgeKeys.put("queue", MeterInvocationConst.STAGE_EXECUTOR_QUEUE);
-    edgeKeys.put("serverFiltersReq", MeterInvocationConst.STAGE_SERVER_FILTERS_REQUEST);
-    edgeKeys.put("handlersReq", MeterInvocationConst.STAGE_HANDLERS_REQUEST);
-    edgeKeys.put("clientFiltersReq", MeterInvocationConst.STAGE_CLIENT_FILTERS_REQUEST);
-    edgeKeys.put("sendReq", MeterInvocationConst.STAGE_CONSUMER_SEND_REQUEST);
-    edgeKeys.put("getConnect", MeterInvocationConst.STAGE_CONSUMER_GET_CONNECTION);
-    edgeKeys.put("writeBuf", MeterInvocationConst.STAGE_CONSUMER_WRITE_TO_BUF);
-    edgeKeys.put("waitResp", MeterInvocationConst.STAGE_CONSUMER_WAIT_RESPONSE);
-    edgeKeys.put("wakeConsumer", MeterInvocationConst.STAGE_CONSUMER_WAKE_CONSUMER);
-    edgeKeys.put("clientFiltersResp", MeterInvocationConst.STAGE_CLIENT_FILTERS_RESPONSE);
-    edgeKeys.put("handlersResp", MeterInvocationConst.STAGE_HANDLERS_RESPONSE);
-    edgeKeys.put("serverFiltersResp", MeterInvocationConst.STAGE_SERVER_FILTERS_RESPONSE);
-    edgeKeys.put("sendResp", MeterInvocationConst.STAGE_PRODUCER_SEND_RESPONSE);
-  }
-
-  public MeterDetailStatisticsModel(MeterStatisticsMeterType type, String operation) {
-    this.type = type;
-    this.operation = operation;
-  }
-
-  public String getOperation() {
-    return operation;
-  }
-
-  public void setOperation(String operation) {
-    this.operation = operation;
-  }
-
-  public List<String> getStatus() {
-    return status;
-  }
-
-  public void setStatus(List<String> status) {
-    this.status = status;
-  }
-
-  public Map<String, Map<String, String>> getDetailsStatistics() {
-    return detailsStatistics;
-  }
-
-  public void setDetailsStatistics(
-      Map<String, Map<String, String>> detailsStatistics) {
-    this.detailsStatistics = detailsStatistics;
-  }
-
-  public void initOrAddPerfInfo(OperationPerf operationPerf, String status) {
-
-    Map<String, String> meterDetails = new LinkedHashMap<>();
-
-    switch (this.type) {
-      case PRODUCER:
-        //producer
-        producerKeys.forEach((key, value) -> {
-          PerfInfo stage = operationPerf.findStage(value);
-          meterDetails.put(key, MeterStatisticsManager.getDetailsFromPerf(stage));
-        });
-        break;
-      case CONSUMER:
-        //consumer
-        consumersKeys.forEach((key, value) -> {
-          PerfInfo stage = operationPerf.findStage(value);
-          meterDetails.put(key, MeterStatisticsManager.getDetailsFromPerf(stage));
-        });
-        break;
-      case EDGE:
-        //edge
-        edgeKeys.forEach((key, value) -> {
-          PerfInfo stage = operationPerf.findStage(value);
-          meterDetails.put(key, MeterStatisticsManager.getDetailsFromPerf(stage));
-        });
-        break;
-      default:
-        break;
-    }
-
-    if (this.detailsStatistics.containsKey(status)) {
-      LOGGER.warn("the status key is duplicate {}/{}/{}", this.type.name(), this.operation, this.status);
-    }
-
-    this.detailsStatistics.put(status, meterDetails);
-  }
-
-  public StringBuilder getFormatDetails() {
-    StringBuilder stringBuilder = new StringBuilder();
-    //operation
-    stringBuilder.append("    ")
-        .append(this.operation)
-        .append(":\n");
-    // status
-    switch (this.type) {
-      case PRODUCER:
-        for (String key : detailsStatistics.keySet()) {
-          stringBuilder.append("      ")
-              .append(key)
-              .append(":\n");
-          Object[] params = initDetailsArray(detailsStatistics.get(key));
-          stringBuilder.append(String.format(PRODUCER_DETAILS_FORMAT, params));
-        }
-        break;
-      case CONSUMER:
-        for (String key : detailsStatistics.keySet()) {
-          stringBuilder.append("      ")
-              .append(key)
-              .append(":\n");
-          Object[] params = initDetailsArray(detailsStatistics.get(key));
-          stringBuilder.append(String.format(CONSUMER_DETAILS_FORMAT, params));
-        }
-        break;
-      case EDGE:
-        for (String key : detailsStatistics.keySet()) {
-          stringBuilder.append("      ")
-              .append(key)
-              .append(":\n");
-          Object[] params = initDetailsArray(detailsStatistics.get(key));
-          stringBuilder.append(String.format(EDGE_DETAILS_FORMAT, params));
-        }
-        break;
-      default:
-        break;
-    }
-
-    return stringBuilder;
-  }
-
-  public String[] initDetailsArray(Map<String, String> detailsMap) {
-    String[] array = new String[detailsMap.keySet().size() * 2];
-    int index = 0;
-    for (String key : detailsMap.keySet()) {
-      array[index++] = key;
-      array[index++] = detailsMap.get(key);
-    }
-    return array;
-  }
-}
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/statistics/MeterStatisticsManager.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/statistics/MeterStatisticsManager.java
deleted file mode 100644
index ee3ee0a..0000000
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/statistics/MeterStatisticsManager.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.apache.servicecomb.metrics.core.publish.statistics;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerf;
-import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroup;
-import org.apache.servicecomb.metrics.core.publish.model.invocation.PerfInfo;
-
-public class MeterStatisticsManager {
-
-  public static void loadMeterDetailStatisticsModelFromPerfGroup(
-      OperationPerfGroup perfGroup,
-      MeterStatisticsMeterType type, Map<String, MeterDetailStatisticsModel> statisticsOperationMap) {
-    List<OperationPerf> operationPerfs = perfGroup.getOperationPerfs();
-
-    String status = perfGroup.getTransport() + "." + perfGroup.getStatus();
-
-    for (OperationPerf operationPerf : operationPerfs) {
-      String operation = operationPerf.getOperation();
-      MeterDetailStatisticsModel detailStatisticsModel = statisticsOperationMap
-          .computeIfAbsent(operation, key -> new MeterDetailStatisticsModel(type, key));
-      detailStatisticsModel.getStatus().add(status);
-      detailStatisticsModel.initOrAddPerfInfo(operationPerf, status);
-    }
-  }
-
-
-  public static String getDetailsFromPerf(PerfInfo perfInfo) {
-    String result = "";
-    if (perfInfo != null) {
-      result = String.format("%.3f/%.3f", perfInfo.calcMsLatency(), perfInfo.getMsMaxLatency());
-    }
-    return result;
-  }
-}
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/statistics/MeterStatisticsMeterType.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/statistics/MeterStatisticsMeterType.java
deleted file mode 100644
index edfbf61..0000000
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/statistics/MeterStatisticsMeterType.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.apache.servicecomb.metrics.core.publish.statistics;
-
-public enum MeterStatisticsMeterType {
-  EDGE,
-  CONSUMER,
-  PRODUCER
-}
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
index 2d20327..2accd34 100644
--- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
@@ -200,8 +200,8 @@ public class TestDefaultLogPublisher {
             + "    rest.OK         10            10.000/0.000                               op\n"
             + "                    10            10.000/0.000                               (summary)\n"
             + "  details:\n"
-            + "    op:\n"
-            + "      rest.OK:\n"
+            + "    rest.OK:\n"
+            + "      op:\n"
             + "        prepare          : 10.000/0.000           handlersReq : 10.000/0.000           clientFiltersReq: 10.000/0.000           sendReq     : 10.000/0.000\n"
             + "        getConnect       : 10.000/0.000           writeBuf    : 10.000/0.000           waitResp        : 10.000/0.000           wakeConsumer: 10.000/0.000\n"
             + "        clientFiltersResp: 10.000/0.000           handlersResp: 10.000/0.000\n"
@@ -211,8 +211,8 @@ public class TestDefaultLogPublisher {
             + "    rest.OK         10            10.000/0.000                               op\n"
             + "                    10            10.000/0.000                               (summary)\n"
             + "  details:\n"
-            + "    op:\n"
-            + "      rest.OK:\n"
+            + "    rest.OK:\n"
+            + "      op:\n"
             + "        prepare: 10.000/0.000           queue       : 10.000/0.000           filtersReq : 10.000/0.000           handlersReq: 10.000/0.000\n"
             + "        execute: 10.000/0.000           handlersResp: 10.000/0.000           filtersResp: 10.000/0.000           sendResp   : 10.000/0.000\n",
         event.getMessage());