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 2020/06/30 10:00:39 UTC

[skywalking] 01/01: Fix endpoint dependency bug in MQ and uninstrumented proxy cases, and support endpoint dependency(v2 of endpoint topology case).

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

wusheng pushed a commit to branch endpoint-dependencies
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit 224a5292540ebb61f88f0158d1e201ffb1eeb74f
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Tue Jun 30 18:00:11 2020 +0800

    Fix endpoint dependency bug in MQ and uninstrumented proxy cases, and support endpoint dependency(v2 of endpoint topology case).
---
 .../server/core/query/TopologyQueryService.java    | 48 ++++++++++++++++++++++
 .../oap/server/core/query/type/EndpointNode.java   | 36 ++++++++++++++++
 .../server/core/query/type/EndpointTopology.java   | 34 +++++++++++++++
 .../oap/query/graphql/resolver/TopologyQuery.java  | 11 +++++
 .../src/main/resources/query-protocol              |  2 +-
 .../listener/MultiScopesAnalysisListener.java      |  1 +
 .../provider/parser/listener/SourceBuilder.java    | 20 ++++++++-
 .../listener/MultiScopesAnalysisListenerTest.java  |  1 +
 8 files changed, 150 insertions(+), 3 deletions(-)

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 4b0ee5b..75daa4c 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
@@ -30,6 +30,8 @@ import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService;
 import org.apache.skywalking.oap.server.core.query.type.Call;
+import org.apache.skywalking.oap.server.core.query.type.EndpointNode;
+import org.apache.skywalking.oap.server.core.query.type.EndpointTopology;
 import org.apache.skywalking.oap.server.core.query.type.Node;
 import org.apache.skywalking.oap.server.core.query.type.ServiceInstanceTopology;
 import org.apache.skywalking.oap.server.core.query.type.Topology;
@@ -132,6 +134,7 @@ public class TopologyQueryService implements Service {
         return builder.build(serviceInstanceRelationClientCalls, serviceInstanceRelationServerCalls);
     }
 
