in oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/trace/SpanForward.java [67:156]
public void send(List<Span> spanList) {
if (CollectionUtils.isEmpty(spanList)) {
return;
}
getSampledTraces(spanList).forEach(span -> {
ZipkinSpan zipkinSpan = new ZipkinSpan();
String serviceName = span.localServiceName();
if (StringUtil.isEmpty(serviceName)) {
serviceName = "Unknown";
}
zipkinSpan.setSpanId(span.id());
zipkinSpan.setTraceId(span.traceId());
zipkinSpan.setSpanId(span.id());
zipkinSpan.setParentId(span.parentId());
zipkinSpan.setName(getNamingControl().formatEndpointName(serviceName, span.name()));
zipkinSpan.setDuration(span.duration());
if (span.kind() != null) {
zipkinSpan.setKind(span.kind().name());
}
zipkinSpan.setLocalEndpointServiceName(getNamingControl().formatServiceName(serviceName));
if (span.localEndpoint() != null) {
zipkinSpan.setLocalEndpointIPV4(span.localEndpoint().ipv4());
zipkinSpan.setLocalEndpointIPV6(span.localEndpoint().ipv6());
Integer localPort = span.localEndpoint().port();
if (localPort != null) {
zipkinSpan.setLocalEndpointPort(localPort);
}
}
if (span.remoteEndpoint() != null) {
zipkinSpan.setRemoteEndpointServiceName(getNamingControl().formatServiceName(span.remoteServiceName()));
zipkinSpan.setRemoteEndpointIPV4(span.remoteEndpoint().ipv4());
zipkinSpan.setRemoteEndpointIPV6(span.remoteEndpoint().ipv6());
Integer remotePort = span.remoteEndpoint().port();
if (remotePort != null) {
zipkinSpan.setRemoteEndpointPort(remotePort);
}
}
zipkinSpan.setTimestamp(span.timestampAsLong());
zipkinSpan.setDebug(span.debug());
zipkinSpan.setShared(span.shared());
long timestampMillis = span.timestampAsLong() / 1000;
zipkinSpan.setTimestampMillis(timestampMillis);
long timeBucket = TimeBucket.getRecordTimeBucket(timestampMillis);
zipkinSpan.setTimeBucket(timeBucket);
long minuteTimeBucket = TimeBucket.getMinuteTimeBucket(timestampMillis);
if (!span.tags().isEmpty() || !span.annotations().isEmpty()) {
List<String> query = zipkinSpan.getQuery();
JsonObject annotationsJson = new JsonObject();
JsonObject tagsJson = new JsonObject();
for (Annotation annotation : span.annotations()) {
annotationsJson.addProperty(Long.toString(annotation.timestamp()), annotation.value());
if (annotation.value().length() > ZipkinSpanRecord.QUERY_LENGTH) {
if (log.isDebugEnabled()) {
log.debug("Span annotation : {} length > : {}, dropped", annotation.value(), ZipkinSpanRecord.QUERY_LENGTH);
}
continue;
}
query.add(annotation.value());
}
zipkinSpan.setAnnotations(annotationsJson);
for (Map.Entry<String, String> tag : span.tags().entrySet()) {
String tagString = tag.getKey() + "=" + tag.getValue();
tagsJson.addProperty(tag.getKey(), tag.getValue());
if (tag.getValue().length() > Tag.TAG_LENGTH || tagString.length() > Tag.TAG_LENGTH) {
if (log.isDebugEnabled()) {
log.debug("Span tag : {} length > : {}, dropped", tagString, Tag.TAG_LENGTH);
}
continue;
}
query.add(tag.getKey());
query.add(tagString);
if (searchTagKeys.contains(tag.getKey())) {
addAutocompleteTags(minuteTimeBucket, tag.getKey(), tag.getValue());
}
}
zipkinSpan.setTags(tagsJson);
}
getReceiver().receive(zipkinSpan);
toService(zipkinSpan, minuteTimeBucket);
toServiceSpan(zipkinSpan, minuteTimeBucket);
if (!StringUtil.isEmpty(zipkinSpan.getRemoteEndpointServiceName())) {
toServiceRelation(zipkinSpan, minuteTimeBucket);
}
});
}