Skip to content

Commit

Permalink
Rework JAX-RS 2.0 impl to use new interceptors
Browse files Browse the repository at this point in the history
Use new interceptors which removes code duplication
especially for the server side integration.

Because the resteasy 3 and jersey 2 implementations
are based on the JAX-RS 2.0 implementation some changes were
also needed for the integration test setup of those 2 modules.
  • Loading branch information
kristofa committed Aug 16, 2015
1 parent c0836cc commit 2bc0288
Show file tree
Hide file tree
Showing 24 changed files with 224 additions and 668 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

import com.github.kristofa.brave.internal.Nullable;

/**
* Adapter used to get tracing information from and add tracing information to a new request.
*
*/
public interface ClientRequestAdapter {

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.github.kristofa.brave.jaxrs2;

import com.github.kristofa.brave.ClientTracer;
import com.github.kristofa.brave.client.ClientRequestInterceptor;
import com.github.kristofa.brave.client.spanfilter.SpanNameFilter;
import com.github.kristofa.brave.ClientRequestInterceptor;
import com.github.kristofa.brave.http.HttpClientRequest;
import com.github.kristofa.brave.http.HttpClientRequestAdapter;
import com.github.kristofa.brave.http.ServiceNameProvider;
import com.github.kristofa.brave.http.SpanNameProvider;

import javax.inject.Inject;
import javax.ws.rs.client.ClientRequestContext;
Expand All @@ -17,21 +19,21 @@
@Provider
public class BraveClientRequestFilter implements ClientRequestFilter {

private final ClientRequestInterceptor clientRequestInterceptor;
private final String serviceName;
private final ServiceNameProvider serviceNameProvider;
private final ClientRequestInterceptor requestInterceptor;
private final SpanNameProvider spanNameProvider;

@Inject
public BraveClientRequestFilter(final ClientTracer clientTracer, final String serviceName) {
this(clientTracer, serviceName, null);
public BraveClientRequestFilter(ServiceNameProvider serviceNameProvider, SpanNameProvider spanNameProvider, ClientRequestInterceptor requestInterceptor) {
this.requestInterceptor = requestInterceptor;
this.serviceNameProvider = serviceNameProvider;
this.spanNameProvider = spanNameProvider;
}

public BraveClientRequestFilter(final ClientTracer clientTracer, final String serviceName, final SpanNameFilter spanNameFilter) {
clientRequestInterceptor = new ClientRequestInterceptor(clientTracer, spanNameFilter);
this.serviceName = serviceName;
}

@Override
public void filter(ClientRequestContext clientRequestContext) throws IOException {
clientRequestInterceptor.handle(new JaxRS2ClientRequestAdapter(clientRequestContext), serviceName);
final HttpClientRequest req = new JaxRs2HttpClientRequest(clientRequestContext);
requestInterceptor.handle(new HttpClientRequestAdapter(req, serviceNameProvider, spanNameProvider));
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.github.kristofa.brave.jaxrs2;

import com.github.kristofa.brave.ClientTracer;
import com.github.kristofa.brave.client.ClientResponseInterceptor;
import com.github.kristofa.brave.ClientResponseInterceptor;
import com.github.kristofa.brave.http.HttpClientResponseAdapter;
import com.github.kristofa.brave.http.HttpResponse;
import com.github.kristofa.brave.http.ServiceNameProvider;
import com.github.kristofa.brave.http.SpanNameProvider;

import javax.inject.Inject;
import javax.ws.rs.client.ClientRequestContext;
Expand All @@ -16,15 +19,21 @@
@Provider
public class BraveClientResponseFilter implements ClientResponseFilter {

private final ClientResponseInterceptor clientResponseInterceptor;
private final ServiceNameProvider serviceNameProvider;
private final ClientResponseInterceptor responseInterceptor;
private final SpanNameProvider spanNameProvider;

@Inject
public BraveClientResponseFilter(final ClientTracer clientTracer, final String serviceName) {
clientResponseInterceptor = new ClientResponseInterceptor(clientTracer);
public BraveClientResponseFilter(ServiceNameProvider serviceNameProvider, SpanNameProvider spanNameProvider, ClientResponseInterceptor responseInterceptor) {
this.serviceNameProvider = serviceNameProvider;
this.spanNameProvider = spanNameProvider;
this.responseInterceptor = responseInterceptor;
}

@Override
public void filter(ClientRequestContext clientRequestContext, ClientResponseContext clientResponseContext) throws IOException {
clientResponseInterceptor.handle(new JaxRS2ClientResponseAdapter(clientResponseContext));

final HttpResponse response = new JaxRs2HttpResponse(clientResponseContext);
responseInterceptor.handle(new HttpClientResponseAdapter(response));
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.github.kristofa.brave.jaxrs2;

import com.github.kristofa.brave.BraveHttpHeaders;
import com.github.kristofa.brave.EndpointSubmitter;
import com.github.kristofa.brave.IdConversion;
import com.github.kristofa.brave.ServerTracer;
import com.github.kristofa.brave.*;
import com.github.kristofa.brave.http.HttpServerRequest;
import com.github.kristofa.brave.http.HttpServerRequestAdapter;
import com.github.kristofa.brave.http.SpanNameProvider;

import java.io.IOException;
import java.net.URI;
Expand All @@ -24,87 +24,20 @@
@Provider
public class BraveContainerRequestFilter implements ContainerRequestFilter {

private static Logger logger = Logger.getLogger(BraveContainerRequestFilter.class.getName());

private final ServerTracer serverTracer;
private final EndpointSubmitter endpointSubmitter;
private final ServerRequestInterceptor requestInterceptor;
private final SpanNameProvider spanNameProvider;

@Inject
public BraveContainerRequestFilter(ServerTracer serverTracer, EndpointSubmitter endpointSubmitter) {
this.serverTracer = serverTracer;
this.endpointSubmitter = endpointSubmitter;
public BraveContainerRequestFilter(ServerRequestInterceptor interceptor, SpanNameProvider spanNameProvider) {
this.requestInterceptor = interceptor;
this.spanNameProvider = spanNameProvider;
}

@Override
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
serverTracer.clearCurrentSpan();
UriInfo uriInfo = containerRequestContext.getUriInfo();
submitEndpoint(uriInfo);

TraceData traceData = getTraceDataFromHeaders(containerRequestContext);
if (Boolean.FALSE.equals(traceData.shouldBeTraced())) {
serverTracer.setStateNoTracing();
logger.fine("Not tracing request");
} else {
String spanName = getSpanName(traceData, uriInfo);
if (traceData.getTraceId() != null && traceData.getSpanId() != null) {
logger.fine("Received span information as part of request");
serverTracer.setStateCurrentTrace(traceData.getTraceId(), traceData.getSpanId(),
traceData.getParentSpanId(), spanName);
} else {
logger.fine("Received no span state");
serverTracer.setStateUnknown(spanName);
}
}
serverTracer.setServerReceived();
}

private void submitEndpoint(UriInfo uri) {
if (!endpointSubmitter.endpointSubmitted()) {
URI baseUri = uri.getBaseUri();
String contextPath = getContextPath(uri.getAbsolutePath().getPath());
String localAddr = baseUri.getHost();
int localPort = baseUri.getPort();
endpointSubmitter.submit(localAddr, localPort, contextPath);
logger.fine(format("Setting endpoint: addr: %s, port: %s, contextpath: %s", localAddr, localPort, contextPath));
}
}

static String getContextPath(String absolutePath) {
StringBuilder contextPath = new StringBuilder(absolutePath);
// Delete any leading slashes
while (contextPath.charAt(0) == '/') {
contextPath.deleteCharAt(0);
}
int slashIndex = contextPath.indexOf("/");
return slashIndex == -1 ? contextPath.toString() : contextPath.substring(0, slashIndex);
}

private String getSpanName(TraceData traceData, UriInfo uri) {
if (traceData.getSpanName() == null || traceData.getSpanName().isEmpty()) {
return uri.getAbsolutePath().getPath();
}
return traceData.getSpanName();
}

private TraceData getTraceDataFromHeaders(ContainerRequestContext request) {
TraceData traceData = new TraceData();
traceData.setTraceId(longOrNull(request.getHeaderString(BraveHttpHeaders.TraceId.getName())));
traceData.setSpanId(longOrNull(request.getHeaderString(BraveHttpHeaders.SpanId.getName())));
traceData.setParentSpanId(longOrNull(request.getHeaderString(BraveHttpHeaders.ParentSpanId.getName())));
traceData.setShouldBeSampled(nullOrBoolean(request.getHeaderString(BraveHttpHeaders.Sampled.getName())));
traceData.setSpanName(request.getHeaderString(BraveHttpHeaders.SpanName.getName()));
return traceData;
HttpServerRequest request = new JaxRs2HttpServerRequest(containerRequestContext);
requestInterceptor.handle(new HttpServerRequestAdapter(request, spanNameProvider));
}

private Boolean nullOrBoolean(String value) {
return (value == null) ? null : Boolean.valueOf(value);
}

private Long longOrNull(String value) {
if (value == null) {
return null;
}
return IdConversion.convertToLong(value);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package com.github.kristofa.brave.jaxrs2;

import com.github.kristofa.brave.ServerResponseAdapter;
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 javax.inject.Inject;
import javax.ws.rs.container.ContainerRequestContext;
Expand All @@ -15,19 +19,24 @@
@Provider
public class BraveContainerResponseFilter implements ContainerResponseFilter {

private final ServerTracer serverTracer;
private final ServerResponseInterceptor responseInterceptor;

@Inject
public BraveContainerResponseFilter(ServerTracer serverTracer) {
this.serverTracer = serverTracer;
public BraveContainerResponseFilter(ServerResponseInterceptor responseInterceptor) {
this.responseInterceptor = responseInterceptor;
}

@Override
public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException {
try {
serverTracer.setServerSend();
} finally {
serverTracer.clearCurrentSpan();
}
public void filter(final ContainerRequestContext containerRequestContext, final ContainerResponseContext containerResponseContext) throws IOException {

HttpResponse httpResponse = new HttpResponse() {

@Override
public int getHttpStatusCode() {
return containerResponseContext.getStatus();
}
};

responseInterceptor.handle(new HttpServerResponseAdapter(httpResponse));
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.github.kristofa.brave.jaxrs2;

import com.github.kristofa.brave.http.HttpClientRequest;

import javax.ws.rs.client.ClientRequestContext;
import java.net.URI;


public class JaxRs2HttpClientRequest implements HttpClientRequest {

private final ClientRequestContext clientRequestContext;

public JaxRs2HttpClientRequest(final ClientRequestContext clientRequestContext) {
this.clientRequestContext = clientRequestContext;
}

@Override
public void addHeader(String header, String value) {
clientRequestContext.getHeaders().add(header, value);
}

@Override
public URI getUri() {
return clientRequestContext.getUri();
}

@Override
public String getHttpMethod() {
return clientRequestContext.getMethod();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.github.kristofa.brave.jaxrs2;


import com.github.kristofa.brave.http.HttpResponse;

import javax.ws.rs.client.ClientResponseContext;

public class JaxRs2HttpResponse implements HttpResponse {

private final ClientResponseContext response;

public JaxRs2HttpResponse(final ClientResponseContext response) {
this.response = response;
}

@Override
public int getHttpStatusCode() {
return response.getStatus();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.github.kristofa.brave.jaxrs2;

import com.github.kristofa.brave.http.HttpServerRequest;

import javax.ws.rs.container.ContainerRequestContext;
import java.net.URI;

public class JaxRs2HttpServerRequest implements HttpServerRequest {

private final ContainerRequestContext containerRequestContext;

public JaxRs2HttpServerRequest(ContainerRequestContext containerRequestContext) {
this.containerRequestContext = containerRequestContext;
}

@Override
public String getHttpHeaderValue(String headerName) {
return containerRequestContext.getHeaderString(headerName);
}

@Override
public URI getUri() {
return containerRequestContext.getUriInfo().getRequestUri();
}

@Override
public String getHttpMethod() {
return containerRequestContext.getMethod();
}
}
Loading

0 comments on commit 2bc0288

Please sign in to comment.