[강운덕] [LUCYSUS-1744] hbase 저장시의 데이터를 컴팩트하게 함.

git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-commons/trunk@803 84d0f5b1-2673-498c-a247-62c4ff18d310
This commit is contained in:
Woonduk Kang
2012-10-18 05:32:24 +00:00
parent 3182471291
commit 4e4caa529f
12 changed files with 908 additions and 176 deletions
@@ -0,0 +1,164 @@
package com.profiler.common.bo;
import com.profiler.common.dto.thrift.Annotation;
import com.profiler.common.util.Buffer;
import java.nio.charset.Charset;
/**
*
*/
public class AnnotationBo {
private static final Charset UTF8 = Charset.forName("UTF-8");
private static final int VERSION_SIZE = 1;
// version 0 = prefix의 사이즈를 int로
// version 1 = prefix의 사이즈를 short로
// version 2 = prefix의 사이즈를 byte 하면 byte eocnding이 좀 줄지 않나?
private byte version = 0;
private long spanId;
private long timestamp;
private String key;
private byte[] keyBytes;
private long duration;
private int valueType;
private byte[] value;
public AnnotationBo() {
}
public AnnotationBo(Annotation ano) {
this.timestamp = ano.getTimestamp();
this.key = ano.getKey();
this.duration = ano.getDuration();
this.valueType = ano.getValueTypeCode();
this.value = ano.getValue();
}
public long getSpanId() {
return spanId;
}
public void setSpanId(long spanId) {
this.spanId = spanId;
}
public int getVersion() {
return version & 0xFF;
}
public void setVersion(int version) {
if (version < 0 || version > 255) {
throw new IllegalArgumentException("out of range (0~255)");
}
// range 체크
this.version = (byte) (version & 0xFF);
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public byte[] getKeyBytes() {
if (keyBytes == null) {
keyBytes = this.key.getBytes(UTF8);
}
return keyBytes;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public long getDuration() {
return duration;
}
public void setDuration(long duration) {
this.duration = duration;
}
public int getValueType() {
return valueType;
}
public void setValueType(int valueType) {
this.valueType = valueType;
}
public byte[] getValue() {
return value;
}
public void setValue(byte[] value) {
this.value = value;
}
public int writeValue(byte[] buf, int offset) {
// long timestamp; // required 8
// long duration; // optional 8
// String key; // required 4+string.length
// int valueTypeCode; // required 4
// ByteBuffer value; // optional 4 + buf.length
Buffer buffer = new Buffer(buf, offset);
buffer.put(this.version);
buffer.put(this.timestamp);
buffer.put(this.duration);
buffer.putPrefixedBytes(getKeyBytes());
buffer.put(this.valueType);
buffer.putPrefixedBytes(value);
return buffer.getOffset();
}
public int getBufferSize() {
// long timestamp; // required 8
// long duration; // optional 8
// String key; // required 4+string.length
// int valueTypeCode; // required 4
// ByteBuffer value; // optional 4 + buf.length
int size = 0;
size += 1 + 8 + 8 + 4 + 4 + 4;
size += this.getKeyBytes().length;
if (this.getValue() != null) {
size += this.getValue().length;
}
return size;
}
public int readValue(byte[] buf, int offset) {
Buffer buffer = new Buffer(buf, offset);
this.version = buffer.readByte();
this.timestamp = buffer.readLong();
this.duration = buffer.readLong();
this.key = buffer.readPrefixedString();
this.valueType = buffer.readInt();
this.value = buffer.readPrefixedBytes();
return buffer.getOffset();
}
@Override
public String toString() {
return "AnnotationBo{" +
"version=" + version +
", spanId=" + spanId +
", timestamp=" + timestamp +
", key='" + key + '\'' +
", keyBytes=" + keyBytes +
", duration=" + duration +
", valueType=" + valueType +
", value=" + value +
'}';
}
}
@@ -0,0 +1,276 @@
package com.profiler.common.bo;
import com.profiler.common.dto.thrift.Annotation;
import com.profiler.common.dto.thrift.Span;
import com.profiler.common.util.Buffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
*
*/
public class SpanBo {
private static final Charset UTF8 = Charset.forName("UTF-8");
private static final int VERSION_SIZE = 1;
// version 0 = prefix의 사이즈를 int로
// version 1 = prefix의 사이즈를 short로
// version 2 = prefix의 사이즈를 byte 하면 byte eocnding이 좀 줄지 않나?
private byte version = 0;
private String agentId; // required
// private static final int TIMESTAMP = 8;
private long timestamp; // required
// private static final int MOSTTRACEID = 8;
private long mostTraceId; // required
// private static final int LEASTTRACEID = 8;
private long leastTraceId; // required
private String name; // required
private String serviceName; // required
// private static final int SPANID = 8;
private long spanId; // required
private static final int PARENTSPANID = 8;
private long parentSpanId; // optional
private static final int FLAG = 4;
private int flag; // optional
// private List<Annotation> annotations; // required
private String endPoint; // required
private static final int TERMINAL = 1;
private boolean terminal; // required
private List<AnnotationBo> annotationBoList;
public SpanBo(Span span) {
this.agentId = span.getAgentId();
this.timestamp = span.getTimestamp();
this.mostTraceId = span.getMostTraceId();
this.leastTraceId = span.getLeastTraceId();
this.name = span.getName();
this.serviceName = span.getServiceName();
this.spanId = span.getSpanId();
this.parentSpanId = span.getParentSpanId();
this.endPoint = span.getEndPoint();
this.flag = span.getFlag();
this.terminal = span.isTerminal();
setAnnotationList(span.getAnnotations());
}
public SpanBo(long mostTraceId, long timestamp, long leastTraceId, long spanId) {
this.mostTraceId = mostTraceId;
this.timestamp = timestamp;
this.leastTraceId = leastTraceId;
this.spanId = spanId;
}
public SpanBo() {
}
public int getVersion() {
return version & 0xFF;
}
public void setVersion(int version) {
if (version < 0 || version > 255) {
throw new IllegalArgumentException("out of range (0~255)");
}
// range 체크
this.version = (byte) (version & 0xFF);
}
public String getAgentId() {
return agentId;
}
public void setAgentId(String agentId) {
this.agentId = agentId;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public long getMostTraceId() {
return mostTraceId;
}
public void setMostTraceId(long mostTraceId) {
this.mostTraceId = mostTraceId;
}
public long getLeastTraceId() {
return leastTraceId;
}
public void setLeastTraceId(long leastTraceId) {
this.leastTraceId = leastTraceId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
public long getSpanId() {
return spanId;
}
public void setSpanID(long spanId) {
this.spanId = spanId;
}
public long getParentSpanId() {
return parentSpanId;
}
public void setParentSpanId(long parentSpanId) {
this.parentSpanId = parentSpanId;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
public String getEndPoint() {
return endPoint;
}
public void setEndPoint(String endPoint) {
this.endPoint = endPoint;
}
public boolean isTerminal() {
return terminal;
}
public void setTerminal(boolean terminal) {
this.terminal = terminal;
}
public List<AnnotationBo> getAnnotationBoList() {
if (annotationBoList == null) {
return Collections.emptyList();
}
return annotationBoList;
}
public void setAnnotationList(List<Annotation> anoList) {
List<AnnotationBo> boList = new ArrayList<AnnotationBo>(anoList.size());
for (Annotation ano : anoList) {
boList.add(new AnnotationBo(ano));
}
this.annotationBoList = boList;
}
public void setAnnotationBoList(List<AnnotationBo> anoList) {
// List<AnnotationBo> boList = new ArrayList<AnnotationBo>(anoList.size());
// for(Annotation ano : anoList) {
// boList.add(new AnnotationBo(ano));
// }
// this.annotationBoList = boList;
if (anoList == null) {
this.annotationBoList = Collections.emptyList();
} else {
this.annotationBoList = anoList;
}
}
private int getBufferLength(int a, int b, int c, int d) {
int size = a + b + c + d;
size = size + (4 * 4) + VERSION_SIZE; // chunk
// size = size + TIMESTAMP + MOSTTRACEID + LEASTTRACEID + SPANID + PARENTSPANID + FLAG + TERMINAL;
size = size + PARENTSPANID + FLAG + TERMINAL;
return size;
}
public byte[] writeValue() {
byte[] agentIDBytes = agentId.getBytes(UTF8);
byte[] nameBytes = name.getBytes(UTF8);
byte[] serviceNameBytes = serviceName.getBytes(UTF8);
byte[] endPointBytes = endPoint.getBytes(UTF8);
int bufferLength = getBufferLength(agentIDBytes.length, nameBytes.length, serviceNameBytes.length, endPointBytes.length);
Buffer buffer = new Buffer(bufferLength);
buffer.put(version);
buffer.putPrefixedBytes(agentIDBytes);
// buffer.put(timestamp);
// buffer.put(mostTraceID);
// buffer.put(leastTraceID);
buffer.putPrefixedBytes(nameBytes);
buffer.putPrefixedBytes(serviceNameBytes);
// buffer.put(spanID);
buffer.put(parentSpanId);
buffer.put(flag);
buffer.putPrefixedBytes(endPointBytes);
buffer.put(terminal);
return buffer.getBuffer();
}
public int readValue(byte[] bytes, int offset) {
Buffer buffer = new Buffer(bytes, offset);
this.version = buffer.readByte();
this.agentId = buffer.readPrefixedString();
// this.timestamp = buffer.readLong();
// this.mostTraceID = buffer.readLong();
// this.leastTraceID = buffer.readLong();
this.name = buffer.readPrefixedString();
this.serviceName = buffer.readPrefixedString();
// this.spanID = buffer.readLong();
this.parentSpanId = buffer.readLong();
this.flag = buffer.readInt();
this.endPoint = buffer.readPrefixedString();
this.terminal = buffer.readBoolean();
return buffer.getOffset();
}
@Override
public String toString() {
return "SpanBo{" +
"agentId='" + agentId + '\'' +
", timestamp=" + timestamp +
", mostTraceId=" + mostTraceId +
", leastTraceId=" + leastTraceId +
", name='" + name + '\'' +
", serviceName='" + serviceName + '\'' +
", spanID=" + spanId +
", parentSpanId=" + parentSpanId +
", flag=" + flag +
", endPoint='" + endPoint + '\'' +
", terminal=" + terminal +
'}';
}
}
@@ -10,6 +10,7 @@ public class HBaseTables {
public static final String TRACES = "Traces";
public static final byte[] TRACES_CF_SPAN = Bytes.toBytes("Span");
public static final byte[] TRACES_CF_ANNOTATION = Bytes.toBytes("Annotation");
public static final String SERVERS = "Servers";
}
@@ -47,6 +47,8 @@ public interface HbaseOperations2 extends HbaseOperations {
*/
<T> T get(String tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final RowMapper<T> mapper);
<T> T get(String tableName, final Get get, final RowMapper<T> mapper);
<T> List<T> get(String tableName, final List<Get> get, final RowMapper<T> mapper);
@@ -44,11 +44,22 @@ public class HbaseTemplate2 extends HbaseTemplate implements HbaseOperations2 {
}
@Override
public <T> List<T> get(String tableName, final List<Get> get, final RowMapper<T> mapper) {
public <T> T get(String tableName, final Get get, final RowMapper<T> mapper) {
return execute(tableName, new TableCallback<T>() {
@Override
public T doInTable(HTable htable) throws Throwable {
Result result = htable.get(get);
return mapper.mapRow(result, 0);
}
});
}
@Override
public <T> List<T> get(String tableName, final List<Get> gets, final RowMapper<T> mapper) {
return execute(tableName, new TableCallback<List<T>>() {
@Override
public List<T> doInTable(HTable htable) throws Throwable {
Result[] result = htable.get(get);
Result[] result = htable.get(gets);
List<T> list = new ArrayList<T>(result.length);
for (int i = 0; i < result.length; i++) {
T t = mapper.mapRow(result[i], i);
@@ -10,184 +10,184 @@ import java.util.Date;
public class AnnotationTranscoder {
private static final String DEFAULT_CHARSET = "UTF-8";
private static final String DEFAULT_CHARSET = "UTF-8";
static final int SERIALIZED = 1;
static final int SERIALIZED = 1;
// Special flags for specially handled types.
protected static final int SPECIAL_MASK = 0xff00;
static final int SPECIAL_BOOLEAN = (1 << 8);
static final int SPECIAL_INT = (2 << 8);
static final int SPECIAL_LONG = (3 << 8);
static final int SPECIAL_DATE = (4 << 8);
static final int SPECIAL_BYTE = (5 << 8);
static final int SPECIAL_FLOAT = (6 << 8);
static final int SPECIAL_DOUBLE = (7 << 8);
static final int SPECIAL_BYTEARRAY = (8 << 8);
// Special flags for specially handled types.
protected static final int SPECIAL_MASK = 0xff00;
static final int SPECIAL_BOOLEAN = (1 << 8);
static final int SPECIAL_INT = (2 << 8);
static final int SPECIAL_LONG = (3 << 8);
static final int SPECIAL_DATE = (4 << 8);
static final int SPECIAL_BYTE = (5 << 8);
static final int SPECIAL_FLOAT = (6 << 8);
static final int SPECIAL_DOUBLE = (7 << 8);
static final int SPECIAL_BYTEARRAY = (8 << 8);
protected final TranscoderUtils tu = new TranscoderUtils(true);
protected final TranscoderUtils tu = new TranscoderUtils(true);
public static final class Encoded {
public static final class Encoded {
private final int valueType;
private final byte[] bytes;
private final int valueType;
private final byte[] bytes;
public Encoded(int valueType, byte[] bytes) {
this.valueType = valueType;
this.bytes = bytes;
}
public Encoded(int valueType, byte[] bytes) {
this.valueType = valueType;
this.bytes = bytes;
}
public int getValueType() {
return valueType;
}
public int getValueType() {
return valueType;
}
public byte[] getBytes() {
return bytes;
}
}
public byte[] getBytes() {
return bytes;
}
}
public Object decode(int dataType, byte[] data) {
Object rv = null;
public Object decode(int dataType, byte[] data) {
Object rv = null;
int flags = dataType & SPECIAL_MASK;
int flags = dataType & SPECIAL_MASK;
if ((dataType & SERIALIZED) != 0 && data != null) {
rv = deserialize(data);
} else if (flags != 0 && data != null) {
switch (flags) {
case SPECIAL_BOOLEAN:
rv = Boolean.valueOf(tu.decodeBoolean(data));
break;
case SPECIAL_INT:
rv = new Integer(tu.decodeInt(data));
break;
case SPECIAL_LONG:
rv = new Long(tu.decodeLong(data));
break;
case SPECIAL_DATE:
rv = new Date(tu.decodeLong(data));
break;
case SPECIAL_BYTE:
rv = new Byte(tu.decodeByte(data));
break;
case SPECIAL_FLOAT:
rv = new Float(Float.intBitsToFloat(tu.decodeInt(data)));
break;
case SPECIAL_DOUBLE:
rv = new Double(Double.longBitsToDouble(tu.decodeLong(data)));
break;
case SPECIAL_BYTEARRAY:
rv = data;
break;
default:
if ((dataType & SERIALIZED) != 0 && data != null) {
rv = deserialize(data);
} else if (flags != 0 && data != null) {
switch (flags) {
case SPECIAL_BOOLEAN:
rv = Boolean.valueOf(tu.decodeBoolean(data));
break;
case SPECIAL_INT:
rv = new Integer(tu.decodeInt(data));
break;
case SPECIAL_LONG:
rv = new Long(tu.decodeLong(data));
break;
case SPECIAL_DATE:
rv = new Date(tu.decodeLong(data));
break;
case SPECIAL_BYTE:
rv = new Byte(tu.decodeByte(data));
break;
case SPECIAL_FLOAT:
rv = new Float(Float.intBitsToFloat(tu.decodeInt(data)));
break;
case SPECIAL_DOUBLE:
rv = new Double(Double.longBitsToDouble(tu.decodeLong(data)));
break;
case SPECIAL_BYTEARRAY:
rv = data;
break;
default:
// LOG.warn("Undecodeable with flags %x", flags);
}
} else {
rv = decodeString(data);
}
return rv;
}
}
} else {
rv = decodeString(data);
}
return rv;
}
public Encoded encode(Object o) {
byte[] b = null;
int flags = 0;
if (o instanceof String) {
b = encodeString((String) o);
} else if (o instanceof Long) {
b = tu.encodeLong((Long) o);
flags |= SPECIAL_LONG;
} else if (o instanceof Integer) {
b = tu.encodeInt((Integer) o);
flags |= SPECIAL_INT;
} else if (o instanceof Boolean) {
b = tu.encodeBoolean((Boolean) o);
flags |= SPECIAL_BOOLEAN;
} else if (o instanceof Date) {
b = tu.encodeLong(((Date) o).getTime());
flags |= SPECIAL_DATE;
} else if (o instanceof Byte) {
b = tu.encodeByte((Byte) o);
flags |= SPECIAL_BYTE;
} else if (o instanceof Float) {
b = tu.encodeInt(Float.floatToRawIntBits((Float) o));
flags |= SPECIAL_FLOAT;
} else if (o instanceof Double) {
b = tu.encodeLong(Double.doubleToRawLongBits((Double) o));
flags |= SPECIAL_DOUBLE;
} else if (o instanceof byte[]) {
b = (byte[]) o;
flags |= SPECIAL_BYTEARRAY;
} else {
b = serialize(o);
flags |= SERIALIZED;
}
public Encoded encode(Object o) {
byte[] b = null;
int flags = 0;
if (o instanceof String) {
b = encodeString((String) o);
} else if (o instanceof Long) {
b = tu.encodeLong((Long) o);
flags |= SPECIAL_LONG;
} else if (o instanceof Integer) {
b = tu.encodeInt((Integer) o);
flags |= SPECIAL_INT;
} else if (o instanceof Boolean) {
b = tu.encodeBoolean((Boolean) o);
flags |= SPECIAL_BOOLEAN;
} else if (o instanceof Date) {
b = tu.encodeLong(((Date) o).getTime());
flags |= SPECIAL_DATE;
} else if (o instanceof Byte) {
b = tu.encodeByte((Byte) o);
flags |= SPECIAL_BYTE;
} else if (o instanceof Float) {
b = tu.encodeInt(Float.floatToRawIntBits((Float) o));
flags |= SPECIAL_FLOAT;
} else if (o instanceof Double) {
b = tu.encodeLong(Double.doubleToRawLongBits((Double) o));
flags |= SPECIAL_DOUBLE;
} else if (o instanceof byte[]) {
b = (byte[]) o;
flags |= SPECIAL_BYTEARRAY;
} else {
b = serialize(o);
flags |= SERIALIZED;
}
assert b != null;
assert b != null;
return new Encoded(flags, b);
}
return new Encoded(flags, b);
}
protected byte[] serialize(Object o) {
if (o == null) {
throw new NullPointerException("Can't serialize null");
}
byte[] rv = null;
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(bos);
os.writeObject(o);
os.close();
bos.close();
rv = bos.toByteArray();
} catch (IOException e) {
throw new IllegalArgumentException("Non-serializable object, cause=" + e.getMessage(), e);
}
return rv;
}
protected byte[] serialize(Object o) {
if (o == null) {
throw new NullPointerException("Can't serialize null");
}
byte[] rv = null;
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(bos);
os.writeObject(o);
os.close();
bos.close();
rv = bos.toByteArray();
} catch (IOException e) {
throw new IllegalArgumentException("Non-serializable object, cause=" + e.getMessage(), e);
}
return rv;
}
protected Object deserialize(byte[] in) {
Object rv = null;
try {
if (in != null) {
ByteArrayInputStream bis = new ByteArrayInputStream(in);
ObjectInputStream is = new ObjectInputStream(bis);
rv = is.readObject();
is.close();
bis.close();
}
} catch (IOException e) {
protected Object deserialize(byte[] in) {
Object rv = null;
try {
if (in != null) {
ByteArrayInputStream bis = new ByteArrayInputStream(in);
ObjectInputStream is = new ObjectInputStream(bis);
rv = is.readObject();
is.close();
bis.close();
}
} catch (IOException e) {
// LOG.error(e.getMessage(), e);
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException e) {
// LOG.error(e.getMessage(), e);
}
return rv;
}
}
return rv;
}
/**
* Decode the string with the current character set.
*/
protected String decodeString(byte[] data) {
String rv = null;
try {
if (data != null) {
rv = new String(data, DEFAULT_CHARSET);
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return rv;
}
/**
* Decode the string with the current character set.
*/
protected String decodeString(byte[] data) {
String rv = null;
try {
if (data != null) {
rv = new String(data, DEFAULT_CHARSET);
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return rv;
}
/**
* Encode a string into the current character set.
*/
protected byte[] encodeString(String in) {
byte[] rv = null;
try {
rv = in.getBytes(DEFAULT_CHARSET);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return rv;
}
/**
* Encode a string into the current character set.
*/
protected byte[] encodeString(String in) {
byte[] rv = null;
try {
rv = in.getBytes(DEFAULT_CHARSET);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return rv;
}
}
@@ -0,0 +1,138 @@
package com.profiler.common.util;
import java.nio.charset.Charset;
/**
*
*/
public class Buffer {
public static final int BOOLEAN_FALSE = 0;
public static final int BOOLEAN_TRUE = 1;
public static byte[] EMPTY = new byte[0];
private static final Charset UTF8 = Charset.forName("UTF-8");
private byte[] buffer;
private int offset;
public Buffer(int size) {
this.buffer = new byte[size];
this.offset = 0;
}
public Buffer(byte[] buffer) {
if (buffer == null) {
throw new NullPointerException("buffer must not be null");
}
this.buffer = buffer;
this.offset = 0;
}
public Buffer(byte[] buffer, int offset) {
if (buffer == null) {
throw new NullPointerException("buffer must not be null");
}
this.buffer = buffer;
this.offset = offset;
}
public void putPrefixedBytes(byte[] bytes) {
if (bytes == null) {
put(0);
} else {
put(bytes.length);
put(bytes);
}
}
public byte readByte() {
return this.buffer[offset++];
}
public boolean readBoolean() {
byte b = readByte();
if (b == BOOLEAN_FALSE) {
return true;
} else {
return false;
}
}
public int readInt() {
int i = BytesUtils.bytesToInt(buffer, offset);
this.offset = this.offset + 4;
return i;
}
public long readLong() {
long l = BytesUtils.bytesToLong(buffer, offset);
this.offset = this.offset + 8;
return l;
}
public byte[] readPrefixedBytes() {
int size = readInt();
if (size == 0) {
return EMPTY;
}
byte[] b = new byte[size];
System.arraycopy(buffer, offset, b, 0, size);
this.offset = offset + size;
return b;
}
public String readPrefixedString() {
int size = readInt();
if (size == 0) {
return "";
}
String s = new String(buffer, offset, size, UTF8);
this.offset = offset + size;
return s;
}
public void put(byte v) {
this.buffer[offset++] = v;
}
public void put(boolean v) {
if (v) {
this.buffer[offset++] = BOOLEAN_TRUE;
} else {
this.buffer[offset++] = BOOLEAN_FALSE;
}
}
public void put(int v) {
BytesUtils.writeInt(v, buffer, offset);
this.offset = offset + 4;
}
public void put(long v) {
BytesUtils.writeLong(v, buffer, offset);
this.offset = offset + 8;
}
public void put(byte[] v) {
if (v == null) {
throw new NullPointerException("v must not be null");
}
System.arraycopy(v, 0, buffer, offset, v.length);
this.offset = offset + v.length;
}
public byte[] getBuffer() {
return this.buffer;
}
public int getOffset() {
return offset;
}
}
@@ -46,6 +46,22 @@ public class BytesUtils {
return rv;
}
public static int bytesToInt(byte[] buf, int offset) {
if (buf == null) {
throw new NullPointerException("buf must not be null");
}
if (buf.length < offset + 4) {
throw new IllegalArgumentException("buf.length is too small. buf.length:" + buf.length + " offset:" + offset + 4);
}
int v = ((buf[offset] & 0xff) << 24)
| ((buf[offset + 1] & 0xff) << 16)
| ((buf[offset + 2] & 0xff) << 8)
| ((buf[offset + 3] & 0xff));
return v;
}
public static long bytesToFirstLong(byte[] buf) {
if (buf == null) {
throw new NullPointerException("buf must not be null");
@@ -101,6 +117,30 @@ public class BytesUtils {
buf[offset] = (byte) (value);
}
public static void writeShort(short value, byte[] buf, int offset) {
if (buf == null) {
throw new NullPointerException("buf must not be null");
}
if (buf.length < offset + 4) {
throw new IllegalArgumentException("buf.length is too small. buf.length:" + buf.length + " offset:" + offset + 4);
}
buf[offset++] = (byte) (value >> 8);
buf[offset] = (byte) (value);
}
public static void writeInt(int value, byte[] buf, int offset) {
if (buf == null) {
throw new NullPointerException("buf must not be null");
}
if (buf.length < offset + 4) {
throw new IllegalArgumentException("buf.length is too small. buf.length:" + buf.length + " offset:" + offset + 4);
}
buf[offset++] = (byte) (value >> 24);
buf[offset++] = (byte) (value >> 16);
buf[offset++] = (byte) (value >> 8);
buf[offset] = (byte) (value);
}
public static void writeFirstLong(long value, byte[] buf) {
if (buf == null) {
throw new NullPointerException("buf must not be null");
@@ -146,4 +186,6 @@ public class BytesUtils {
writeLong(fostfix, buf, preFix.length);
return buf;
}
}
@@ -1,24 +1,14 @@
package com.profiler.common.util;
import org.apache.commons.lang.ArrayUtils;
import org.apache.hadoop.hbase.util.Bytes;
import com.profiler.common.dto.thrift.Span;
public class SpanUtils {
public static byte[] getTraceIndexRowKey(Span span) {
byte[] agentId = Bytes.toBytes(span.getAgentId());
byte[] time = Bytes.toBytes(span.getTimestamp());
public static byte[] getTraceIndexRowKey(Span span) {
return BytesUtils.add(span.getAgentId(), span.getTimestamp());
}
return ArrayUtils.addAll(agentId, time);
}
public static byte[] getTracesRowkey(Span span) {
public static byte[] getTraceId(Span span) {
return BytesUtils.longLongToBytes(span.getMostTraceId(), span.getLeastTraceId());
}
public static byte[] getTraceId(Span span) {
return BytesUtils.longLongToBytes(span.getMostTraceId(), span.getLeastTraceId());
}
}
}
@@ -0,0 +1,38 @@
package com.profiler.common.bo;
import org.junit.Assert;
import org.junit.Test;
/**
*
*/
public class AnnotationBoTest {
@Test
public void testGetVersion() throws Exception {
}
@Test
public void testSetVersion() throws Exception {
}
@Test
public void testWriteValue() throws Exception {
AnnotationBo bo = new AnnotationBo();
bo.setKey("test");
bo.setValue("value".getBytes("UTF-8"));
int bufferSize = bo.getBufferSize();
byte[] bytes = new byte[bufferSize];
bo.writeValue(bytes, 0);
AnnotationBo bo2 = new AnnotationBo();
bo2.readValue(bytes, 0);
Assert.assertEquals(bo.getKey(), bo2.getKey());
Assert.assertEquals(bo.getDuration(), bo2.getDuration());
Assert.assertEquals(bo.getTimestamp(), bo2.getTimestamp());
Assert.assertEquals(bo.getValueType(), bo2.getValueType());
Assert.assertArrayEquals(bo.getValue(), bo2.getValue());
}
}
@@ -0,0 +1,55 @@
package com.profiler.common.bo;
import com.profiler.common.bo.SpanBo;
import junit.framework.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*/
public class SpanBoTest {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
public void testVersion() {
SpanBo spanBo = new SpanBo();
check(spanBo, 0);
check(spanBo, 254);
check(spanBo, 255);
try {
check(spanBo, 256);
Assert.fail();
} catch (Exception e) {
}
}
private void check(SpanBo spanBo, int v) {
spanBo.setVersion(v);
int version = spanBo.getVersion();
Assert.assertEquals(v, version);
}
@Test
public void serialize() {
SpanBo spanBo = new SpanBo();
spanBo.setAgentId("agent");
spanBo.setEndPoint("end");
spanBo.setName("name");
spanBo.setServiceName("serviceName");
byte[] bytes = spanBo.writeValue();
logger.debug("length:{}", bytes.length);
SpanBo newSpanBo = new SpanBo();
int i = newSpanBo.readValue(bytes, 0);
logger.debug("length:{}", i);
Assert.assertEquals(bytes.length, i);
}
}
@@ -18,6 +18,21 @@ public class BytesUtilsTest {
test(uuid.getMostSignificantBits(), uuid.getLeastSignificantBits());
}
@Test
public void testInt() {
int i = Integer.MAX_VALUE - 5;
checkInt(i);
checkInt(23464);
}
private void checkInt(int i) {
byte[] bytes = Bytes.toBytes(i);
int i2 = BytesUtils.bytesToInt(bytes, 0);
Assert.assertEquals(i, i2);
int i3 = Bytes.toInt(bytes);
Assert.assertEquals(i, i3);
}
private void test(long most, long least) {
byte[] bytes1 = Bytes.toBytes(most);
byte[] bytes2 = Bytes.toBytes(least);