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 5a55b9b  Provide Pxx(p99,p95,p90,p75,p50) indicators and All 
dispatcher (#1654)
5a55b9b is described below

commit 5a55b9ba1b3a7b4400449752a0f314e846aa23c1
Author: 吴晟 Wu Sheng <[email protected]>
AuthorDate: Tue Sep 11 16:20:22 2018 +0800

    Provide Pxx(p99,p95,p90,p75,p50) indicators and All dispatcher (#1654)
    
    * Add 3 cases for existed indicators.
    
    * Add Pxx indicator.
    
    * Support All in trace analysis listener.
    
    * Fix CI and add P99/95/90/75/50 to source ALL.
---
 .../server/core/analysis/DispatcherManager.java    |   3 +
 .../core/analysis/generated/all/AllDispatcher.java |  80 +++++++++++++
 .../analysis/generated/all/AllP50Indicator.java    | 122 +++++++++++++++++++
 .../analysis/generated/all/AllP75Indicator.java    | 122 +++++++++++++++++++
 .../analysis/generated/all/AllP90Indicator.java    | 122 +++++++++++++++++++
 .../analysis/generated/all/AllP95Indicator.java    | 122 +++++++++++++++++++
 .../analysis/generated/all/AllP99Indicator.java    | 122 +++++++++++++++++++
 .../core/analysis/indicator/IntKeyLongValue.java   |  75 ++++++++++++
 .../core/analysis/indicator/P50Indicator.java}     |  26 ++---
 .../core/analysis/indicator/P75Indicator.java}     |  26 ++---
 .../core/analysis/indicator/P90Indicator.java}     |  26 ++---
 .../core/analysis/indicator/P95Indicator.java}     |  26 ++---
 .../core/analysis/indicator/P99Indicator.java}     |  26 ++---
 .../core/analysis/indicator/PxxIndicator.java      | 130 +++++++++++++++++++++
 .../core/analysis/indicator/annotation/Arg.java}   |  28 ++---
 .../skywalking/oap/server/core/source/All.java}    |  35 +++---
 .../server-core/src/main/proto/RemoteService.proto |   6 +
 .../analysis/indicator/LongAvgIndicatorTest.java   |  69 +++++++++++
 .../analysis/indicator/PercentIndicatorTest.java   |  84 +++++++++++++
 .../core/analysis/indicator/PxxIndicatorTest.java  | 114 ++++++++++++++++++
 .../core/analysis/indicator/SumIndicatorTest.java  |  73 ++++++++++++
 .../listener/endpoint/MultiScopesSpanListener.java |   1 +
 .../parser/listener/endpoint/SourceBuilder.java    |  13 +++
 23 files changed, 1317 insertions(+), 134 deletions(-)

diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java
index 6f059c7..cd6c508 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.server.core.analysis;
 
 import java.util.*;
+import 
org.apache.skywalking.oap.server.core.analysis.generated.all.AllDispatcher;
 import 
org.apache.skywalking.oap.server.core.analysis.generated.endpoint.EndpointDispatcher;
 import 
org.apache.skywalking.oap.server.core.analysis.generated.endpointrelation.EndpointRelationDispatcher;
 import 
