package com.navercorp.pinpoint.collector.dao.hbase;
import com.navercorp.pinpoint.collector.dao.TraceDao;
import com.navercorp.pinpoint.common.hbase.HbaseOperations2;
import com.navercorp.pinpoint.common.server.bo.SpanBo;
import com.navercorp.pinpoint.common.server.bo.SpanChunkBo;
import com.navercorp.pinpoint.common.server.bo.SpanEventBo;
import com.navercorp.pinpoint.common.server.bo.serializer.RowKeyEncoder;
import com.navercorp.pinpoint.common.server.bo.serializer.trace.v2.SpanChunkSerializerV2;
import com.navercorp.pinpoint.common.server.bo.serializer.trace.v2.SpanSerializerV2;
import com.navercorp.pinpoint.common.util.TransactionId;
import org.apache.commons.collections.CollectionUtils;
import org.apache.hadoop.hbase.client.Put;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import java.util.List;
import static com.navercorp.pinpoint.common.hbase.HBaseTables.TRACE_V2;
/**
* @author Woonduk Kang(emeroad)
*/
@Repository
public class HbaseTraceDaoV2 implements TraceDao {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private HbaseOperations2 hbaseTemplate;
@Autowired
private SpanSerializerV2 spanSerializer;
@Autowired
private SpanChunkSerializerV2 spanChunkSerializer;
@Autowired
@Qualifier("traceRowKeyEncoderV2")
private RowKeyEncoder<TransactionId> rowKeyEncoder;
@Override
public void insert(final SpanBo spanBo) {
if (spanBo == null) {
throw new NullPointerException("spanBo must not be null");
}
long acceptedTime = spanBo.getCollectorAcceptTime();
TransactionId transactionId = spanBo.getTransactionId();
final byte[] rowKey = this.rowKeyEncoder.encodeRowKey(transactionId);
final Put put = new Put(rowKey, acceptedTime);
this.spanSerializer.serialize(spanBo, put, null);
boolean success = hbaseTemplate.asyncPut(TRACE_V2, put);
if (!success) {
hbaseTemplate.put(TRACE_V2, put);
}
}
@Override
public void insertSpanChunk(SpanChunkBo spanChunkBo) {
TransactionId transactionId = spanChunkBo.getTransactionId();
final byte[] rowKey = this.rowKeyEncoder.encodeRowKey(transactionId);
final long acceptedTime = spanChunkBo.getCollectorAcceptTime();
final Put put = new Put(rowKey, acceptedTime);
final List<SpanEventBo> spanEventBoList = spanChunkBo.getSpanEventBoList();
if (CollectionUtils.isEmpty(spanEventBoList)) {
return;
}
this.spanChunkSerializer.serialize(spanChunkBo, put, null);
if (!put.isEmpty()) {
boolean success = hbaseTemplate.asyncPut(TRACE_V2, put);
if (!success) {
hbaseTemplate.put(TRACE_V2, put);
}
}
}
}