You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2018/10/16 10:40:48 UTC
[incubator-skywalking] branch master updated: Fixed the bug of
service topology and global topology. (#1775)
This is an automated email from the ASF dual-hosted git repository.
wusheng 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 f78abfb Fixed the bug of service topology and global topology. (#1775)
f78abfb is described below
commit f78abfb28c93baab5d56006396a0bfab870f0a06
Author: 彭勇升 pengys <80...@qq.com>
AuthorDate: Tue Oct 16 18:40:42 2018 +0800
Fixed the bug of service topology and global topology. (#1775)
---
.../oap/server/core/query/TopologyBuilder.java | 112 ++++++++++++---------
.../server/core/query/TopologyQueryService.java | 17 +---
2 files changed, 67 insertions(+), 62 deletions(-)
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java
index 5cdcdab..b10f9b3 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java
@@ -51,11 +51,14 @@ class TopologyBuilder {
Map<Integer, Integer> mappings = changeMapping2Map(serviceMappings);
filterZeroSourceOrTargetReference(serviceRelationClientCalls);
filterZeroSourceOrTargetReference(serviceRelationServerCalls);
- serviceRelationServerCalls = serverCallsFilter(serviceRelationServerCalls);
+ mappingIdExchange(mappings, serviceRelationClientCalls);
+ mappingIdExchange(mappings, serviceRelationServerCalls);
List<Node> nodes = new LinkedList<>();
List<Call> calls = new LinkedList<>();
Set<Integer> nodeIds = new HashSet<>();
+ Set<String> callIds = new HashSet<>();
+
serviceRelationClientCalls.forEach(clientCall -> {
ServiceInventory source = serviceInventoryCache.get(clientCall.getSource());
ServiceInventory target = serviceInventoryCache.get(clientCall.getTarget());
@@ -72,29 +75,28 @@ class TopologyBuilder {
}
}
- Set<Integer> serviceNodeIds = buildNodeIds(nodes);
- if (!serviceNodeIds.contains(source.getSequence())) {
- Node serviceNode = new Node();
- serviceNode.setId(source.getSequence());
- serviceNode.setName(source.getName());
- serviceNode.setType(nodeCompMap.getOrDefault(source.getSequence(), Const.UNKNOWN));
- if (BooleanUtils.valueToBoolean(source.getIsAddress())) {
- serviceNode.setReal(false);
- } else {
- serviceNode.setReal(true);
- }
- nodes.add(serviceNode);
+ if (!nodeIds.contains(source.getSequence())) {
+ nodes.add(buildNode(nodeCompMap, source));
+ nodeIds.add(source.getSequence());
}
- Call call = new Call();
- call.setSource(source.getSequence());
+ if (!nodeIds.contains(target.getSequence())) {
+ nodes.add(buildNode(nodeCompMap, target));
+ nodeIds.add(target.getSequence());
+ }
- int actualTargetId = mappings.getOrDefault(target.getSequence(), target.getSequence());
- call.setTarget(actualTargetId);
- call.setCallType(nodeCompMap.get(clientCall.getTarget()));
- call.setId(clientCall.getId());
- call.setDetectPoint(DetectPoint.CLIENT);
- calls.add(call);
+ String callId = source.getSequence() + Const.ID_SPLIT + target.getSequence();
+ if (!callIds.contains(callId)) {
+ callIds.add(callId);
+
+ Call call = new Call();
+ call.setSource(source.getSequence());
+ call.setTarget(target.getSequence());
+ call.setCallType(nodeCompMap.get(clientCall.getTarget()));
+ call.setId(clientCall.getId());
+ call.setDetectPoint(DetectPoint.CLIENT);
+ calls.add(call);
+ }
});
serviceRelationServerCalls.forEach(serverCall -> {
@@ -125,18 +127,33 @@ class TopologyBuilder {
}
}
- Call call = new Call();
- call.setSource(source.getSequence());
- call.setTarget(target.getSequence());
- call.setId(serverCall.getId());
- call.setDetectPoint(DetectPoint.SERVER);
+ if (!nodeIds.contains(source.getSequence())) {
+ nodes.add(buildNode(nodeCompMap, source));
+ nodeIds.add(source.getSequence());
+ }
+
+ if (!nodeIds.contains(target.getSequence())) {
+ nodes.add(buildNode(nodeCompMap, target));
+ nodeIds.add(target.getSequence());
+ }
- if (source.getSequence() == Const.USER_SERVICE_ID) {
- call.setCallType(Const.EMPTY_STRING);
- } else {
- call.setCallType(nodeCompMap.get(serverCall.getTarget()));
+ String callId = source.getSequence() + Const.ID_SPLIT + target.getSequence();
+ if (!callIds.contains(callId)) {
+ callIds.add(callId);
+
+ Call call = new Call();
+ call.setSource(source.getSequence());
+ call.setTarget(target.getSequence());
+ call.setId(serverCall.getId());
+ call.setDetectPoint(DetectPoint.SERVER);
+
+ if (source.getSequence() == Const.USER_SERVICE_ID) {
+ call.setCallType(Const.EMPTY_STRING);
+ } else {
+ call.setCallType(nodeCompMap.get(serverCall.getTarget()));
+ }
+ calls.add(call);
}
- calls.add(call);
});
Topology topology = new Topology();
@@ -145,23 +162,11 @@ class TopologyBuilder {
return topology;
}
- private Set<Integer> buildNodeIds(List<Node> nodes) {
- Set<Integer> nodeIds = new HashSet<>();
- nodes.forEach(node -> nodeIds.add(node.getId()));
- return nodeIds;
- }
-
- private List<Call> serverCallsFilter(List<Call> serviceRelationServerCalls) {
- List<Call> filteredCalls = new LinkedList<>();
-
- serviceRelationServerCalls.forEach(serverCall -> {
- ServiceInventory source = serviceInventoryCache.get(serverCall.getSource());
- if (BooleanUtils.valueToBoolean(source.getIsAddress()) || source.getSequence() == Const.USER_SERVICE_ID) {
- filteredCalls.add(serverCall);
- }
+ private void mappingIdExchange(Map<Integer, Integer> mappings, List<Call> serviceRelationCalls) {
+ serviceRelationCalls.forEach(relationCall -> {
+ relationCall.setSource(mappings.getOrDefault(relationCall.getSource(), relationCall.getSource()));
+ relationCall.setTarget(mappings.getOrDefault(relationCall.getTarget(), relationCall.getTarget()));
});
-
- return filteredCalls;
}
private Map<Integer, Integer> changeMapping2Map(List<ServiceMapping> serviceMappings) {
@@ -189,6 +194,19 @@ class TopologyBuilder {
return components;
}
+ private Node buildNode(Map<Integer, String> nodeCompMap, ServiceInventory serviceInventory) {
+ Node serviceNode = new Node();
+ serviceNode.setId(serviceInventory.getSequence());
+ serviceNode.setName(serviceInventory.getName());
+ serviceNode.setType(nodeCompMap.getOrDefault(serviceInventory.getSequence(), Const.UNKNOWN));
+ if (BooleanUtils.valueToBoolean(serviceInventory.getIsAddress())) {
+ serviceNode.setReal(false);
+ } else {
+ serviceNode.setReal(true);
+ }
+ return serviceNode;
+ }
+
private void filterZeroSourceOrTargetReference(List<Call> serviceRelationClientCalls) {
for (int i = serviceRelationClientCalls.size() - 1; i >= 0; i--) {
Call call = serviceRelationClientCalls.get(i);
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java
index 06be80d..74b80fd 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java
@@ -92,27 +92,14 @@ public class TopologyQueryService implements Service {
serviceIds.add(mapping.getMappingServiceId());
}
});
+
List<Integer> serviceIdList = new ArrayList<>(serviceIds);
List<Call> serviceRelationClientCalls = getTopologyQueryDAO().loadSpecifiedClientSideServiceRelations(step, startTB, endTB, serviceIdList);
List<Call> serviceRelationServerCalls = getTopologyQueryDAO().loadSpecifiedServerSideServiceRelations(step, startTB, endTB, serviceIdList);
TopologyBuilder builder = new TopologyBuilder(moduleManager);
- Topology topology = builder.build(serviceComponents, new ArrayList<>(), serviceRelationClientCalls, serviceRelationServerCalls);
-
- Set<Integer> nodeIds = new HashSet<>();
- topology.getCalls().forEach(call -> {
- nodeIds.add(call.getSource());
- nodeIds.add(call.getTarget());
- });
-
- for (int i = topology.getNodes().size() - 1; i >= 0; i--) {
- if (!nodeIds.contains(topology.getNodes().get(i).getId())) {
- topology.getNodes().remove(i);
- }
- }
-
- return topology;
+ return builder.build(serviceComponents, serviceMappings, serviceRelationClientCalls, serviceRelationServerCalls);
}
public Topology getEndpointTopology(final Step step, final long startTB, final long endTB,