From 07cc984d736bd61b6442389abe6693c90b05c6ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=99=9F=20Wu=20Sheng?= Date: Thu, 7 May 2020 23:00:38 +0800 Subject: [PATCH] Polish metrics logic, fix service traffic bug (#4754) 1. Service Traffic should serialize and deserialize the time bucket, otherwise, there is a chance service_traffic-0 generated. 2. Make top N results more clear about the owner. Previously, the same endpoint names of different services look the same. 3. Sync UI. 4. Fix service traffic equal and hashcode method. The time bucket is not a part of the entity attribute. --- .../manual/service/ServiceTraffic.java | 9 ++++++- .../core/query/AggregationQueryService.java | 27 +++++++++++++++++-- .../listener/MultiScopesAnalysisListener.java | 1 - skywalking-ui | 2 +- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java index c9a93acf11..2f635667c2 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java @@ -38,7 +38,10 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column; @Stream(name = ServiceTraffic.INDEX_NAME, scopeId = DefaultScopeDefine.SERVICE, builder = ServiceTraffic.Builder.class, processor = MetricsStreamProcessor.class) @MetricsExtension(supportDownSampling = false, supportUpdate = false) -@EqualsAndHashCode +@EqualsAndHashCode(of = { + "name", + "nodeType" +}) public class ServiceTraffic extends Metrics { public static final String INDEX_NAME = "service_traffic"; @@ -69,6 +72,8 @@ public class ServiceTraffic extends Metrics { public void deserialize(final RemoteData remoteData) { setName(remoteData.getDataStrings(0)); setNodeType(NodeType.valueOf(remoteData.getDataIntegers(0))); + // Time bucket is not a part of persistent, but still is required in the first time insert. + setTimeBucket(remoteData.getDataLongs(0)); } @Override @@ -76,6 +81,8 @@ public class ServiceTraffic extends Metrics { final RemoteData.Builder builder = RemoteData.newBuilder(); builder.addDataStrings(name); builder.addDataIntegers(nodeType.value()); + // Time bucket is not a part of persistent, but still is required in the first time insert. + builder.addDataLongs(getTimeBucket()); return builder; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java index 40a4c8277b..ffa7daeaaa 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java @@ -68,10 +68,33 @@ public class AggregationQueryService implements Service { selectedRecord.setName(IDManager.ServiceID.analysisId(selectedRecord.getId()).getName()); break; case ServiceInstance: - selectedRecord.setName(IDManager.ServiceInstanceID.analysisId(selectedRecord.getId()).getName()); + final IDManager.ServiceInstanceID.InstanceIDDefinition instanceIDDefinition + = IDManager.ServiceInstanceID.analysisId(selectedRecord.getId()); + /** + * Add the service name into the name if this is global top N. + */ + if (StringUtil.isEmpty(condition.getParentService())) { + IDManager.ServiceID.ServiceIDDefinition serviceIDDefinition = + IDManager.ServiceID.analysisId(instanceIDDefinition.getServiceId()); + selectedRecord.setName(serviceIDDefinition.getName() + " - " + instanceIDDefinition.getName()); + } else { + selectedRecord.setName(instanceIDDefinition.getName()); + } break; case Endpoint: - selectedRecord.setName(IDManager.EndpointID.analysisId(selectedRecord.getId()).getEndpointName()); + final IDManager.EndpointID.EndpointIDDefinition endpointIDDefinition + = IDManager.EndpointID.analysisId(selectedRecord.getId()); + /** + * Add the service name into the name if this is global top N. + */ + if (StringUtil.isEmpty(condition.getParentService())) { + IDManager.ServiceID.ServiceIDDefinition serviceIDDefinition = + IDManager.ServiceID.analysisId(endpointIDDefinition.getServiceId()); + selectedRecord.setName(serviceIDDefinition.getName() + + " - " + endpointIDDefinition.getEndpointName()); + } else { + selectedRecord.setName(endpointIDDefinition.getEndpointName()); + } break; default: selectedRecord.setName(Const.UNKNOWN); 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/MultiScopesAnalysisListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListener.java index 63eaf400a2..567dc32e18 100755 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListener.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListener.java @@ -276,7 +276,6 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA }); exitSourceBuilders.forEach(exitSourceBuilder -> { - sourceReceiver.receive(exitSourceBuilder.toService()); sourceReceiver.receive(exitSourceBuilder.toServiceRelation()); /* diff --git a/skywalking-ui b/skywalking-ui index 86ed033a6f..0416d32524 160000 --- a/skywalking-ui +++ b/skywalking-ui @@ -1 +1 @@ -Subproject commit 86ed033a6f976a87b666df10bc103f7249fda2b5 +Subproject commit 0416d325243be661142fba415717ddc926127016 -- GitLab