org.apache.skywalking.oap.server.core.analysis.generated.service.ServiceDispatcher;
@@ -45,6 +46,8 @@ public class DispatcherManager {
     public DispatcherManager() {
         this.dispatcherMap = new HashMap<>();
 
+        this.dispatcherMap.put(Scope.All, new AllDispatcher());
+
         this.dispatcherMap.put(Scope.Service, new ServiceDispatcher());
         this.dispatcherMap.put(Scope.ServiceInstance, new 
ServiceInstanceDispatcher());
         this.dispatcherMap.put(Scope.Endpoint, new EndpointDispatcher());
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllDispatcher.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllDispatcher.java
new file mode 100644
index 0000000..486e518
--- /dev/null
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllDispatcher.java
@@ -0,0 +1,80 @@
+/*
+ * 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.oap.server.core.analysis.generated.all;
+
+import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
+import org.apache.skywalking.oap.server.core.source.*;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+public class AllDispatcher implements SourceDispatcher<All> {
+
+    @Override public void dispatch(All source) {
+        doAllP99(source);
+        doAllP95(source);
+        doAllP90(source);
+        doAllP75(source);
+        doAllP50(source);
+    }
+
+    private void doAllP99(All source) {
+        AllP99Indicator indicator = new AllP99Indicator();
+
+
+        indicator.setTimeBucket(source.getTimeBucket());
+        indicator.combine(source.getLatency(), 10);
+        IndicatorProcess.INSTANCE.in(indicator);
+    }
+    private void doAllP95(All source) {
+        AllP95Indicator indicator = new AllP95Indicator();
+
+
+        indicator.setTimeBucket(source.getTimeBucket());
+        indicator.combine(source.getLatency(), 10);
+        IndicatorProcess.INSTANCE.in(indicator);
+    }
+    private void doAllP90(All source) {
+        AllP90Indicator indicator = new AllP90Indicator();
+
+
+        indicator.setTimeBucket(source.getTimeBucket());
+        indicator.combine(source.getLatency(), 10);
+        IndicatorProcess.INSTANCE.in(indicator);
+    }
+    private void doAllP75(All source) {
+        AllP75Indicator indicator = new AllP75Indicator();
+
+
+        indicator.setTimeBucket(source.getTimeBucket());
+        indicator.combine(source.getLatency(), 10);
+        IndicatorProcess.INSTANCE.in(indicator);
+    }
+    private void doAllP50(All source) {
+        AllP50Indicator indicator = new AllP50Indicator();
+
+
+        indicator.setTimeBucket(source.getTimeBucket());
+        indicator.combine(source.getLatency(), 10);
+        IndicatorProcess.INSTANCE.in(indicator);
+    }
+}
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java
new file mode 100644
index 0000000..6602815
--- /dev/null
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java
@@ -0,0 +1,122 @@
+/*
+ * 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.oap.server.core.analysis.generated.all;
+
+import java.util.*;
+import org.apache.skywalking.oap.server.core.alarm.AlarmMeta;
+import org.apache.skywalking.oap.server.core.alarm.AlarmSupported;
+import org.apache.skywalking.oap.server.core.analysis.indicator.*;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorType;
+import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
+import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+import org.apache.skywalking.oap.server.core.storage.annotation.*;
+import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
+import org.apache.skywalking.oap.server.core.source.Scope;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+@IndicatorType
+@StreamData
+@StorageEntity(name = "all_p50", builder = AllP50Indicator.Builder.class)
+public class AllP50Indicator extends P50Indicator implements AlarmSupported {
+
+
+    @Override public String id() {
+        String splitJointId = String.valueOf(getTimeBucket());
+        return splitJointId;
+    }
+
+    @Override public int hashCode() {
+        int result = 17;
+        result = 31 * result + (int)getTimeBucket();
+        return result;
+    }
+
+    @Override public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+
+        AllP50Indicator indicator = (AllP50Indicator)obj;
+
+        if (getTimeBucket() != indicator.getTimeBucket())
+            return false;
+
+        return true;
+    }
+
+    @Override public RemoteData.Builder serialize() {
+        RemoteData.Builder remoteBuilder = RemoteData.newBuilder();
+
+        remoteBuilder.setDataLongs(0, getTimeBucket());
+
+
+        remoteBuilder.setDataIntegers(0, getValue());
+        remoteBuilder.setDataIntegers(1, getPrecision());
+        getDetailGroup().forEach(element -> 
remoteBuilder.addDataIntLongPairList(element.serialize()));
+
+        return remoteBuilder;
+    }
+
+    @Override public void deserialize(RemoteData remoteData) {
+
+        setTimeBucket(remoteData.getDataLongs(0));
+
+
+        setValue(remoteData.getDataIntegers(0));
+        setPrecision(remoteData.getDataIntegers(1));
+
+        setDetailGroup(new ArrayList<>(30));
+        remoteData.getDataIntLongPairListList().forEach(element -> {
+            getDetailGroup().add(new IntKeyLongValue(element.getKey(), 
element.getValue()));
+        });
+
+    }
+
+    @Override public AlarmMeta getAlarmMeta() {
+        return new AlarmMeta("All_p50", Scope.All);
+    }
+
+    public static class Builder implements StorageBuilder<AllP50Indicator> {
+
+        @Override public Map<String, Object> data2Map(AllP50Indicator 
storageData) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("value", storageData.getValue());
+            map.put("precision", storageData.getPrecision());
+            map.put("detail_group", storageData.getDetailGroup());
+            map.put("time_bucket", storageData.getTimeBucket());
+            return map;
+        }
+
+        @Override public AllP50Indicator map2Data(Map<String, Object> dbMap) {
+            AllP50Indicator indicator = new AllP50Indicator();
+            indicator.setValue(((Number)dbMap.get("value")).intValue());
+            
indicator.setPrecision(((Number)dbMap.get("precision")).intValue());
+            indicator.setDetailGroup((List)dbMap.get("detail_group"));
+            
indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
+            return indicator;
+        }
+    }
+}
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java
new file mode 100644
index 0000000..2a36fa2
--- /dev/null
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java
@@ -0,0 +1,122 @@
+/*
+ * 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.oap.server.core.analysis.generated.all;
+
+import java.util.*;
+import org.apache.skywalking.oap.server.core.alarm.AlarmMeta;
+import org.apache.skywalking.oap.server.core.alarm.AlarmSupported;
+import org.apache.skywalking.oap.server.core.analysis.indicator.*;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorType;
+import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
+import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+import org.apache.skywalking.oap.server.core.storage.annotation.*;
+import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
+import org.apache.skywalking.oap.server.core.source.Scope;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+@IndicatorType
+@StreamData
+@StorageEntity(name = "all_p75", builder = AllP75Indicator.Builder.class)
+public class AllP75Indicator extends P75Indicator implements AlarmSupported {
+
+
+    @Override public String id() {
+        String splitJointId = String.valueOf(getTimeBucket());
+        return splitJointId;
+    }
+
+    @Override public int hashCode() {
+        int result = 17;
+        result = 31 * result + (int)getTimeBucket();
+        return result;
+    }
+
+    @Override public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+
+        AllP75Indicator indicator = (AllP75Indicator)obj;
+
+        if (getTimeBucket() != indicator.getTimeBucket())
+            return false;
+
+        return true;
+    }
+
+    @Override public RemoteData.Builder serialize() {
+        RemoteData.Builder remoteBuilder = RemoteData.newBuilder();
+
+        remoteBuilder.setDataLongs(0, getTimeBucket());
+
+
+        remoteBuilder.setDataIntegers(0, getValue());
+        remoteBuilder.setDataIntegers(1, getPrecision());
+        getDetailGroup().forEach(element -> 
remoteBuilder.addDataIntLongPairList(element.serialize()));
+
+        return remoteBuilder;
+    }
+
+    @Override public void deserialize(RemoteData remoteData) {
+
+        setTimeBucket(remoteData.getDataLongs(0));
+
+
+        setValue(remoteData.getDataIntegers(0));
+        setPrecision(remoteData.getDataIntegers(1));
+
+        setDetailGroup(new ArrayList<>(30));
+        remoteData.getDataIntLongPairListList().forEach(element -> {
+            getDetailGroup().add(new IntKeyLongValue(element.getKey(), 
element.getValue()));
+        });
+
+    }
+
+    @Override public AlarmMeta getAlarmMeta() {
+        return new AlarmMeta("All_p75", Scope.All);
+    }
+
+    public static class Builder implements StorageBuilder<AllP75Indicator> {
+
+        @Override public Map<String, Object> data2Map(AllP75Indicator 
storageData) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("value", storageData.getValue());
+            map.put("precision", storageData.getPrecision());
+            map.put("detail_group", storageData.getDetailGroup());
+            map.put("time_bucket", storageData.getTimeBucket());
+            return map;
+        }
+
+        @Override public AllP75Indicator map2Data(Map<String, Object> dbMap) {
+            AllP75Indicator indicator = new AllP75Indicator();
+            indicator.setValue(((Number)dbMap.get("value")).intValue());
+            
indicator.setPrecision(((Number)dbMap.get("precision")).intValue());
+            indicator.setDetailGroup((List)dbMap.get("detail_group"));
+            
indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
+            return indicator;
+        }
+    }
+}
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java
new file mode 100644
index 0000000..1384e35
--- /dev/null
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java
@@ -0,0 +1,122 @@
+/*
+ * 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.oap.server.core.analysis.generated.all;
+
+import java.util.*;
+import org.apache.skywalking.oap.server.core.alarm.AlarmMeta;
+import org.apache.skywalking.oap.server.core.alarm.AlarmSupported;
+import org.apache.skywalking.oap.server.core.analysis.indicator.*;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorType;
+import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
+import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+import org.apache.skywalking.oap.server.core.storage.annotation.*;
+import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
+import org.apache.skywalking.oap.server.core.source.Scope;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+@IndicatorType
+@StreamData
+@StorageEntity(name = "all_p90", builder = AllP90Indicator.Builder.class)
+public class AllP90Indicator extends P90Indicator implements AlarmSupported {
+
+
+    @Override public String id() {
+        String splitJointId = String.valueOf(getTimeBucket());
+        return splitJointId;
+    }
+
+    @Override public int hashCode() {
+        int result = 17;
+        result = 31 * result + (int)getTimeBucket();
+        return result;
+    }
+
+    @Override public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+
+        AllP90Indicator indicator = (AllP90Indicator)obj;
+
+        if (getTimeBucket() != indicator.getTimeBucket())
+            return false;
+
+        return true;
+    }
+
+    @Override public RemoteData.Builder serialize() {
+        RemoteData.Builder remoteBuilder = RemoteData.newBuilder();
+
+        remoteBuilder.setDataLongs(0, getTimeBucket());
+
+
+        remoteBuilder.setDataIntegers(0, getValue());
+        remoteBuilder.setDataIntegers(1, getPrecision());
+        getDetailGroup().forEach(element -> 
remoteBuilder.addDataIntLongPairList(element.serialize()));
+
+        return remoteBuilder;
+    }
+
+    @Override public void deserialize(RemoteData remoteData) {
+
+        setTimeBucket(remoteData.getDataLongs(0));
+
+
+        setValue(remoteData.getDataIntegers(0));
+        setPrecision(remoteData.getDataIntegers(1));
+
+        setDetailGroup(new ArrayList<>(30));
+        remoteData.getDataIntLongPairListList().forEach(element -> {
+            getDetailGroup().add(new IntKeyLongValue(element.getKey(), 
element.getValue()));
+        });
+
+    }
+
+    @Override public AlarmMeta getAlarmMeta() {
+        return new AlarmMeta("All_p90", Scope.All);
+    }
+
+    public static class Builder implements StorageBuilder<AllP90Indicator> {
+
+        @Override public Map<String, Object> data2Map(AllP90Indicator 
storageData) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("value", storageData.getValue());
+            map.put("precision", storageData.getPrecision());
+            map.put("detail_group", storageData.getDetailGroup());
+            map.put("time_bucket", storageData.getTimeBucket());
+            return map;
+        }
+
+        @Override public AllP90Indicator map2Data(Map<String, Object> dbMap) {
+            AllP90Indicator indicator = new AllP90Indicator();
+            indicator.setValue(((Number)dbMap.get("value")).intValue());
+            
indicator.setPrecision(((Number)dbMap.get("precision")).intValue());
+            indicator.setDetailGroup((List)dbMap.get("detail_group"));
+            
indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
+            return indicator;
+        }
+    }
+}
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java
new file mode 100644
index 0000000..4f6598a
--- /dev/null
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java
@@ -0,0 +1,122 @@
+/*
+ * 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.oap.server.core.analysis.generated.all;
+
+import java.util.*;
+import org.apache.skywalking.oap.server.core.alarm.AlarmMeta;
+import org.apache.skywalking.oap.server.core.alarm.AlarmSupported;
+import org.apache.skywalking.oap.server.core.analysis.indicator.*;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorType;
+import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
+import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+import org.apache.skywalking.oap.server.core.storage.annotation.*;
+import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
+import org.apache.skywalking.oap.server.core.source.Scope;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+@IndicatorType
+@StreamData
+@StorageEntity(name = "all_p95", builder = AllP95Indicator.Builder.class)
+public class AllP95Indicator extends P95Indicator implements AlarmSupported {
+
+
+    @Override public String id() {
+        String splitJointId = String.valueOf(getTimeBucket());
+        return splitJointId;
+    }
+
+    @Override public int hashCode() {
+        int result = 17;
+        result = 31 * result + (int)getTimeBucket();
+        return result;
+    }
+
+    @Override public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+
+        AllP95Indicator indicator = (AllP95Indicator)obj;
+
+        if (getTimeBucket() != indicator.getTimeBucket())
+            return false;
+
+        return true;
+    }
+
+    @Override public RemoteData.Builder serialize() {
+        RemoteData.Builder remoteBuilder = RemoteData.newBuilder();
+
+        remoteBuilder.setDataLongs(0, getTimeBucket());
+
+
+        remoteBuilder.setDataIntegers(0, getValue());
+        remoteBuilder.setDataIntegers(1, getPrecision());
+        getDetailGroup().forEach(element -> 
remoteBuilder.addDataIntLongPairList(element.serialize()));
+
+        return remoteBuilder;
+    }
+
+    @Override public void deserialize(RemoteData remoteData) {
+
+        setTimeBucket(remoteData.getDataLongs(0));
+
+
+        setValue(remoteData.getDataIntegers(0));
+        setPrecision(remoteData.getDataIntegers(1));
+
+        setDetailGroup(new ArrayList<>(30));
+        remoteData.getDataIntLongPairListList().forEach(element -> {
+            getDetailGroup().add(new IntKeyLongValue(element.getKey(), 
element.getValue()));
+        });
+
+    }
+
+    @Override public AlarmMeta getAlarmMeta() {
+        return new AlarmMeta("All_p95", Scope.All);
+    }
+
+    public static class Builder implements StorageBuilder<AllP95Indicator> {
+
+        @Override public Map<String, Object> data2Map(AllP95Indicator 
storageData) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("value", storageData.getValue());
+            map.put("precision", storageData.getPrecision());
+            map.put("detail_group", storageData.getDetailGroup());
+            map.put("time_bucket", storageData.getTimeBucket());
+            return map;
+        }
+
+        @Override public AllP95Indicator map2Data(Map<String, Object> dbMap) {
+            AllP95Indicator indicator = new AllP95Indicator();
+            indicator.setValue(((Number)dbMap.get("value")).intValue());
+            
indicator.setPrecision(((Number)dbMap.get("precision")).intValue());
+            indicator.setDetailGroup((List)dbMap.get("detail_group"));
+            
indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
+            return indicator;
+        }
+    }
+}
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java
new file mode 100644
index 0000000..1ed1477
--- /dev/null
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java
@@ -0,0 +1,122 @@
+/*
+ * 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.oap.server.core.analysis.generated.all;
+
+import java.util.*;
+import org.apache.skywalking.oap.server.core.alarm.AlarmMeta;
+import org.apache.skywalking.oap.server.core.alarm.AlarmSupported;
+import org.apache.skywalking.oap.server.core.analysis.indicator.*;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorType;
+import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
+import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+import org.apache.skywalking.oap.server.core.storage.annotation.*;
+import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
+import org.apache.skywalking.oap.server.core.source.Scope;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+@IndicatorType
+@StreamData
+@StorageEntity(name = "all_p99", builder = AllP99Indicator.Builder.class)
+public class AllP99Indicator extends P99Indicator implements AlarmSupported {
+
+
+    @Override public String id() {
+        String splitJointId = String.valueOf(getTimeBucket());
+        return splitJointId;
+    }
+
+    @Override public int hashCode() {
+        int result = 17;
+        result = 31 * result + (int)getTimeBucket();
+        return result;
+    }
+
+    @Override public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+
+        AllP99Indicator indicator = (AllP99Indicator)obj;
+
+        if (getTimeBucket() != indicator.getTimeBucket())
+            return false;
+
+        return true;
+    }
+
+    @Override public RemoteData.Builder serialize() {
+        RemoteData.Builder remoteBuilder = RemoteData.newBuilder();
+
+        remoteBuilder.setDataLongs(0, getTimeBucket());
+
+
+        remoteBuilder.setDataIntegers(0, getValue());
+        remoteBuilder.setDataIntegers(1, getPrecision());
+        getDetailGroup().forEach(element -> 
remoteBuilder.addDataIntLongPairList(element.serialize()));
+
+        return remoteBuilder;
+    }
+
+    @Override public void deserialize(RemoteData remoteData) {
+
+        setTimeBucket(remoteData.getDataLongs(0));
+
+
+        setValue(remoteData.getDataIntegers(0));
+        setPrecision(remoteData.getDataIntegers(1));
+
+        setDetailGroup(new ArrayList<>(30));
+        remoteData.getDataIntLongPairListList().forEach(element -> {
+            getDetailGroup().add(new IntKeyLongValue(element.getKey(), 
element.getValue()));
+        });
+
+    }
+
+    @Override public AlarmMeta getAlarmMeta() {
+        return new AlarmMeta("All_p99", Scope.All);
+    }
+
+    public static class Builder implements StorageBuilder<AllP99Indicator> {
+
+        @Override public Map<String, Object> data2Map(AllP99Indicator 
storageData) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("value", storageData.getValue());
+            map.put("precision", storageData.getPrecision());
+            map.put("detail_group", storageData.getDetailGroup());
+            map.put("time_bucket", storageData.getTimeBucket());
+            return map;
+        }
+
+        @Override public AllP99Indicator map2Data(Map<String, Object> dbMap) {
+            AllP99Indicator indicator = new AllP99Indicator();
+            indicator.setValue(((Number)dbMap.get("value")).intValue());
+            
indicator.setPrecision(((Number)dbMap.get("precision")).intValue());
+            indicator.setDetailGroup((List)dbMap.get("detail_group"));
+            
indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
+            return indicator;
+        }
+    }
+}
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValue.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValue.java
new file mode 100644
index 0000000..0537d60
--- /dev/null
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValue.java
@@ -0,0 +1,75 @@
+/*
+ * 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.oap.server.core.analysis.indicator;
+
+import java.util.Objects;
+import lombok.Getter;
+import lombok.Setter;
+import 
org.apache.skywalking.oap.server.core.remote.grpc.proto.IntKeyLongValuePair;
+
+/**
+ * IntKeyLongValue is a common bean, with key in Int and value in Long
+ *
+ * @author wusheng
+ */
+@Setter
+@Getter
+public class IntKeyLongValue implements Comparable<IntKeyLongValue> {
+    private int key;
+    private long value;
+
+    public IntKeyLongValue() {
+    }
+
+    public IntKeyLongValue(int key, long value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public void addValue(long value) {
+        this.value += value;
+    }
+
+    @Override
+    public int compareTo(IntKeyLongValue o) {
+        return key - o.key;
+    }
+
+    @Override public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        IntKeyLongValue value = (IntKeyLongValue)o;
+        return key == value.key;
+    }
+
+    @Override public int hashCode() {
+        return Objects.hash(key);
+    }
+
+    public IntKeyLongValuePair serialize() {
+        return 
IntKeyLongValuePair.newBuilder().setKey(key).setValue(value).build();
+    }
+
+    public void deserialize(IntKeyLongValuePair pair) {
+        this.key = pair.getKey();
+        this.value = pair.getValue();
+    }
+}
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P50Indicator.java
similarity index 63%
copy from 
oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
copy to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P50Indicator.java
index 737badf..bb815e0 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P50Indicator.java
@@ -16,27 +16,15 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.indicator.define;
-
-import lombok.*;
-import 
org.apache.skywalking.oap.server.core.analysis.indicator.LongAvgIndicator;
-import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+package org.apache.skywalking.oap.server.core.analysis.indicator;
 
 /**
- * @author peng-yongsheng
+ * P50
+ *
+ * @author wusheng
  */
-public class TestLongAvgIndicator extends LongAvgIndicator {
-
-    @Setter @Getter private int id;
-
-    @Override public RemoteData.Builder serialize() {
-        return null;
-    }
-
-    @Override public void deserialize(RemoteData remoteData) {
-    }
-
-    @Override public String id() {
-        return null;
+public abstract class P50Indicator extends PxxIndicator {
+    public P50Indicator() {
+        super(50);
     }
 }
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P75Indicator.java
similarity index 63%
copy from 
oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
copy to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P75Indicator.java
index 737badf..cfe4e87 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P75Indicator.java
@@ -16,27 +16,15 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.indicator.define;
-
-import lombok.*;
-import 
org.apache.skywalking.oap.server.core.analysis.indicator.LongAvgIndicator;
-import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+package org.apache.skywalking.oap.server.core.analysis.indicator;
 
 /**
- * @author peng-yongsheng
+ * P75
+ *
+ * @author wusheng
  */
-public class TestLongAvgIndicator extends LongAvgIndicator {
-
-    @Setter @Getter private int id;
-
-    @Override public RemoteData.Builder serialize() {
-        return null;
-    }
-
-    @Override public void deserialize(RemoteData remoteData) {
-    }
-
-    @Override public String id() {
-        return null;
+public abstract class P75Indicator extends PxxIndicator {
+    public P75Indicator() {
+        super(75);
     }
 }
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P90Indicator.java
similarity index 63%
copy from 
oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
copy to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P90Indicator.java
index 737badf..52c75c7 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P90Indicator.java
@@ -16,27 +16,15 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.indicator.define;
-
-import lombok.*;
-import 
org.apache.skywalking.oap.server.core.analysis.indicator.LongAvgIndicator;
-import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+package org.apache.skywalking.oap.server.core.analysis.indicator;
 
 /**
- * @author peng-yongsheng
+ * P90
+ *
+ * @author wusheng
  */
-public class TestLongAvgIndicator extends LongAvgIndicator {
-
-    @Setter @Getter private int id;
-
-    @Override public RemoteData.Builder serialize() {
-        return null;
-    }
-
-    @Override public void deserialize(RemoteData remoteData) {
-    }
-
-    @Override public String id() {
-        return null;
+public abstract class P90Indicator extends PxxIndicator {
+    public P90Indicator() {
+        super(90);
     }
 }
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P95Indicator.java
similarity index 63%
copy from 
oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
copy to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P95Indicator.java
index 737badf..9345b20 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P95Indicator.java
@@ -16,27 +16,15 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.indicator.define;
-
-import lombok.*;
-import 
org.apache.skywalking.oap.server.core.analysis.indicator.LongAvgIndicator;
-import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+package org.apache.skywalking.oap.server.core.analysis.indicator;
 
 /**
- * @author peng-yongsheng
+ * P95
+ *
+ * @author wusheng
  */
-public class TestLongAvgIndicator extends LongAvgIndicator {
-
-    @Setter @Getter private int id;
-
-    @Override public RemoteData.Builder serialize() {
-        return null;
-    }
-
-    @Override public void deserialize(RemoteData remoteData) {
-    }
-
-    @Override public String id() {
-        return null;
+public abstract class P95Indicator extends PxxIndicator {
+    public P95Indicator() {
+        super(95);
     }
 }
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P99Indicator.java
similarity index 63%
copy from 
oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
copy to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P99Indicator.java
index 737badf..761e86f 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/P99Indicator.java
@@ -16,27 +16,15 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.indicator.define;
-
-import lombok.*;
-import 
org.apache.skywalking.oap.server.core.analysis.indicator.LongAvgIndicator;
-import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+package org.apache.skywalking.oap.server.core.analysis.indicator;
 
 /**
- * @author peng-yongsheng
+ * P99
+ *
+ * @author wusheng
  */
-public class TestLongAvgIndicator extends LongAvgIndicator {
-
-    @Setter @Getter private int id;
-
-    @Override public RemoteData.Builder serialize() {
-        return null;
-    }
-
-    @Override public void deserialize(RemoteData remoteData) {
-    }
-
-    @Override public String id() {
-        return null;
+public abstract class P99Indicator extends PxxIndicator {
+    public P99Indicator() {
+        super(99);
     }
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/PxxIndicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/PxxIndicator.java
new file mode 100644
index 0000000..282b877
--- /dev/null
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/PxxIndicator.java
@@ -0,0 +1,130 @@
+/*
+ * 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.oap.server.core.analysis.indicator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.Arg;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.Entrance;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorOperator;
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.annotation.SourceFrom;
+import org.apache.skywalking.oap.server.core.storage.annotation.Column;
+
+/**
+ * PxxIndicator is a parent indicator for p99/p95/p90/p75/p50 indicators. 
P(xx) indicator is also for P(xx) percentile.
+ *
+ * A percentile (or a centile) is a measure used in statistics indicating the 
value below which a given percentage of
+ * observations in a group of observations fall. For example, the 20th 
percentile is the value (or score) below which
+ * 20% of the observations may be found.
+ *
+ * @author wusheng
+ */
+@IndicatorOperator
+public abstract class PxxIndicator extends Indicator implements IntValueHolder 
{
+    protected static final String DETAIL_GROUP = "detail_group";
+    protected static final String VALUE = "value";
+    protected static final String PRECISION = "precision";
+
+    @Getter @Setter @Column(columnName = VALUE) private int value;
+    @Getter @Setter @Column(columnName = PRECISION) private int precision;
+    @Getter @Setter @Column(columnName = DETAIL_GROUP) private 
List<IntKeyLongValue> detailGroup;
+
+    private final int percentileRank;
+    private Map<Integer, IntKeyLongValue> detailIndex;
+
+    public PxxIndicator(int percentileRank) {
+        this.percentileRank = percentileRank;
+        detailGroup = new ArrayList<>(30);
+    }
+
+    @Entrance
+    public final void combine(@SourceFrom int value, @Arg int precision) {
+        this.precision = precision;
+
+        this.indexCheckAndInit();
+
+        int index = value / precision;
+        IntKeyLongValue element = detailIndex.get(index);
+        if (element == null) {
+            element = new IntKeyLongValue();
+            element.setKey(index);
+            element.setValue(1);
+            addElement(element);
+        } else {
+            element.addValue(1);
+        }
+    }
+
+    @Override
+    public void combine(Indicator indicator) {
+        PxxIndicator pxxIndicator = (PxxIndicator)indicator;
+        this.indexCheckAndInit();
+        pxxIndicator.indexCheckAndInit();
+
+        pxxIndicator.detailIndex.forEach((key, element) -> {
+            IntKeyLongValue existingElement = this.detailIndex.get(key);
+            if (existingElement == null) {
+                existingElement = new IntKeyLongValue();
+                existingElement.setKey(key);
+                existingElement.setValue(element.getValue());
+                addElement(element);
+            } else {
+                existingElement.addValue(element.getValue());
+            }
+        });
+    }
+
+    @Override
+    public final void calculate() {
+        Collections.sort(detailGroup);
+        int total = detailGroup.stream().mapToInt(element -> 
(int)element.getValue()).sum();
+        int roof = Math.round(total * percentileRank * 1.0f / 100);
+
+        int count = 0;
+        for (IntKeyLongValue element : detailGroup) {
+            count += element.getValue();
+            if (count >= roof) {
+                value = element.getKey() * precision;
+                return;
+            }
+        }
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    private void addElement(IntKeyLongValue element) {
+        detailGroup.add(element);
+        detailIndex.put(element.getKey(), element);
+    }
+
+    private void indexCheckAndInit() {
+        if (detailIndex == null) {
+            detailIndex = new HashMap<>();
+            detailGroup.forEach(element -> detailIndex.put(element.getKey(), 
element));
+        }
+    }
+}
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/Arg.java
similarity index 62%
rename from 
oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
rename to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/Arg.java
index 737badf..fd212f2 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/define/TestLongAvgIndicator.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/annotation/Arg.java
@@ -16,27 +16,17 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.indicator.define;
+package org.apache.skywalking.oap.server.core.analysis.indicator.annotation;
 
-import lombok.*;
-import 
org.apache.skywalking.oap.server.core.analysis.indicator.LongAvgIndicator;
-import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
 /**
- * @author peng-yongsheng
+ * @author wusheng
  */
-public class TestLongAvgIndicator extends LongAvgIndicator {
-
-    @Setter @Getter private int id;
-
-    @Override public RemoteData.Builder serialize() {
-        return null;
-    }
-
-    @Override public void deserialize(RemoteData remoteData) {
-    }
-
-    @Override public String id() {
-        return null;
-    }
+@Target(ElementType.PARAMETER)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Arg {
 }
diff --git a/oap-server/server-core/src/main/proto/RemoteService.proto 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
similarity index 57%
copy from oap-server/server-core/src/main/proto/RemoteService.proto
copy to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
index ddc9fa1..3906145 100644
--- a/oap-server/server-core/src/main/proto/RemoteService.proto
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
@@ -16,28 +16,23 @@
  *
  */
 
-syntax = "proto3";
+package org.apache.skywalking.oap.server.core.source;
 
-option java_multiple_files = true;
-option java_package = 
"org.apache.skywalking.oap.server.core.remote.grpc.proto";
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.skywalking.oap.server.core.source.annotation.SourceType;
 
-service RemoteService {
-    rpc call (stream RemoteMessage) returns (Empty) {
+@SourceType
+public class All extends Source {
+    @Override public Scope scope() {
+        return Scope.All;
     }
-}
-
-message RemoteMessage {
-    int32 nextWorkerId = 1;
-    int32 streamDataId = 2;
-    RemoteData remoteData = 3;
-}
 
-message RemoteData {
-    repeated string dataStrings = 1;
-    repeated int64 dataLongs = 2;
-    repeated double dataDoubles = 3;
-    repeated int32 dataIntegers = 4;
+    @Getter @Setter private String name;
+    @Getter @Setter private String serviceInstanceName;
+    @Getter @Setter private String endpointName;
+    @Getter @Setter private int latency;
+    @Getter @Setter private boolean status;
+    @Getter @Setter private int responseCode;
+    @Getter @Setter private RequestType type;
 }
-
-message Empty {
-}
\ No newline at end of file
diff --git a/oap-server/server-core/src/main/proto/RemoteService.proto 
b/oap-server/server-core/src/main/proto/RemoteService.proto
index ddc9fa1..853ea82 100644
--- a/oap-server/server-core/src/main/proto/RemoteService.proto
+++ b/oap-server/server-core/src/main/proto/RemoteService.proto
@@ -37,6 +37,12 @@ message RemoteData {
     repeated int64 dataLongs = 2;
     repeated double dataDoubles = 3;
     repeated int32 dataIntegers = 4;
+    repeated IntKeyLongValuePair dataIntLongPairList = 5;
+}
+
+message IntKeyLongValuePair {
+    int32 key = 1;
+    int64 value = 2;
 }
 
 message Empty {
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/LongAvgIndicatorTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/LongAvgIndicatorTest.java
new file mode 100644
index 0000000..bcb12fd
--- /dev/null
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/LongAvgIndicatorTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.oap.server.core.analysis.indicator;
+
+import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author wusheng
+ */
+public class LongAvgIndicatorTest {
+    @Test
+    public void testEntranceCombine() {
+        LongAvgIndicatorImpl impl = new LongAvgIndicatorImpl();
+        impl.combine(12, 1);
+        impl.combine(24, 2);
+        impl.combine(36, 3);
+        impl.calculate();
+        Assert.assertEquals(12, impl.getValue());
+    }
+
+    @Test
+    public void testSelfCombine() {
+        LongAvgIndicatorImpl impl = new LongAvgIndicatorImpl();
+        impl.combine(12, 1);
+        impl.combine(24, 2);
+
+        LongAvgIndicatorImpl impl2 = new LongAvgIndicatorImpl();
+        impl2.combine(24, 1);
+        impl2.combine(48, 2);
+
+        impl.combine(impl2);
+
+        impl.calculate();
+        Assert.assertEquals(18, impl.getValue());
+    }
+
+    public class LongAvgIndicatorImpl extends LongAvgIndicator {
+
+        @Override public String id() {
+            return null;
+        }
+
+        @Override public void deserialize(RemoteData remoteData) {
+
+        }
+
+        @Override public RemoteData.Builder serialize() {
+            return null;
+        }
+    }
+}
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/PercentIndicatorTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/PercentIndicatorTest.java
new file mode 100644
index 0000000..6ed96a9
--- /dev/null
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/PercentIndicatorTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.oap.server.core.analysis.indicator;
+
+import 
org.apache.skywalking.oap.server.core.analysis.indicator.expression.EqualMatch;
+import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author wusheng
+ */
+public class PercentIndicatorTest {
+    @Test
+    public void testEntranceCombine() {
+        PercentIndicatorImpl impl = new PercentIndicatorImpl();
+        impl.combine(new EqualMatch(), true, true);
+        impl.combine(new EqualMatch(), true, false);
+        impl.combine(new EqualMatch(), true, false);
+
+        impl.calculate();
+
+        Assert.assertEquals(33, impl.getValue());
+
+        impl = new PercentIndicatorImpl();
+        impl.combine(new EqualMatch(), true, true);
+        impl.combine(new EqualMatch(), true, true);
+        impl.combine(new EqualMatch(), true, false);
+
+        impl.calculate();
+
+        Assert.assertEquals(66, impl.getValue());
+    }
+
+    @Test
+    public void testSelfCombine() {
+        PercentIndicatorImpl impl = new PercentIndicatorImpl();
+        impl.combine(new EqualMatch(), true, true);
+        impl.combine(new EqualMatch(), true, false);
+        impl.combine(new EqualMatch(), true, false);
+
+        PercentIndicatorImpl impl2 = new PercentIndicatorImpl();
+        impl2.combine(new EqualMatch(), true, true);
+        impl2.combine(new EqualMatch(), true, true);
+        impl2.combine(new EqualMatch(), true, false);
+
+        impl.combine(impl2);
+
+        impl.calculate();
+
+        Assert.assertEquals(50, impl.getValue());
+    }
+
+    public class PercentIndicatorImpl extends PercentIndicator {
+
+        @Override public String id() {
+            return null;
+        }
+
+        @Override public void deserialize(RemoteData remoteData) {
+
+        }
+
+        @Override public RemoteData.Builder serialize() {
+            return null;
+        }
+    }
+}
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/PxxIndicatorTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/PxxIndicatorTest.java
new file mode 100644
index 0000000..5644c52
--- /dev/null
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/PxxIndicatorTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.oap.server.core.analysis.indicator;
+
+import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author wusheng
+ */
+public class PxxIndicatorTest {
+    private int precision = 10;//ms
+
+    @Test
+    public void p99Test() {
+        PxxIndicatorMocker indicatorMocker = new PxxIndicatorMocker(99);
+
+        indicatorMocker.combine(110, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(50, precision);
+        indicatorMocker.combine(50, precision);
+        indicatorMocker.combine(50, precision);
+        indicatorMocker.combine(61, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(100, precision);
+
+        indicatorMocker.calculate();
+
+        Assert.assertEquals(110, indicatorMocker.getValue());
+    }
+
+    @Test
+    public void p75Test() {
+        PxxIndicatorMocker indicatorMocker = new PxxIndicatorMocker(75);
+
+        indicatorMocker.combine(110, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(50, precision);
+        indicatorMocker.combine(50, precision);
+        indicatorMocker.combine(50, precision);
+        indicatorMocker.combine(61, precision);
+        indicatorMocker.combine(61, precision);
+        indicatorMocker.combine(71, precision);
+        indicatorMocker.combine(100, precision);
+
+        indicatorMocker.calculate();
+
+        // precision = 10, 71 ~= 70
+        Assert.assertEquals(100, indicatorMocker.getValue());
+    }
+
+    @Test
+    public void p50Test() {
+        PxxIndicatorMocker indicatorMocker = new PxxIndicatorMocker(50);
+
+        indicatorMocker.combine(110, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(100, precision);
+        indicatorMocker.combine(50, precision);
+        indicatorMocker.combine(50, precision);
+        indicatorMocker.combine(50, precision);
+        indicatorMocker.combine(61, precision);
+        indicatorMocker.combine(61, precision);
+        indicatorMocker.combine(71, precision);
+        indicatorMocker.combine(100, precision);
+
+        indicatorMocker.calculate();
+
+        // precision = 10, 71 ~= 70
+        Assert.assertEquals(70, indicatorMocker.getValue());
+    }
+
+    public class PxxIndicatorMocker extends PxxIndicator {
+
+        public PxxIndicatorMocker(int percentileRank) {
+            super(percentileRank);
+        }
+
+        @Override public String id() {
+            return null;
+        }
+
+        @Override public void deserialize(RemoteData remoteData) {
+
+        }
+
+        @Override public RemoteData.Builder serialize() {
+            return null;
+        }
+    }
+}
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/SumIndicatorTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/SumIndicatorTest.java
new file mode 100644
index 0000000..dc03c05
--- /dev/null
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/indicator/SumIndicatorTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.oap.server.core.analysis.indicator;
+
+import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author wusheng
+ */
+public class SumIndicatorTest {
+    @Test
+    public void testEntranceCombine() {
+        SumIndicatorImpl impl = new SumIndicatorImpl();
+        impl.combine(5);
+        impl.combine(6);
+        impl.combine(7);
+
+        impl.calculate();
+
+        Assert.assertEquals(18, impl.getValue());
+    }
+
+    @Test
+    public void testSelfCombine() {
+        SumIndicatorImpl impl = new SumIndicatorImpl();
+        impl.combine(5);
+        impl.combine(6);
+        impl.combine(7);
+
+        SumIndicatorImpl impl2 = new SumIndicatorImpl();
+        impl2.combine(5);
+        impl2.combine(6);
+        impl2.combine(7);
+
+        impl.combine(impl2);
+
+        impl.calculate();
+
+        Assert.assertEquals(36, impl.getValue());
+    }
+
+    public class SumIndicatorImpl extends SumIndicator {
+        @Override public String id() {
+            return null;
+        }
+
+        @Override public void deserialize(RemoteData remoteData) {
+
+        }
+
+        @Override public RemoteData.Builder serialize() {
+            return null;
+        }
+    }
+}
diff --git 
a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java
 
b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java
index cbbf576..ff083b4 100644
--- 
a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java
+++ 
b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java
@@ -162,6 +162,7 @@ public class MultiScopesSpanListener implements 
EntrySpanListener, ExitSpanListe
     @Override public void build() {
         entrySourceBuilders.forEach(entrySourceBuilder -> {
             entrySourceBuilder.setTimeBucket(minuteTimeBucket);
+            sourceReceiver.receive(entrySourceBuilder.toAll());
             sourceReceiver.receive(entrySourceBuilder.toService());
             sourceReceiver.receive(entrySourceBuilder.toServiceInstance());
             sourceReceiver.receive(entrySourceBuilder.toEndpoint());
diff --git 
a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/SourceBuilder.java
 
b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/SourceBuilder.java
index e5485fe..3b32008 100644
--- 
a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/SourceBuilder.java
+++ 
b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/SourceBuilder.java
@@ -45,6 +45,19 @@ class SourceBuilder {
     @Getter @Setter private DetectPoint detectPoint;
     @Getter @Setter private long timeBucket;
 
+    All toAll() {
+        All all = new All();
+        all.setName(destServiceName);
+        all.setServiceInstanceName(destServiceInstanceName);
+        all.setEndpointName(destEndpointName);
+        all.setLatency(latency);
+        all.setStatus(status);
+        all.setResponseCode(responseCode);
+        all.setType(type);
+        all.setTimeBucket(timeBucket);
+        return all;
+    }
+
     Service toService() {
         Service service = new Service();
         service.setId(destServiceId);

Reply via email to