package com.github.kristofa.brave.jaxrs2;
import com.github.kristofa.brave.Brave;
import com.github.kristofa.brave.ServerResponseInterceptor;
import com.github.kristofa.brave.ServerTracer;
import com.github.kristofa.brave.http.HttpResponse;
import com.github.kristofa.brave.http.HttpServerResponseAdapter;
import java.io.IOException;
import javax.annotation.Priority;
import javax.inject.Inject;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import zipkin.Constants;
import static com.github.kristofa.brave.internal.Util.checkNotNull;
/**
* Intercepts outgoing container responses and sends ss annotations.
*
* @deprecated Replaced by {@code TracingContainerFilter} from brave-instrumentation-jaxrs2
*/
@Deprecated
@Provider
@Priority(0)
public class BraveContainerResponseFilter implements ContainerResponseFilter {
/** Creates a tracing filter with defaults. Use {@link #builder(Brave)} to customize. */
public static BraveContainerResponseFilter create(Brave brave) {
return new Builder(brave).build();
}
public static Builder builder(Brave brave) {
return new Builder(brave);
}
public static final class Builder {
final Brave brave;
Builder(Brave brave) { // intentionally hidden
this.brave = checkNotNull(brave, "brave");
}
public BraveContainerResponseFilter build() {
return new BraveContainerResponseFilter(this);
}
}
private final ServerResponseInterceptor responseInterceptor;
// null on deprecated constructor
private final ServerTracer serverTracer;
BraveContainerResponseFilter(Builder b) { // intentionally hidden
this.serverTracer = b.brave.serverTracer();
this.responseInterceptor = b.brave.serverResponseInterceptor();
}
@Inject // internal dependency-injection constructor
BraveContainerResponseFilter(Brave brave) {
this(builder(brave));
}
/**
* @deprecated please use {@link #create(Brave)} or {@link #builder(Brave)}
*/
@Deprecated
public BraveContainerResponseFilter(ServerResponseInterceptor responseInterceptor) {
this.responseInterceptor = responseInterceptor;
this.serverTracer = null;
}
@Override
public void filter(final ContainerRequestContext containerRequestContext, final ContainerResponseContext containerResponseContext) throws IOException {
HttpResponse httpResponse = containerResponseContext::getStatus;
Response.StatusType statusInfo = containerResponseContext.getStatusInfo();
if (serverTracer != null && statusInfo.getFamily() == Response.Status.Family.SERVER_ERROR) {
serverTracer.submitBinaryAnnotation(Constants.ERROR, statusInfo.getReasonPhrase());
}
responseInterceptor.handle(new HttpServerResponseAdapter(httpResponse));
}
}