Commit a3e03f61 authored by 兵's avatar Committed by 吴晟
Browse files

Un-exchanged endpoint name in ref can't find the id (#2162)

* Update ReferenceIdExchanger.java

Change comments of codes.
parent 4f3e2337
Loading
Loading
Loading
Loading
+28 −4
Original line number Diff line number Diff line
@@ -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,7 +71,7 @@ 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()) {
@@ -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;
    }
}