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 2019/01/15 12:38:12 UTC

[incubator-skywalking] branch master updated: Un-exchanged endpoint name in ref can't find the id (#2162)

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 a3e03f6  Un-exchanged endpoint name in ref can't find the id (#2162)
a3e03f6 is described below

commit a3e03f61337f9c443a7a9857f3c2bcb7f2e330ce
Author: 兵 <di...@hotmail.com>
AuthorDate: Tue Jan 15 20:38:05 2019 +0800

    Un-exchanged endpoint name in ref can't find the id (#2162)
    
    * Update ReferenceIdExchanger.java
    
    Change comments of codes.
---
 .../standardization/ReferenceIdExchanger.java      | 32 +++++++++++++++++++---
 1 file changed, 28 insertions(+), 4 deletions(-)

diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java
index c41253c..4ea33a8 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java
@@ -55,8 +55,7 @@ public class ReferenceIdExchanger implements IdExchanger<ReferenceDecorator> {
     @Override public boolean exchange(ReferenceDecorator standardBuilder, int serviceId) {
         if (standardBuilder.getEntryEndpointId() == 0) {
             String entryEndpointName = Strings.isNullOrEmpty(standardBuilder.getEntryEndpointName()) ? Const.DOMAIN_OPERATION_NAME : standardBuilder.getEntryEndpointName();
-            int entryEndpointId = endpointInventoryRegister.get(serviceInstanceInventoryCache.get(standardBuilder.getEntryServiceInstanceId()).getServiceId(), entryEndpointName, DetectPoint.SERVER.ordinal());
-
+            int entryEndpointId = getEndpointId(standardBuilder, entryEndpointName);
             if (entryEndpointId == 0) {
                 if (logger.isDebugEnabled()) {
                     int entryServiceId = serviceInstanceInventoryCache.get(standardBuilder.getEntryServiceInstanceId()).getServiceId();
@@ -72,8 +71,8 @@ public class ReferenceIdExchanger implements IdExchanger<ReferenceDecorator> {
 
         if (standardBuilder.getParentEndpointId() == 0) {
             String parentEndpointName = Strings.isNullOrEmpty(standardBuilder.getParentEndpointName()) ? Const.DOMAIN_OPERATION_NAME : standardBuilder.getParentEndpointName();
-            int parentEndpointId = endpointInventoryRegister.get(serviceInstanceInventoryCache.get(standardBuilder.getParentServiceInstanceId()).getServiceId(), parentEndpointName, DetectPoint.SERVER.ordinal());
-
+            int parentEndpointId = getEndpointId(standardBuilder, parentEndpointName);
+            
             if (parentEndpointId == 0) {
                 if (logger.isDebugEnabled()) {
                     int parentServiceId = serviceInstanceInventoryCache.get(standardBuilder.getParentServiceInstanceId()).getServiceId();
@@ -103,4 +102,29 @@ public class ReferenceIdExchanger implements IdExchanger<ReferenceDecorator> {
         }
         return true;
     }
+    
+    /**
+     * Endpoint in ref could be local or exit span's operation name.
+     * Especially if it is local span operation name,
+     * exchange may not happen at agent, such as Java agent,
+     * then put literal endpoint string in the header,
+     * Need to try to get the id by assuming the endpoint name is detected at server, local or client.
+     *
+     * If agent does the exchange, then always use endpoint id.
+     * 
+     * @param standardBuilder
+     * @param endpointName
+     * @return
+     */
+    private int getEndpointId(ReferenceDecorator standardBuilder,String endpointName) {
+        int serviceId = serviceInstanceInventoryCache.get(standardBuilder.getEntryServiceInstanceId()).getServiceId();
+        int endpointId = endpointInventoryRegister.get(serviceId, endpointName, DetectPoint.SERVER.ordinal());
+        if (endpointId == Const.NONE) {
+            endpointId = endpointInventoryRegister.get(serviceId, endpointName, DetectPoint.CLIENT.ordinal());
+            if (endpointId == Const.NONE) {
+                endpointId = endpointInventoryRegister.get(serviceId, endpointName, DetectPoint.UNRECOGNIZED.ordinal());
+            }
+        }
+        return endpointId;
+    }
 }