package org.kevoree.core;
import org.kevoree.api.telemetry.TelemetryEvent;
/**
* Created by duke on 8/7/14.
*/
public class TelemetryEventImpl implements TelemetryEvent {
private String origin;
private String message;
private Type type;
private String stack;
private Long timestamp;
public static TelemetryEvent build(String origin, Type type, String message, String stack) {
TelemetryEventImpl e = new TelemetryEventImpl();
e.origin = origin;
e.type = type;
e.message = message;
e.stack = stack;
e.timestamp = getTime();
return e;
}
// HACK BEGIN: ensures timestamp uniqueness with a microsecond precision.
private static final long ONE_THOUSAND = 1000L;
private static long lastTime = 0L;
private synchronized static long getTime() {
long current = System.currentTimeMillis() * ONE_THOUSAND;
if(current > lastTime) {
lastTime = current;
} else {
lastTime++;
}
return lastTime;
}
// HACK END
@Override
public Type type() {
return type;
}
@Override
public Long timestamp() {
return timestamp;
}
@Override
public String origin() {
return origin;
}
@Override
public String message() {
return message;
}
@Override
public String stack() {
return stack;
}
@Override
public String toJSON() {
StringBuilder builder = new StringBuilder();
builder.append("{\n");
builder.append("\"origin\":\"");
builder.append(origin);
builder.append("\",\n");
builder.append("\"type\":\"");
builder.append(type);
builder.append("\",\n");
builder.append("\"message\":");
if(message.length() > 0) {
boolean asString = message.charAt(0) != '{' && message.charAt(0) != '[';
if (asString) {
builder.append("\"");
builder.append(message.replace("\n", "\\n").replace("\t", "\\t").replace("\"", "\\\""));
builder.append("\"");
} else {
builder.append(message.replace("\n", "\\n").replace("\t", "\\t"));
}
builder.append(",\n");
} else {
builder.append("\"\",\n");
}
builder.append("\"timestamp\":\"");
builder.append(timestamp);
builder.append("\",\n");
builder.append("\"stack\":\"");
if(stack.length() > 0) {
builder.append(stack.replace("\n", "\\n").replace("\t", "\\t").replace("\"", "\\\""));
}
builder.append("\"\n");
builder.append("}\n");
return builder.toString();
}
}