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 c41253c45..4ea33a88a 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 { @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 { 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 { } 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; + } }