TraceClientFilter.java

package org.honton.chas.datadog.apm.jaxrs;

import org.honton.chas.datadog.apm.Tracer;

import javax.inject.Inject;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.net.URI;

/**
 * Trace export for jaxrs implementations
 */
@Provider
public class TraceClientFilter implements ClientRequestFilter, ClientResponseFilter {

  private Tracer tracer;

  @Inject
  void setTracer(Tracer tracer) {
    this.tracer = tracer;
  }

  public void filter(final ClientRequestContext req) throws IOException {
    URI uri = req.getUri();
    tracer.exportSpan(normalize(uri.getHost()) + ':' + uri.getPort(), req.getMethod() + ' ' + uri.getPath(),
        new Tracer.HeaderMutator() {
        @Override
        public void setValue(String name, String value) {
          req.getHeaders().putSingle(name, value);
        }
      });
  }

  private static String normalize(String host) {
    if(Character.isDigit(host.charAt(0))) {
      return ':' + host;
    }
    return host;
  }

  @Override
  public void filter(ClientRequestContext req, ClientResponseContext resp) throws IOException {
    int status = resp.getStatus();
    tracer.getCurrentSpan().error(status < 200 || status >= 400);
    tracer.closeCurrentSpan();
  }
}