package brave;
import brave.internal.recorder.Recorder;
import brave.propagation.TraceContext;
import com.google.auto.value.AutoValue;
import zipkin.Endpoint;
/** This wraps the public api and guards access to a mutable span. */
@AutoValue
abstract class RealSpan extends Span {
abstract Clock clock();
abstract Recorder recorder();
static RealSpan create(TraceContext context, Clock clock, Recorder recorder) {
return new AutoValue_RealSpan(context, clock, recorder);
}
@Override public boolean isNoop() {
return false;
}
@Override public Span start() {
return start(clock().currentTimeMicroseconds());
}
@Override public Span start(long timestamp) {
recorder().start(context(), timestamp);
return this;
}
@Override public Span name(String name) {
recorder().name(context(), name);
return this;
}
@Override public Span kind(Kind kind) {
recorder().kind(context(), kind);
return this;
}
@Override public Span annotate(String value) {
return annotate(clock().currentTimeMicroseconds(), value);
}
@Override public Span annotate(long timestamp, String value) {
recorder().annotate(context(), timestamp, value);
return this;
}
@Override public Span tag(String key, String value) {
recorder().tag(context(), key, value);
return this;
}
@Override public Span remoteEndpoint(Endpoint remoteEndpoint) {
recorder().remoteEndpoint(context(), remoteEndpoint);
return this;
}
@Override public void finish() {
finish(clock().currentTimeMicroseconds());
}
@Override public void finish(long timestamp) {
recorder().finish(context(), timestamp);
}
@Override public void flush() {
recorder().flush(context());
}
@Override
public String toString() {
return "RealSpan(" + context() + ")";
}
}