package com.navercorp.pinpoint.common.server.bo.serializer.trace.v1;
import com.navercorp.pinpoint.common.buffer.AutomaticBuffer;
import com.navercorp.pinpoint.common.buffer.Buffer;
import com.navercorp.pinpoint.common.server.bo.AnnotationBo;
import com.navercorp.pinpoint.common.server.bo.BasicSpan;
import com.navercorp.pinpoint.common.server.bo.SpanEventBo;
import com.navercorp.pinpoint.common.server.bo.serializer.HbaseSerializer;
import com.navercorp.pinpoint.common.server.bo.serializer.SerializationContext;
import org.apache.hadoop.hbase.client.Put;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.nio.ByteBuffer;
import java.util.List;
import static com.navercorp.pinpoint.common.hbase.HBaseTables.TRACES_CF_TERMINALSPAN;
/**
* @author Woonduk Kang(emeroad)
*/
@Component
public class SpanEventSerializer implements HbaseSerializer<SpanEventEncodingContext, Put> {
private AnnotationSerializer annotationSerializer;
@Autowired
public void setAnnotationSerializer(AnnotationSerializer annotationSerializer) {
this.annotationSerializer = annotationSerializer;
}
@Override
public void serialize(SpanEventEncodingContext spanEventEncodingContext, Put put, SerializationContext context) {
ByteBuffer rowId = writeQualifier(spanEventEncodingContext);
final ByteBuffer value = writeValue(spanEventEncodingContext);
final long acceptedTime = put.getTimeStamp();
put.addColumn(TRACES_CF_TERMINALSPAN, rowId, acceptedTime, value);
}
private ByteBuffer writeQualifier(SpanEventEncodingContext spanEventEncodingContext) {
SpanEventBo spanEventBo = spanEventEncodingContext.getSpanEventBo();
BasicSpan basicSpan = spanEventEncodingContext.getBasicSpan();
final Buffer rowId = new AutomaticBuffer();
rowId.putLong(basicSpan.getSpanId());
rowId.putShort(spanEventBo.getSequence());
rowId.putInt(spanEventBo.getAsyncId());
rowId.putShort(spanEventBo.getAsyncSequence());
return rowId.wrapByteBuffer();
}
public ByteBuffer writeValue(SpanEventEncodingContext spanEventEncodingContext) {
SpanEventBo spanEventBo = spanEventEncodingContext.getSpanEventBo();
BasicSpan basicSpan = spanEventEncodingContext.getBasicSpan();
final Buffer buffer = new AutomaticBuffer(512);
buffer.putByte(spanEventBo.getVersion());
buffer.putPrefixedString(basicSpan.getAgentId());
buffer.putPrefixedString(basicSpan.getApplicationId());
buffer.putVLong(basicSpan.getAgentStartTime());
buffer.putVInt(spanEventBo.getStartElapsed());
buffer.putVInt(spanEventBo.getEndElapsed());
// don't need to put sequence because it is set at Qualifier
// buffer.put(sequence);
buffer.putPrefixedString(spanEventBo.getRpc());
buffer.putShort(spanEventBo.getServiceType());
buffer.putPrefixedString(spanEventBo.getEndPoint());
buffer.putPrefixedString(spanEventBo.getDestinationId());
buffer.putSVInt(spanEventBo.getApiId());
buffer.putSVInt(spanEventBo.getDepth());
buffer.putLong(spanEventBo.getNextSpanId());
if (spanEventBo.hasException()) {
buffer.putBoolean(true);
buffer.putSVInt(spanEventBo.getExceptionId());
buffer.putPrefixedString(spanEventBo.getExceptionMessage());
} else {
buffer.putBoolean(false);
}
final List<AnnotationBo> annotationBoList = spanEventBo.getAnnotationBoList();
this.annotationSerializer.writeAnnotationList(annotationBoList, buffer);
buffer.putSVInt(spanEventBo.getNextAsyncId());
return buffer.wrapByteBuffer();
}
}