Skip to content

Commit

Permalink
Start work on error handler
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian Devins committed Mar 30, 2018
1 parent 101e856 commit 4bb6c16
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 5 deletions.
8 changes: 8 additions & 0 deletions brave/src/main/java/brave/ErrorHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package brave;

public interface ErrorHandler {
ErrorHandler NOOP = new NoopErrorHandler();

void handleError(SpanCustomizer customizer, Throwable throwable);

}
10 changes: 10 additions & 0 deletions brave/src/main/java/brave/NoopErrorHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package brave;

class NoopErrorHandler implements ErrorHandler {
NoopErrorHandler() {
}

@Override
public void handleError(SpanCustomizer customizer, Throwable throwable) {
}
}
4 changes: 4 additions & 0 deletions brave/src/main/java/brave/NoopSpan.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ static NoopSpan create(TraceContext context) {
return this;
}

@Override public Span error(Throwable throwable) {
return this;
}

@Override public void finish() {
}

Expand Down
11 changes: 9 additions & 2 deletions brave/src/main/java/brave/RealSpan.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@
abstract class RealSpan extends Span {

abstract Recorder recorder();
abstract ErrorHandler errorHandler();

static RealSpan create(TraceContext context, Recorder recorder) {
return new AutoValue_RealSpan(context, RealSpanCustomizer.create(context, recorder), recorder);
static RealSpan create(TraceContext context, Recorder recorder, ErrorHandler errorHandler) {
return new AutoValue_RealSpan(context, RealSpanCustomizer.create(context, recorder), recorder, errorHandler);
}

@Override public boolean isNoop() {
Expand Down Expand Up @@ -54,6 +55,12 @@ static RealSpan create(TraceContext context, Recorder recorder) {
return this;
}

@Override
public Span error(Throwable throwable) {
errorHandler().handleError(customizer(), throwable);
return this;
}

@Override public Span remoteEndpoint(Endpoint remoteEndpoint) {
recorder().remoteEndpoint(context(), remoteEndpoint);
return this;
Expand Down
3 changes: 3 additions & 0 deletions brave/src/main/java/brave/Span.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ public enum Kind {
/** {@inheritDoc} */
@Override public abstract Span tag(String key, String value);

/** Hands errors off to the configured ErrorHandler */
public abstract Span error(Throwable throwable);

/**
* @deprecated use {@link #remoteEndpoint(Endpoint)}, possibly with {@link zipkin.Endpoint#toV2()}
*/
Expand Down
1 change: 1 addition & 0 deletions brave/src/main/java/brave/SpanCustomizer.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
// Note: this is exposed to users. We cannot add methods to this until Java 8 is required or we do a
// major version bump
// BRAVE5: add isNoop to avoid instanceof checks
// BRAVE5: add error to support error handling
public interface SpanCustomizer {
/**
* Sets the string name for the logical operation this span represents.
Expand Down
6 changes: 4 additions & 2 deletions brave/src/main/java/brave/Tracer.java
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,9 @@ public Tracer build() {
final CurrentTraceContext currentTraceContext;
final boolean traceId128Bit, supportsJoin;
final AtomicBoolean noop;
final ErrorHandler errorHandler;

Tracer(Tracing.Builder builder, Clock clock, AtomicBoolean noop) {
Tracer(Tracing.Builder builder, Clock clock, AtomicBoolean noop, ErrorHandler errorHandler) {
this.noop = noop;
this.propagationFactory = builder.propagationFactory;
this.supportsJoin = builder.supportsJoin && propagationFactory.supportsJoin();
Expand All @@ -149,6 +150,7 @@ public Tracer build() {
this.sampler = builder.sampler;
this.currentTraceContext = builder.currentTraceContext;
this.traceId128Bit = builder.traceId128Bit || propagationFactory.requires128BitTraceId();
this.errorHandler = errorHandler;
}

/** @deprecated use {@link Tracing#clock(TraceContext)} */
Expand Down Expand Up @@ -302,7 +304,7 @@ public Span toSpan(TraceContext context) {
if (context == null) throw new NullPointerException("context == null");
TraceContext decorated = propagationFactory.decorate(context);
if (!noop.get() && Boolean.TRUE.equals(decorated.sampled())) {
return RealSpan.create(decorated, recorder);
return RealSpan.create(decorated, recorder, errorHandler);
}
return NoopSpan.create(decorated);
}
Expand Down
16 changes: 15 additions & 1 deletion brave/src/main/java/brave/Tracing.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ public final Clock clock(TraceContext context) {
return tracer().recorder.clock(context);
}

abstract public ErrorHandler errorHandler();

// volatile for visibility on get. writes guarded by Tracing.class
static volatile Tracing current = null;

Expand Down Expand Up @@ -122,6 +124,7 @@ public static final class Builder {
boolean traceId128Bit = false;
boolean supportsJoin = true;
Propagation.Factory propagationFactory = B3Propagation.FACTORY;
ErrorHandler errorHandler = ErrorHandler.NOOP;

/**
* Controls the name of the service being traced, while still using a default site-local IP.
Expand Down Expand Up @@ -274,6 +277,11 @@ public Builder supportsJoin(boolean supportsJoin) {
return this;
}

public Builder errorHandler(ErrorHandler errorHandler) {
this.errorHandler = errorHandler;
return this;
}

public Tracing build() {
if (clock == null) clock = Platform.get().clock();
if (endpoint == null) {
Expand All @@ -296,10 +304,12 @@ static final class Default extends Tracing {
final Propagation<String> stringPropagation;
final CurrentTraceContext currentTraceContext;
final Clock clock;
final ErrorHandler errorHandler;

Default(Builder builder) {
this.clock = builder.clock;
this.tracer = new Tracer(builder, clock, noop);
this.errorHandler = builder.errorHandler;
this.tracer = new Tracer(builder, clock, noop, errorHandler);
this.propagationFactory = builder.propagationFactory;
this.stringPropagation = builder.propagationFactory.create(Propagation.KeyFactory.STRING);
this.currentTraceContext = builder.currentTraceContext;
Expand All @@ -326,6 +336,10 @@ static final class Default extends Tracing {
return clock;
}

@Override public ErrorHandler errorHandler() {
return errorHandler;
}

private void maybeSetCurrent() {
if (current != null) return;
synchronized (Tracing.class) {
Expand Down

0 comments on commit 4bb6c16

Please sign in to comment.