+    @Deprecated
     public Topology getEndpointTopology(final long startTB, final long endTB,
                                         final String endpointId) throws IOException {
         List<Call.CallDetail> serverSideCalls = getTopologyQueryDAO().loadEndpointRelation(
@@ -162,6 +165,37 @@ public class TopologyQueryService implements Service {
         return topology;
     }
 
+    public EndpointTopology getEndpointDependencies(final long startTB, final long endTB,
+                                                    final String endpointId) throws IOException {
+        List<Call.CallDetail> serverSideCalls = getTopologyQueryDAO().loadEndpointRelation(
+            startTB, endTB, endpointId);
+
+        EndpointTopology topology = new EndpointTopology();
+        serverSideCalls.forEach(callDetail -> {
+            Call call = new Call();
+            call.setId(callDetail.getId());
+            call.setSource(callDetail.getSource());
+            call.setTarget(callDetail.getTarget());
+            call.addDetectPoint(DetectPoint.SERVER);
+            topology.getCalls().add(call);
+        });
+
+        Set<String> nodeIds = new HashSet<>();
+        serverSideCalls.forEach(call -> {
+            if (!nodeIds.contains(call.getSource())) {
+                topology.getNodes().add(buildEndpointDependencyNode(call.getSource()));
+                nodeIds.add(call.getSource());
+            }
+            if (!nodeIds.contains(call.getTarget())) {
+                topology.getNodes().add(buildEndpointDependencyNode(call.getTarget()));
+                nodeIds.add(call.getTarget());
+            }
+        });
+
+        return topology;
+    }
+
+    @Deprecated
     private Node buildEndpointNode(String endpointId) {
         Node node = new Node();
         node.setId(endpointId);
@@ -172,4 +206,18 @@ public class TopologyQueryService implements Service {
         node.setReal(true);
         return node;
     }
+
+    private EndpointNode buildEndpointDependencyNode(String endpointId) {
+        final IDManager.EndpointID.EndpointIDDefinition endpointIDDefinition = IDManager.EndpointID.analysisId(
+            endpointId);
+        EndpointNode instanceNode = new EndpointNode();
+        instanceNode.setId(endpointId);
+        instanceNode.setName(endpointIDDefinition.getEndpointName());
+        instanceNode.setServiceId(endpointIDDefinition.getServiceId());
+        final IDManager.ServiceID.ServiceIDDefinition serviceIDDefinition = IDManager.ServiceID.analysisId(
+            endpointIDDefinition.getServiceId());
+        instanceNode.setServiceName(serviceIDDefinition.getName());
+        instanceNode.setReal(serviceIDDefinition.isReal());
+        return instanceNode;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EndpointNode.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EndpointNode.java
new file mode 100644
index 0000000..6dcd3e9
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EndpointNode.java
@@ -0,0 +1,36 @@
+/*
+ * 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.query.type;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class EndpointNode {
+    private String id;
+    private String name;
+    private String serviceId;
+    private String serviceName;
+    /**
+     * Not type for endpoint for now.
+     */
+    private String type = "";
+    private boolean isReal;
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EndpointTopology.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EndpointTopology.java
new file mode 100644
index 0000000..2510d91
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EndpointTopology.java
@@ -0,0 +1,34 @@
+/*
+ * 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.query.type;
+
+import java.util.ArrayList;
+import java.util.List;
+import lombok.Getter;
+
+@Getter
+public class EndpointTopology {
+    private final List<EndpointNode> nodes;
+    private final List<Call> calls;
+
+    public EndpointTopology() {
+        this.nodes = new ArrayList<>();
+        this.calls = new ArrayList<>();
+    }
+}
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
index 333c962..19f98f1 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.query.TopologyQueryService;
 import org.apache.skywalking.oap.server.core.query.input.Duration;
+import org.apache.skywalking.oap.server.core.query.type.EndpointTopology;
 import org.apache.skywalking.oap.server.core.query.type.ServiceInstanceTopology;
 import org.apache.skywalking.oap.server.core.query.type.Topology;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
@@ -69,8 +70,18 @@ public class TopologyQuery implements GraphQLQueryResolver {
         );
     }
 
+    /**
+     * Replaced by {@link #getEndpointDependencies(String, Duration)}
+     */
+    @Deprecated
     public Topology getEndpointTopology(final String endpointId, final Duration duration) throws IOException {
         return getQueryService().getEndpointTopology(
             duration.getStartTimeBucket(), duration.getEndTimeBucket(), endpointId);
     }
+
+    public EndpointTopology getEndpointDependencies(final String endpointId,
+                                                    final Duration duration) throws IOException {
+        return getQueryService().getEndpointDependencies(
+            duration.getStartTimeBucket(), duration.getEndTimeBucket(), endpointId);
+    }
 }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
index 4c1d1d9..bea847b 160000
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
@@ -1 +1 @@
-Subproject commit 4c1d1d996f6baece949fce90c676647b52e25620
+Subproject commit bea847b90e08c07a5407c4121fe4cec1eec77a78
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 342d264..7b7b075 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
@@ -107,6 +107,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
                 if (span.getSpanLayer().equals(SpanLayer.MQ) ||
                     config.getUninstrumentedGatewaysConfig().isAddressConfiguredAsGateway(networkAddressUsedAtPeer)) {
                     sourceBuilder.setSourceServiceName(networkAddressUsedAtPeer);
+                    sourceBuilder.setSourceEndpointOwnerServiceName(reference.getParentService());
                     sourceBuilder.setSourceServiceInstanceName(networkAddressUsedAtPeer);
                     sourceBuilder.setSourceNodeType(NodeType.fromSpanLayerValue(span.getSpanLayer()));
                 } else {
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/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/SourceBuilder.java
index 8c23eb3..689c51f 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/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/SourceBuilder.java
@@ -57,6 +57,17 @@ class SourceBuilder {
         this.sourceServiceInstanceName = namingControl.formatInstanceName(sourceServiceInstanceName);
     }
 
+    /**
+     * Source endpoint could be not owned by {@link #sourceServiceName}, such as in the MQ or un-instrumented proxy
+     * cases. This service always comes from the span.ref, so it is always a normal service.
+     */
+    @Getter
+    private String sourceEndpointOwnerServiceName;
+
+    public void setSourceEndpointOwnerServiceName(final String sourceServiceName) {
+        this.sourceEndpointOwnerServiceName = namingControl.formatServiceName(sourceServiceName);
+    }
+
     @Getter
     private String sourceEndpointName;
 
@@ -234,8 +245,13 @@ class SourceBuilder {
         }
         EndpointRelation endpointRelation = new EndpointRelation();
         endpointRelation.setEndpoint(sourceEndpointName);
-        endpointRelation.setServiceName(sourceServiceName);
-        endpointRelation.setServiceNodeType(sourceNodeType);
+        if (sourceEndpointOwnerServiceName == null) {
+            endpointRelation.setServiceName(sourceServiceName);
+            endpointRelation.setServiceNodeType(sourceNodeType);
+        } else {
+            endpointRelation.setServiceName(sourceEndpointOwnerServiceName);
+            endpointRelation.setServiceNodeType(NodeType.Normal);
+        }
         endpointRelation.setServiceInstanceName(sourceServiceInstanceName);
         endpointRelation.setChildEndpoint(destEndpointName);
         endpointRelation.setChildServiceName(destServiceName);
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
index b944189..b715e7c 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
@@ -282,6 +282,7 @@ public class MultiScopesAnalysisListenerTest {
         Assert.assertEquals("127.0.0.1", serviceInstanceRelation.getSourceServiceInstanceName());
         Assert.assertEquals(serviceInstance.getName(), serviceInstanceRelation.getDestServiceInstanceName());
         Assert.assertEquals("downstream-endpoint", endpointRelation.getEndpoint());
+        Assert.assertEquals("downstream-service", endpointRelation.getServiceName());
         Assert.assertEquals(endpoint.getName(), endpointRelation.getChildEndpoint());
     }