@Override public void insert(TSpan span) { if (span == null) { throw new NullPointerException("span must not be null"); } Trace trace = findTrace(span.getAgentId(), span.getAgentStartTime(), span.getSpanId()); final TransactionId transactionId = TransactionIdUtils.parseTransactionId(span.getTransactionId()); trace.setTraceAgentId(transactionId.getAgentId()); if (trace.getTraceAgentId() == null) { trace.setTraceAgentId(span.getAgentId()); } trace.setTraceAgentStartTime(transactionId.getAgentStartTime()); trace.setTraceTransactionSequence(transactionId.getTransactionSequence()); trace.setSpanId(span.getSpanId()); trace.setParentSpanId(span.getParentSpanId()); trace.setStartTime(span.getStartTime()); trace.setElapsed(span.getElapsed()); trace.setRpc(span.getRpc()); trace.setServiceType(span.getServiceType()); trace.setEndPoint(span.getEndPoint()); trace.setFlag(span.getFlag()); ApiMetaData apiMetaData = findApiMetaData(trace.getAgentId(), span.getApiId()); trace.setApiId(apiMetaData.getId()); trace.setErrCode(span.getErr()); trace.setRemoteAddr(span.getRemoteAddr()); final TIntStringValue exceptionInfo = span.getExceptionInfo(); if (exceptionInfo != null) { trace.setHasException(true); trace.setExceptionId(exceptionInfo.getIntValue()); trace.setExceptionMessage(exceptionInfo.getStringValue()); } long acceptedTime = acceptedTimeService.getAcceptedTime(); trace.setCollectorAcceptTime(acceptedTime); Trace savedTrace = traceRepository.saveAndFlush(trace); if (span.getAnnotations() != null) { List<Annotation> annotations = span.getAnnotations() .stream() .filter(tAnnotation -> tAnnotation != null) .map( tAnnotation -> { Annotation annotation = new Annotation(); annotation.setKey(tAnnotation.getKey()); Object value = transcoder.getMappingValue(tAnnotation); annotation.setValueType(transcoder.getTypeCode(value)); annotation.setByteValue(transcoder.encode(value, annotation.getValueType())); annotation.setTraceId(savedTrace.getId()); return annotation; }) .collect(Collectors.toList()); annotationRepository.save(annotations); } addNestedSpanEvent(span, savedTrace); }