图片的资源:
https://download.csdn.net/download/qq_37822914/12466664
资源参考:
https://www.jianshu.com/p/f230377c64d4
https://aidodoo.com/post/others/pinpoint数据结构/
https://aidodoo.com/post/others/pinpoint数据结构/ 中的内容为:
本文主要基于源码整理pinpoint的hbase的表结构,以便于作为参考,二次开发或者定义我们自己的架构数据结构。
AgentInfo
用途
主键
总共32字节,前24字节为agentId,后8字节为Long.MAX_VALUE-time
byte[] agentId = Bytes.toBytes(agentInfo.getAgentId());
long reverseKey = TimeUtils.reverseTimeMillis(agentInfo.getStartTimestamp());
byte[] rowKey = RowKeyUtils.concatFixedByteAndLong(agentId, HBaseTables.AGENT_NAME_MAX_LEN, reverseKey);
列簇和列
列簇:Info
public static final byte[] AGENTINFO_CF_INFO = Bytes.toBytes(“Info”);
列:i
public static final byte[] AGENTINFO_CF_INFO_IDENTIFIER = Bytes.toBytes(“i”);
可能包含的信息如下:
i hostName
ip
ports
agentId
applicationName
serviceTypeCode
pid
vmVersion
agentVersion
startTime
endTimeStamp
endStatus
serverMetaData
jvmInfo
列:m
public static final byte[] AGENTINFO_CF_INFO_SERVER_META_DATA = Bytes.toBytes(“m”);
可能包含的信息如下:
m serverInfo
vmArgs
serviceInfos
列:j
public static final byte[] AGENTINFO_CF_INFO_JVM = Bytes.toBytes(“j”);
可能包含的信息如下:
j version
jvmVersion
gcTypeName
AgentStatV2
用途
主键
前24字节为agentId,后8字节为Long.MAX_VALUE-time,中间的为AgentStatType,其中AgentStatType取值如下:
UNKNOWN(0, “Unknown”),
JVM_GC(1, “JVM GC”),
JVM_GC_DETAILED(2, “JVM GC Detailed”),
CPU_LOAD(3, “Cpu Usage”),
TRANSACTION((byte) 4, “Transaction”),
ACTIVE_TRACE((byte) 5, “Active Trace”),
DATASOURCE((byte) 6, “DataSource”),
RESPONSE_TIME((byte) 7, “Response Time”),
DEADLOCK((byte) 8, “Deadlock”);
key构建代码如下:
byte[] bAgentId = BytesUtils.toBytes(component.getAgentId());
byte[] bStatType = new byte[]{component.getAgentStatType().getRawTypeCode()};
byte[] rowKey = new byte[AGENT_NAME_MAX_LEN + bStatType.length + BytesUtils.LONG_BYTE_LENGTH];
BytesUtils.writeBytes(rowKey, 0, bAgentId);
BytesUtils.writeBytes(rowKey, AGENT_NAME_MAX_LEN, bStatType);
BytesUtils.writeLong(TimeUtils.reverseTimeMillis(component.getBaseTimestamp()), rowKey, AGENT_NAME_MAX_LEN + bStatType.length);
该key构建完成后,看源码又通过com.sematext.hbase.wd.AbstractRowKeyDistributor进行一次离散化。
byte[] distributedRowKey = this.rowKeyDistributor.getDistributedKey(rowKey);
AbstractRowKeyDistributor在hbasewd中原生主要有RowKeyDistributorByOneBytePrefix和RowKeyDistributorByHashPrefix两个实现,主要是在rowkey前面再添加hashkey以实现离散化,具体的可以去研究,基本原理可参考通过顺序RowKey避免HBase RegionServer热点问题
列簇和列
表AgentStatV2能写入的信息比较多,主要是JVM、CPU等统计信息。
其中HbaseActiveTraceDao、HbaseCpuLoadDao、HbaseDataSourceListDao、HbaseJvmGcDao、HbaseJvmGcDetailedDao、HbaseResponseTimeDao、HbaseTransactionDao均实现了AgentStatDaoV2接口中定义的insert方法。
以HbaseCpuLoadDao为例,其实现AgentStatDaoV2,含有如下四个成员变量,主要用于序列化和rowkey构建和数据插入到hbase
private HbaseOperations2 hbaseTemplate;
private TableNameProvider tableNameProvider;
private AgentStatHbaseOperationFactory agentStatHbaseOperationFactory;
private CpuLoadSerializer cpuLoadSerializer;
接口AgentStatDaoV2定义如下:
public interface AgentStatDaoV2 {
void insert(String agentId, List agentStatDataPoints);
}
而AgentStatDataPoint的实现类如下:
进而能写入所有实现了AgentStatDataPoint接口的类的数据。
列簇名均为S
public static final byte[] AGENT_STAT_CF_STATISTICS = Bytes.toBytes(“S”)
具体内容因AgentStatDataPoint的实现类不同,列举如下:
写入ActiveTraceBo信息时,可选项
private String agentId;
private long startTimestamp;
private long timestamp;
private short version = 0;
private int histogramSchemaType;
private ActiveTraceHistogram activeTraceHistogram;
写入CpuLoadBo信息时,可选项
private String agentId;
private long startTimestamp;
private long timestamp;
private double jvmCpuLoad = UNCOLLECTED_VALUE;
private double systemCpuLoad = UNCOLLECTED_VALUE;
写入DataSourceBo信息时,可选项
private String agentId;
private long startTimestamp;
private long timestamp;
private int id = UNCOLLECTED_INT_VALUE;
private short serviceTypeCode = UNCOLLECTED_SERVICE_TYPE_VALUE.getCode();
private String databaseName = UNCOLLECTED_STRING_VALUE;
private String jdbcUrl = UNCOLLECTED_STRING_VALUE;
private int activeConnectionSize = UNCOLLECTED_INT_VALUE;
private int maxConnectionSize = UNCOLLECTED_INT_VALUE;
写入DeadlockBo信息时,可选项
private String agentId;
private long startTimestamp;
private long timestamp;
private int deadlockedThreadCount = UNCOLLECTED_INT_VALUE;
private List threadDumpList;
写入JvmGcBo信息时,可选项
private String agentId;
private long startTimestamp;
private long timestamp;
private JvmGcType gcType = JvmGcType.UNKNOWN;
private long heapUsed = UNCOLLECTED_VALUE;
private long heapMax = UNCOLLECTED_VALUE;
private long nonHeapUsed = UNCOLLECTED_VALUE;
private long nonHeapMax = UNCOLLECTED_VALUE;
private long gcOldCount = UNCOLLECTED_VALUE;
private long gcOldTime = UNCOLLECTED_VALUE
写入JvmGcDetailedBo信息时,可选项
private String agentId;
private long startTimestamp;
private long timestamp;
private long gcNewCount = UNCOLLECTED_VALUE;
private long gcNewTime = UNCOLLECTED_VALUE;
private double codeCacheUsed = UNCOLLECTED_PERCENTAGE;
private double newGenUsed = UNCOLLECTED_PERCENTAGE;
private double oldGenUsed = UNCOLLECTED_PERCENTAGE;
private double survivorSpaceUsed = UNCOLLECTED_PERCENTAGE;
private double permGenUsed = UNCOLLECTED_PERCENTAGE;
private double metaspaceUsed = UNCOLLECTED_PERCENTAGE
写入ResponseTimeBo信息时,可选项
private String agentId;
private long startTimestamp;
private long timestamp;
private long avg = 0;
private long max = 0;
写入TransactionBo信息时,可选项
private String agentId;
private long startTimestamp;
private long timestamp;
private long collectInterval = UNCOLLECTED_VALUE;
private long sampledNewCount = UNCOLLECTED_VALUE;
private long sampledContinuationCount = UNCOLLECTED_VALUE;
private long unsampledNewCount = UNCOLLECTED_VALUE;
private long unsampledContinuationCount = UNCOLLECTED_VALUE;
ApplicationStatAggre
用途
主键
applicationId+statType+baseTimestamp
具体构建如下:
byte[] bApplicationId = BytesUtils.toBytes(component.getApplicationId());
byte[] bStatType = new byte[]{component.getStatType().getRawTypeCode()};
byte[] rowKey = new byte[APPLICATION_NAME_MAX_LEN + bStatType.length + BytesUtils.LONG_BYTE_LENGTH];
BytesUtils.writeBytes(rowKey, 0, bApplicationId);
BytesUtils.writeBytes(rowKey, APPLICATION_NAME_MAX_LEN, bStatType);
BytesUtils.writeLong(TimeUtils.reverseTimeMillis(component.getBaseTimestamp()), rowKey, APPLICATION_NAME_MAX_LEN + bStatType.length);
列簇
public static final byte[] APPLICATION_STAT_CF_STATISTICS = Bytes.toBytes(“S”);
ApplicationStatAggre能写入实现JoinStatBo接口的类的信息,其实现主要位于com.navercorp.pinpoint.common.server.bo.stat.join包,如下:
写入JoinActiveTraceBo信息时,可选项
private String id = UNKNOWN_ID;
private long timestamp = Long.MIN_VALUE;
private int histogramSchemaType = DEFAULT_HISTOGRAM_SCHEMA_TYPE;
private short version = DEFAULT_VERSION;
private int totalCount = UNCOLLECTED_VALUE;
private String maxTotalCountAgentId = UNKNOWN_AGENT;
private int maxTotalCount = UNCOLLECTED_VALUE;
private String minTotalCountAgentId = UNKNOWN_AGENT;
private int minTotalCount = UNCOLLECTED_VALUE;
写入JoinCpuLoadBo信息时,可选项
private String id = UNKNOWN_ID;
private long timestamp = Long.MIN_VALUE;
private double jvmCpuLoad = UNCOLLECTED_VALUE;
private String maxJvmCpuAgentId = UNKNOWN_AGENT;
private double maxJvmCpuLoad = UNCOLLECTED_VALUE;
private String minJvmCpuAgentId = UNKNOWN_AGENT;
private double minJvmCpuLoad = UNCOLLECTED_VALUE;
private double systemCpuLoad = UNCOLLECTED_VALUE;
private String maxSysCpuAgentId = UNKNOWN_AGENT;
private double maxSystemCpuLoad = UNCOLLECTED_VALUE;
private String minSysCpuAgentId = UNKNOWN_AGENT;
private double minSystemCpuLoad = UNCOLLECTED_VALUE;
写入JoinDataSourceBo信息时,可选项
private short serviceTypeCode = UNDEFINED_CATEGORY;
private String url = EMPTY_URL;
private int avgActiveConnectionSize = UNCOLLECTED_VALUE;
private int minActiveConnectionSize = UNCOLLECTED_VALUE;
private String minActiveConnectionAgentId = UNKNOWN_AGENT;
private int maxActiveConnectionSize = UNCOLLECTED_VALUE;
private String maxActiveConnectionAgentId = UNKNOWN_AGENT;
写入JoinMemoryBo信息时,可选项
private String id = UNKNOWN_ID;
private long timestamp = Long.MIN_VALUE;
private long heapUsed = UNCOLLECTED_VALUE;
private long minHeapUsed = UNCOLLECTED_VALUE;
private long maxHeapUsed = UNCOLLECTED_VALUE;
private String minHeapAgentId = UNKNOWN_AGENT;
private String maxHeapAgentId = UNKNOWN_AGENT;
private long nonHeapUsed = UNCOLLECTED_VALUE;
private long minNonHeapUsed = UNCOLLECTED_VALUE;
private long maxNonHeapUsed = UNCOLLECTED_VALUE;
private String minNonHeapAgentId = UNKNOWN_AGENT;
private String maxNonHeapAgentId = UNKNOWN_AGENT;
写入JoinResponseTimeBo信息时,可选项
private String id = UNKNOWN_ID;
private long timestamp = Long.MIN_VALUE;
private long avg = UNCOLLECTED_VALUE;
private String maxAvgAgentId = UNKNOWN_AGENT;
private long maxAvg = UNCOLLECTED_VALUE;
private String minAvgAgentId = UNKNOWN_AGENT;
private long minAvg = UNCOLLECTED_VALUE;
写入JoinTransactionBo信息时,可选项
private String id = UNKNOWN_ID;
private long collectInterval = UNCOLLECTED_VALUE;
private long totalCount = UNCOLLECTED_VALUE;
private String maxTotalCountAgentId = UNKNOWN_AGENT;
private long maxTotalCount = UNCOLLECTED_VALUE;
private String minTotalCountAgentId = UNKNOWN_AGENT;
private long minTotalCount = UNCOLLECTED_VALUE;
private long timestamp = Long.MIN_VALUE;
ApplicationIndex
用途
主键
ApplicationName
列簇
public static final byte[] APPLICATION_INDEX_CF_AGENTS = Bytes.toBytes(“Agents”);
列
agentId 内容为ServiceType,具体代码
Put put = new Put(Bytes.toBytes(agentInfo.getApplicationName()));
byte[] qualifier = Bytes.toBytes(agentInfo.getAgentId());
byte[] value = Bytes.toBytes(agentInfo.getServiceType());
put.addColumn(APPLICATION_INDEX_CF_AGENTS, qualifier, value);
AgentLifeCycle
用途
主键
agentId+reverseTime+reverseEventCounter
具体代码:
byte[] agentIdKey = Bytes.toBytes(agentId);
long reverseStartTimestamp = TimeUtils.reverseTimeMillis(startTimestamp);
long reverseEventCounter = TimeUtils.reverseTimeMillis(eventIdentifier);
byte[] rowKey = new byte[HBaseTables.AGENT_NAME_MAX_LEN + BytesUtils.LONG_BYTE_LENGTH + BytesUtils.LONG_BYTE_LENGTH];
BytesUtils.writeBytes(rowKey, 0, agentIdKey);
int offset = HBaseTables.AGENT_NAME_MAX_LEN;
BytesUtils.writeLong(reverseStartTimestamp, rowKey, offset);
offset += BytesUtils.LONG_BYTE_LENGTH;
BytesUtils.writeLong(reverseEventCounter, rowKey, offset);
列簇
public static final byte[] AGENT_LIFECYCLE_CF_STATUS = Bytes.toBytes(“S”);
列
public static final byte[] AGENT_LIFECYCLE_CF_STATUS_QUALI_STATES = Bytes.toBytes(“states”);
具体内容为AgentLifeCycleBo,可选项
private final byte version;
private final String agentId;
private final long startTimestamp;
private final long eventTimestamp;
private final long eventIdentifier;
private final AgentLifeCycleState agentLifeCycleState;
AgentEvent
用途
主键
agentId+reverseTime 具体构建代码:
byte[] agentIdKey = BytesUtils.toBytes(agentId);
long reverseStartTimestamp = TimeUtils.reverseTimeMillis(eventTimestamp);
return RowKeyUtils.concatFixedByteAndLong(agentIdKey, HBaseTables.AGENT_NAME_MAX_LEN, reverseStartTimestamp);
列簇
public static final byte[] AGENT_EVENT_CF_EVENTS = Bytes.toBytes(“E”)
列
列主要是agent的事件类型AgentEventType,可选项:
AGENT_CONNECTED(10100, “Agent connected”, Void.class, DURATIONAL, AGENT_LIFECYCLE),
AGENT_PING(10199, “Agent ping”, Void.class, AGENT_LIFECYCLE),
AGENT_SHUTDOWN(10200, “Agent shutdown”, Void.class, DURATIONAL, AGENT_LIFECYCLE),
AGENT_UNEXPECTED_SHUTDOWN(10201, “Agent unexpected shutdown”, Void.class, DURATIONAL, AGENT_LIFECYCLE),
AGENT_CLOSED_BY_SERVER(10300, “Agent connection closed by server”, Void.class, DURATIONAL, AGENT_LIFECYCLE),
AGENT_UNEXPECTED_CLOSE_BY_SERVER(10301, “Agent connection unexpectedly closed by server”, Void.class, DURATIONAL, AGENT_LIFECYCLE),
AGENT_DEADLOCK_DETECTED(10401, “Agent deadlock detected”, TDeadlock.class, AGENT_LIFECYCLE),
USER_THREAD_DUMP(20100, “Thread dump by user”, TCommandThreadDumpResponse.class, USER_REQUEST, THREAD_DUMP),
OTHER(-1, “Other event”, String.class, AgentEventTypeCategory.OTHER);
内容主要是AgentEventBo,可选项
private final byte version;
private final String agentId;
private final long startTimestamp;
private final long eventTimestamp;
private final AgentEventType eventType;
private byte[] eventBody;
StringMetaData
用途
主键
agentId+startTime+stringId
具体代码
final byte[] buffer = new byte[AGENT_NAME_MAX_LEN + LONG_BYTE_LENGTH + INT_BYTE_LENGTH];
BytesUtils.writeBytes(buffer, 0, agentBytes)
long reverseCurrentTimeMillis = TimeUtils.reverseTimeMillis(agentStartTime);
BytesUtils.writeLong(reverseCurrentTimeMillis, buffer, AGENT_NAME_MAX_LEN);
BytesUtils.writeInt(keyCode, buffer, AGENT_NAME_MAX_LEN + LONG_BYTE_LENGTH);
组合完后还需要在前面添加前缀
final byte[] rowKey = getDistributedKey(stringMetaDataBo.toRowKey());
private byte[] getDistributedKey(byte[] rowKey) {
return rowKeyDistributorByHashPrefix.getDistributedKey(rowKey);
}
列簇
public static final byte[] STRING_METADATA_CF_STR = Bytes.toBytes(“Str”)
列
private java.lang.String agentId; // required
private long agentStartTime; // required
private int stringId; // required
private java.lang.String stringValue; // required
ApiMetaData
用途
主键
AgentId+AgentStartTime+ApiId
组合完后还需要在前面添加前缀
final byte[] rowKey = getDistributedKey(stringMetaDataBo.toRowKey());
private byte[] getDistributedKey(byte[] rowKey) {
return rowKeyDistributorByHashPrefix.getDistributedKey(rowKey);
}
列簇
public static final byte[] API_METADATA_CF_API = Bytes.toBytes(“Api”);
列
public static final byte[] API_METADATA_CF_API_QUALI_SIGNATURE = Bytes.toBytes(“P_api_signature”);
内容:
private java.lang.String agentId; // required
private long agentStartTime; // required
private int apiId; // required
private java.lang.String apiInfo; // required
private int line; // optional
private int type; // optional
SqlMetaData_Ver2
用途
主键
AgentId+AgentStartTime+SqlId
组合完后还需要在前面添加前缀
final byte[] rowKey = getDistributedKey(sqlMetaDataBo.toRowKey());
private byte[] getDistributedKey(byte[] rowKey) {
return rowKeyDistributorByHashPrefix.getDistributedKey(rowKey);
}
列簇
public static final byte[] SQL_METADATA_VER2_CF_SQL = Bytes.toBytes(“Sql”);
列
public static final byte[] SQL_METADATA_VER2_CF_SQL_QUALI_SQLSTATEMENT = Bytes.toBytes(“P_sql_statement”);
内容:
private java.lang.String agentId; // required
private long agentStartTime; // required
private int sqlId; // required
private java.lang.String sql; // required
TraceV2
用途
主键
AgentId+AgentStartTime+TransactionSequence
组合完后还需要在前面添加前缀
final byte[] rowKey = getDistributedKey(stringMetaDataBo.toRowKey());
private byte[] getDistributedKey(byte[] rowKey) {
return rowKeyDistributorByHashPrefix.getDistributedKey(rowKey);
}
return wrapDistributedRowKey(rowKey);
private byte[] wrapDistributedRowKey(byte[] rowKey) {
return rowKeyDistributor.getDistributedKey(rowKey);
}
列簇
public static final byte[] TRACE_V2_CF_SPAN = Bytes.toBytes(“S”); //Span
列
列名的构造代码如下:
private ByteBuffer encodeQualifier(byte type, String applicationId, String agentId, long agentStartTime, long spanId, SpanEventBo firstEvent) {
final Buffer buffer = new AutomaticBuffer(128);
buffer.putByte(type);
buffer.putPrefixedString(applicationId);
buffer.putPrefixedString(agentId);
buffer.putVLong(agentStartTime);
buffer.putLong(spanId);
if (firstEvent != null) {
buffer.putSVInt(firstEvent.getSequence());
final byte bitField = SpanEventQualifierBitField.buildBitField(firstEvent);
buffer.putByte(bitField);
// case : async span
if (SpanEventQualifierBitField.isSetAsync(bitField)) {
buffer.putInt(firstEvent.getAsyncId());
buffer.putVInt(firstEvent.getAsyncSequence());
}
} else {
// simple trace case
// buffer.putSVInt((short) -1);
// byte cfBitField = SpanEventQualifierBitField.setAsync((byte) 0, false);
// buffer.putByte(cfBitField);
}
return buffer.wrapByteBuffer();
}
列的内容如下,主要由SpanBo构造而成
public ByteBuffer encodeSpanColumnValue(SpanEncodingContext encodingContext) {
final SpanBo span = encodingContext.getValue();
final SpanBitFiled bitField = SpanBitFiled.build(span);
final Buffer buffer = new AutomaticBuffer(256);
final byte version = span.getRawVersion();
buffer.putByte(version);
// bit field
buffer.putByte(bitField.getBitField());
final short serviceType = span.getServiceType();
buffer.putShort(serviceType);
switch (bitField.getApplicationServiceTypeEncodingStrategy()) {
case PREV_EQUALS:
break;
case RAW:
buffer.putShort(span.getApplicationServiceType());
break;
default:
throw new IllegalStateException("applicationServiceType");
}
// insert for rowkey
// buffer.put(spanID);
if (!bitField.isRoot()) {
buffer.putLong(span.getParentSpanId());
}
// prevSpanEvent coding
final long startTime = span.getStartTime();
final long startTimeDelta = span.getCollectorAcceptTime() - startTime;
buffer.putVLong(startTimeDelta);
buffer.putVInt(span.getElapsed());
buffer.putPrefixedString(span.getRpc());
buffer.putPrefixedString(span.getEndPoint());
buffer.putPrefixedString(span.getRemoteAddr());
buffer.putSVInt(span.getApiId());
// BIT flag
if (bitField.isSetErrorCode()) {
buffer.putInt(span.getErrCode());
}
if (bitField.isSetHasException()) {
buffer.putSVInt(span.getExceptionId());
buffer.putPrefixedString(span.getExceptionMessage());
}
if (bitField.isSetFlag()) {
buffer.putShort(span.getFlag());
}
if (bitField.isSetLoggingTransactionInfo()) {
buffer.putByte(span.getLoggingTransactionInfo());
}
buffer.putPrefixedString(span.getAcceptorHost());
if (bitField.isSetAnnotation()) {
List<AnnotationBo> annotationBoList = span.getAnnotationBoList();
writeAnnotationList(buffer, annotationBoList, encodingContext);
}
final List<SpanEventBo> spanEventBoList = span.getSpanEventBoList();
writeSpanEventList(buffer, spanEventBoList, encodingContext);
return buffer.wrapByteBuffer();
}
ApplicationTraceIndex
用途
主键
applicationName+acceptedTime
代码如下:
public static byte[] getApplicationTraceIndexRowKey(String applicationName, long timestamp) {
if (applicationName == null) {
throw new IllegalArgumentException(“agentId must not null”);
}
final byte[] bApplicationName = BytesUtils.toBytes(applicationName);
return RowKeyUtils.concatFixedByteAndLong(bApplicationName, AGENT_NAME_MAX_LEN, TimeUtils.reverseTimeMillis(timestamp));
}
列簇
public static final byte[] APPLICATION_TRACE_INDEX_CF_TRACE = Bytes.toBytes(“I”);
列
列名主要通过getVarTransactionId生成:
public static byte[] getVarTransactionId(TSpan span) {
if (span == null) {
throw new NullPointerException(“span must not be null”);
}
final byte[] transactionIdBytes = span.getTransactionId();
TransactionId transactionId = TransactionIdUtils.parseTransactionId(transactionIdBytes);
String agentId = transactionId.getAgentId();
if (agentId == null) {
agentId = span.getAgentId();
}
final Buffer buffer= new AutomaticBuffer(32);
buffer.putPrefixedString(agentId);
buffer.putSVLong(transactionId.getAgentStartTime());
buffer.putVLong(transactionId.getTransactionSequence());
return buffer.getBuffer();
}
内容如下:
final Buffer buffer = new AutomaticBuffer(10 + AGENT_NAME_MAX_LEN);
buffer.putVInt(span.getElapsed());
buffer.putSVInt(span.getErr());
buffer.putPrefixedString(span.getAgentId());
final byte[] value = buffer.getBuffer();
ApplicationMapStatisticsCaller_Ver2
用途
主键
“APPLICATIONNAME(max 24bytes)” + apptype(2byte) + “TIMESTAMP(8byte)” 代码如下:
public static byte[] makeRowKey(String applicationName, short applicationType, long timestamp) {
if (applicationName == null) {
throw new NullPointerException(“applicationName must not be null”);
}
final byte[] applicationNameBytes= BytesUtils.toBytes(applicationName);
final Buffer buffer = new AutomaticBuffer(2 + applicationNameBytes.length + 2 + 8);
buffer.putShort((short)applicationNameBytes.length);
buffer.putBytes(applicationNameBytes);
buffer.putShort(applicationType);
long reverseTimeMillis = TimeUtils.reverseTimeMillis(timestamp);
buffer.putLong(reverseTimeMillis);
return buffer.getBuffer();
}
列簇
public static final byte[] MAP_STATISTICS_CALLER_VER2_CF_COUNTER = Bytes.toBytes(“C”);
列
列名如下
public static byte[] makeColumnName(short serviceType, String applicationName, String destHost, short slotNumber) {
if (applicationName == null) {
throw new NullPointerException(“applicationName must not be null”);
}
if (destHost == null) {
// throw new NullPointerException(“destHost must not be null”);
destHost = “”;
}
// approximate size of destHost
final Buffer buffer = new AutomaticBuffer(BytesUtils.SHORT_BYTE_LENGTH + PinpointConstants.APPLICATION_NAME_MAX_LEN + destHost.length() + BytesUtils.SHORT_BYTE_LENGTH);
buffer.putShort(serviceType);
buffer.putShort(slotNumber);
buffer.put2PrefixedString(applicationName);
buffer.putBytes(BytesUtils.toBytes(destHost));
return buffer.getBuffer();
}
主要是统计,内容是数字信息。
ApplicationMapStatisticsCallee_Ver2
用途
主键
“APPLICATIONNAME(max 24bytes)” + apptype(2byte) + “TIMESTAMP(8byte)” 代码如下:
public static byte[] makeRowKey(String applicationName, short applicationType, long timestamp) {
if (applicationName == null) {
throw new NullPointerException(“applicationName must not be null”);
}
final byte[] applicationNameBytes= BytesUtils.toBytes(applicationName);
final Buffer buffer = new AutomaticBuffer(2 + applicationNameBytes.length + 2 + 8);
buffer.putShort((short)applicationNameBytes.length);
buffer.putBytes(applicationNameBytes);
buffer.putShort(applicationType);
long reverseTimeMillis = TimeUtils.reverseTimeMillis(timestamp);
buffer.putLong(reverseTimeMillis);
return buffer.getBuffer();
}
列簇
public static final byte[] MAP_STATISTICS_CALLER_VER2_CF_COUNTER = Bytes.toBytes(“C”);
列
列名如下
public static byte[] makeColumnName(short serviceType, String applicationName, String destHost, short slotNumber) {
if (applicationName == null) {
throw new NullPointerException(“applicationName must not be null”);
}
if (destHost == null) {
// throw new NullPointerException(“destHost must not be null”);
destHost = “”;
}
// approximate size of destHost
final Buffer buffer = new AutomaticBuffer(BytesUtils.SHORT_BYTE_LENGTH + PinpointConstants.APPLICATION_NAME_MAX_LEN + destHost.length() + BytesUtils.SHORT_BYTE_LENGTH);
buffer.putShort(serviceType);
buffer.putShort(slotNumber);
buffer.put2PrefixedString(applicationName);
buffer.putBytes(BytesUtils.toBytes(destHost));
return buffer.getBuffer();
}
主要是统计,内容是数字信息。
HostApplicationMap_Ver2
用途
主键
parentApplicationName+parentServiceType+statisticsRowSlot+parentAgentId 构建方式:
byte[] createRowKey0(String parentApplicationName, short parentServiceType, long statisticsRowSlot, String parentAgentId) {
final int SIZE = HBaseTables.APPLICATION_NAME_MAX_LEN + 2 + 8;
final Buffer rowKeyBuffer = new AutomaticBuffer(SIZE);
rowKeyBuffer.putPadString(parentApplicationName, HBaseTables.APPLICATION_NAME_MAX_LEN);
rowKeyBuffer.putShort(parentServiceType);
rowKeyBuffer.putLong(TimeUtils.reverseTimeMillis(statisticsRowSlot));
return rowKeyBuffer.getBuffer();
}
列簇
public static final byte[] HOST_APPLICATION_MAP_VER2_CF_MAP = Bytes.toBytes(“M”);
#列 列名
private byte[] createColumnName(String host, String bindApplicationName, short bindServiceType) {
Buffer buffer = new AutomaticBuffer();
buffer.putPrefixedString(host);
buffer.putPrefixedString(bindApplicationName);
buffer.putShort(bindServiceType);
return buffer.getBuffer();
}