in oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCAnalysisListener.java [85:160]
public void parseEntry(SpanObject span, SegmentObject segmentObject) {
if (span.getSkipAnalysis()) {
return;
}
if (span.getRefsCount() > 0) {
for (int i = 0; i < span.getRefsCount(); i++) {
SegmentReference reference = span.getRefs(i);
RPCTrafficSourceBuilder sourceBuilder = new RPCTrafficSourceBuilder(namingControl);
if (StringUtil.isEmpty(reference.getParentEndpoint())) {
sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME);
} else {
sourceBuilder.setSourceEndpointName(reference.getParentEndpoint());
}
final String networkAddressUsedAtPeer = reference.getNetworkAddressUsedAtPeer();
boolean isMQ = span.getSpanLayer().equals(SpanLayer.MQ);
if (isMQ || config.getUninstrumentedGatewaysConfig()
.isAddressConfiguredAsGateway(networkAddressUsedAtPeer)) {
sourceBuilder.setSourceServiceName(networkAddressUsedAtPeer);
sourceBuilder.setSourceEndpointOwnerServiceName(reference.getParentService());
sourceBuilder.setSourceServiceInstanceName(networkAddressUsedAtPeer);
if (isMQ) {
sourceBuilder.setSourceLayer(Layer.VIRTUAL_MQ);
} else {
sourceBuilder.setSourceLayer(Layer.VIRTUAL_GATEWAY);
}
sourceBuilder.setSourceEndpointOwnerServiceLayer(Layer.GENERAL);
} else {
sourceBuilder.setSourceServiceName(reference.getParentService());
sourceBuilder.setSourceServiceInstanceName(reference.getParentServiceInstance());
sourceBuilder.setSourceLayer(Layer.GENERAL);
}
sourceBuilder.setDestEndpointName(span.getOperationName());
sourceBuilder.setDestServiceInstanceName(segmentObject.getServiceInstance());
sourceBuilder.setDestServiceName(segmentObject.getService());
sourceBuilder.setDestLayer(identifyServiceLayer(span.getSpanLayer()));
sourceBuilder.setDetectPoint(DetectPoint.SERVER);
sourceBuilder.setComponentId(span.getComponentId());
setPublicAttrs(sourceBuilder, span);
callingInTraffic.add(sourceBuilder);
}
} else if (span.getSpanLayer() == SpanLayer.MQ && StringUtil.isNotBlank(span.getPeer())) {
// For MQ, if there is no producer-side instrumentation, we set the existing peer as the source service name.
RPCTrafficSourceBuilder sourceBuilder = new RPCTrafficSourceBuilder(namingControl);
sourceBuilder.setSourceServiceName(span.getPeer());
sourceBuilder.setSourceServiceInstanceName(span.getPeer());
sourceBuilder.setDestEndpointName(span.getOperationName());
sourceBuilder.setSourceLayer(Layer.MQ);
sourceBuilder.setDestServiceInstanceName(segmentObject.getServiceInstance());
sourceBuilder.setDestServiceName(segmentObject.getService());
sourceBuilder.setDestLayer(identifyServiceLayer(span.getSpanLayer()));
sourceBuilder.setDetectPoint(DetectPoint.SERVER);
sourceBuilder.setComponentId(span.getComponentId());
setPublicAttrs(sourceBuilder, span);
callingInTraffic.add(sourceBuilder);
} else {
RPCTrafficSourceBuilder sourceBuilder = new RPCTrafficSourceBuilder(namingControl);
sourceBuilder.setSourceServiceName(Const.USER_SERVICE_NAME);
sourceBuilder.setSourceServiceInstanceName(Const.USER_INSTANCE_NAME);
sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME);
sourceBuilder.setSourceLayer(Layer.UNDEFINED);
sourceBuilder.setDestServiceInstanceName(segmentObject.getServiceInstance());
sourceBuilder.setDestServiceName(segmentObject.getService());
sourceBuilder.setDestLayer(identifyServiceLayer(span.getSpanLayer()));
sourceBuilder.setDestEndpointName(span.getOperationName());
sourceBuilder.setDetectPoint(DetectPoint.SERVER);
sourceBuilder.setComponentId(span.getComponentId());
setPublicAttrs(sourceBuilder, span);
callingInTraffic.add(sourceBuilder);
}
parseLogicEndpoints(span, segmentObject);
}