Skip to content

Instantly share code, notes, and snippets.

@cmicali
Last active January 9, 2016 02:45
Show Gist options
  • Save cmicali/df4bcc3b3926d5f467d8 to your computer and use it in GitHub Desktop.
Save cmicali/df4bcc3b3926d5f467d8 to your computer and use it in GitHub Desktop.
package com.sagedevices.platform.jersey.filters;
import com.google.common.base.Strings;
import com.sagedevices.platform.jersey.core.RequestId;
import com.sagedevices.platform.util.EncodingUtil;
import org.slf4j.MDC;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger;
public class RequestIdFilter implements Filter {
protected RequestId.GeneratorType requestIdGenerator;
public AtomicInteger originCounter;
public AtomicInteger localCounter;
public RequestIdFilter() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
requestIdGenerator = RequestId.GeneratorType.valueOf(filterConfig.getInitParameter("RequestIdGenerator"));
if (requestIdGenerator == RequestId.GeneratorType.SimpleIncrement) {
originCounter = new AtomicInteger(0);
localCounter = new AtomicInteger(0);
}
}
@Override
public void destroy() { /* unused */ }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
// Generate the local request id
final String localRequestId = getNewRequestId(requestIdGenerator, localCounter);
MDC.put(RequestId.MDC_NAME_LOCAL, localRequestId);
resp.addHeader(RequestId.HEADER_NAME_LOCAL, EncodingUtil.urlEncode(localRequestId));
String originRequestId = req.getHeader(RequestId.HEADER_NAME_ORIGIN);
if (Strings.isNullOrEmpty(originRequestId)) {
originRequestId = getNewRequestId(requestIdGenerator, originCounter);
}
if (!Strings.isNullOrEmpty(originRequestId)) {
MDC.put(RequestId.MDC_NAME_ORIGIN, originRequestId);
resp.addHeader(RequestId.HEADER_NAME_ORIGIN, EncodingUtil.urlEncode(originRequestId));
}
try {
chain.doFilter(request, response);
} finally {
MDC.remove(RequestId.MDC_NAME_LOCAL);
MDC.remove(RequestId.MDC_NAME_ORIGIN);
}
}
public static String getNewRequestId(RequestId.GeneratorType generator, AtomicInteger counter) {
switch (generator) {
case SimpleIncrement:
return String.valueOf(counter.incrementAndGet());
case RandomLong:
return String.valueOf(ThreadLocalRandom.current().nextLong()).substring(1);
case UUID:
default:
return UUID.randomUUID().toString();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment