package com.navercorp.pinpoint.common.server.bo;
import com.navercorp.pinpoint.common.util.TransactionIdUtils;
import com.navercorp.pinpoint.thrift.dto.TAnnotation;
import com.navercorp.pinpoint.thrift.dto.TAnnotationValue;
import com.navercorp.pinpoint.thrift.dto.TIntStringValue;
import com.navercorp.pinpoint.thrift.dto.TSpan;
import com.navercorp.pinpoint.thrift.dto.TSpanChunk;
import com.navercorp.pinpoint.thrift.dto.TSpanEvent;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.RandomUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* @author Woonduk Kang(emeroad)
*/
public class RandomTSpan {
private final Random random = new Random();
public TSpan randomTSpan() {
final TSpan tSpan = new TSpan();
tSpan.setAgentId("agentId");
tSpan.setApplicationName("appName");
tSpan.setAgentStartTime(System.currentTimeMillis());
tSpan.setTransactionId(TransactionIdUtils.formatByteBuffer("agent", System.currentTimeMillis(), RandomUtils.nextLong(0, Long.MAX_VALUE)));
tSpan.setSpanId(random.nextLong());
tSpan.setParentSpanId(RandomUtils.nextInt(0, 100000));
tSpan.setStartTime(System.currentTimeMillis() + RandomUtils.nextInt(0, 1000));
tSpan.setElapsed(RandomUtils.nextInt(0, 2000));
tSpan.setRpc(RandomStringUtils.random(10));
tSpan.setServiceType(randomServerServiceType());
tSpan.setEndPoint(RandomStringUtils.random(20));
tSpan.setRemoteAddr(RandomStringUtils.random(20));
List<TAnnotation> tAnnotationList = randomTAnnotationList();
if (CollectionUtils.isNotEmpty(tAnnotationList)) {
tSpan.setAnnotations(tAnnotationList);
}
tSpan.setFlag((short) RandomUtils.nextInt(0, 4));
tSpan.setErr((short) RandomUtils.nextInt(0, 2));
// tSpan.setSpanEventList()
tSpan.setParentApplicationName("parentApp");
tSpan.setParentApplicationType(randomServerServiceType());
tSpan.setAcceptorHost("acceptHost");
tSpan.setApiId(RandomUtils.nextInt(0, 5000));
if (random.nextBoolean()) {
tSpan.setApplicationServiceType(randomServerServiceType());
} else {
tSpan.setApplicationServiceType(tSpan.getServiceType());
}
if (random.nextBoolean()) {
TIntStringValue exceptionInfo = new TIntStringValue();
exceptionInfo.setIntValue(RandomUtils.nextInt(0, 5000));
exceptionInfo.setStringValue(RandomStringUtils.random(100));
tSpan.setExceptionInfo(exceptionInfo);
}
tSpan.setLoggingTransactionInfo((byte) RandomUtils.nextInt(0, 256));
return tSpan;
}
private short randomServerServiceType() {
// Server (1000 ~ 1899)
return (short) RandomUtils.nextInt(1000, 1899);
}
public List<TAnnotation> randomTAnnotationList() {
int annotationSize = RandomUtils.nextInt(0, 3);
List<TAnnotation> result = new ArrayList<TAnnotation>();
for (int i = 0; i < annotationSize; i++) {
result.add(randomTAnnotation(i));
}
return result;
}
public TAnnotation randomTAnnotation(int key) {
TAnnotation tAnnotation = new TAnnotation();
// sort order
tAnnotation.setKey(key);
TAnnotationValue tAnnotationValue = new TAnnotationValue();
tAnnotationValue.setStringValue(RandomStringUtils.random(10));
tAnnotation.setValue(tAnnotationValue);
return tAnnotation;
}
public TSpanEvent randomTSpanEvent(short sequence) {
TSpanEvent tSpanEvent = new TSpanEvent();
// @deprecated
// tSpanEvent.setSpanId();
tSpanEvent.setSequence(sequence);
tSpanEvent.setStartElapsed(RandomUtils.nextInt(0, 1000));
tSpanEvent.setEndElapsed(RandomUtils.nextInt(0, 1000));
tSpanEvent.setRpc(RandomStringUtils.random(10));
// Database (2000 ~ 2899)
tSpanEvent.setServiceType((short) RandomUtils.nextInt(2000, 2889));
tSpanEvent.setEndPoint(RandomStringUtils.random(10));
List<TAnnotation> tAnnotationList = randomTAnnotationList();
if (CollectionUtils.isNotEmpty(tAnnotationList)) {
tSpanEvent.setAnnotations(tAnnotationList);
}
tSpanEvent.setDepth(RandomUtils.nextInt(0, 256));
tSpanEvent.setNextSpanId(random.nextLong());
tSpanEvent.setDestinationId(RandomStringUtils.random(20));
tSpanEvent.setApiId(RandomUtils.nextInt(0, 65535));
tSpanEvent.setAsyncId(randomNegative(RandomUtils.nextInt(0, 10)));
tSpanEvent.setNextAsyncId(random.nextInt());
tSpanEvent.setAsyncSequence((short) RandomUtils.nextInt(0, Short.MAX_VALUE));
if (random.nextBoolean()) {
TIntStringValue exceptionInfo = new TIntStringValue();
exceptionInfo.setIntValue(RandomUtils.nextInt(0, 5000));
exceptionInfo.setStringValue(RandomStringUtils.random(100));
tSpanEvent.setExceptionInfo(exceptionInfo);
}
return tSpanEvent;
}
private int randomNegative(int value) {
if (random.nextBoolean()) {
return -value;
}
return value;
}
public TSpanChunk randomTSpanChunk() {
final TSpanChunk tSpanChunk = new TSpanChunk();
tSpanChunk.setAgentId("agentId");
tSpanChunk.setApplicationName("appName");
tSpanChunk.setAgentStartTime(System.currentTimeMillis());
tSpanChunk.setTransactionId(TransactionIdUtils.formatByteBuffer("agent", System.currentTimeMillis(), RandomUtils.nextLong(0, Long.MAX_VALUE)));
tSpanChunk.setSpanId(random.nextLong());
tSpanChunk.setEndPoint(RandomStringUtils.random(20));
// tSpanChunk.setSpanEventList()
tSpanChunk.setApplicationServiceType(randomServerServiceType());
return tSpanChunk;
}
}