/* * Copyright 2014 NAVER Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.navercorp.pinpoint.web.mapper; import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.navercorp.pinpoint.common.buffer.Buffer; import com.navercorp.pinpoint.common.buffer.OffsetFixedBuffer; import com.navercorp.pinpoint.common.hbase.RowMapper; import com.navercorp.pinpoint.common.util.TransactionId; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.client.Result; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * @author emeroad * @author netspider */ @Component public class TransactionIdMapper implements RowMapper<List<TransactionId>> { private final Logger logger = LoggerFactory.getLogger(this.getClass()); // @Autowired // private AbstractRowKeyDistributor rowKeyDistributor; @Override public List<TransactionId> mapRow(Result result, int rowNum) throws Exception { if (result.isEmpty()) { return Collections.emptyList(); } Cell[] rawCells = result.rawCells(); List<TransactionId> traceIdList = new ArrayList<>(rawCells.length); for (Cell cell : rawCells) { final byte[] qualifierArray = cell.getQualifierArray(); final int qualifierOffset = cell.getQualifierOffset(); final int qualifierLength = cell.getQualifierLength(); // increment by value of key TransactionId traceId = parseVarTransactionId(qualifierArray, qualifierOffset, qualifierLength); traceIdList.add(traceId); logger.debug("found traceId {}", traceId); } return traceIdList; } public static TransactionId parseVarTransactionId(byte[] bytes, int offset, int length) { if (bytes == null) { throw new NullPointerException("bytes must not be null"); } final Buffer buffer = new OffsetFixedBuffer(bytes, offset, length); // skip elapsed time (not used) hbase column prefix - only used for filtering. // Not sure if we can reduce the data size any further. // buffer.readInt(); String agentId = buffer.readPrefixedString(); long agentStartTime = buffer.readSVLong(); long transactionSequence = buffer.readVLong(); return new TransactionId(agentId, agentStartTime, transactionSequence); } }