killbill-memoizeit
Changes
profiles/killbill/src/main/java/org/killbill/billing/server/filters/RequestDataFilter.java 31(+28 -3)
Details
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/filters/RequestDataFilter.java b/profiles/killbill/src/main/java/org/killbill/billing/server/filters/RequestDataFilter.java
index 02fa786..33a7879 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/filters/RequestDataFilter.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/filters/RequestDataFilter.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
@@ -17,6 +17,8 @@
package org.killbill.billing.server.filters;
+import java.io.IOException;
+import java.io.OutputStream;
import java.util.List;
import javax.ws.rs.core.HttpHeaders;
@@ -30,6 +32,7 @@ import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerRequestFilter;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;
+import com.sun.jersey.spi.container.ContainerResponseWriter;
@Singleton
public class RequestDataFilter implements ContainerRequestFilter, ContainerResponseFilter {
@@ -48,7 +51,7 @@ public class RequestDataFilter implements ContainerRequestFilter, ContainerRespo
@Override
public ContainerResponse filter(final ContainerRequest request, final ContainerResponse response) {
- Request.resetPerThreadRequestData();
+ response.setContainerResponseWriter(new Adapter(response.getContainerResponseWriter()));
return response;
}
@@ -59,4 +62,26 @@ public class RequestDataFilter implements ContainerRequestFilter, ContainerRespo
}
return requestIds;
}
+
+ private static final class Adapter implements ContainerResponseWriter {
+
+ private final ContainerResponseWriter crw;
+
+ Adapter(final ContainerResponseWriter containerResponseWriter) {
+ this.crw = containerResponseWriter;
+ }
+
+ @Override
+ public OutputStream writeStatusAndHeaders(final long contentLength, final ContainerResponse response) throws IOException {
+ return crw.writeStatusAndHeaders(contentLength, response);
+ }
+
+ @Override
+ public void finish() throws IOException {
+ crw.finish();
+
+ // Reset the per-thread RequestData last
+ Request.resetPerThreadRequestData();
+ }
+ }
}
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java b/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
index e031a5d..e205acb 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
@@ -63,6 +63,9 @@ public class KillbillGuiceListener extends KillbillPlatformGuiceListener {
// Swagger integration
.addJaxrsResource("com.wordnik.swagger.jersey.listing");
+ // Set the per-thread RequestData first
+ builder.addJerseyFilter(RequestDataFilter.class.getName());
+
//
// Add jersey filters which are executed prior jersey write the output stream
//
@@ -79,7 +82,6 @@ public class KillbillGuiceListener extends KillbillPlatformGuiceListener {
builder.addJerseyFilter(GZIPContentEncodingFilter.class.getName());
}
builder.addJerseyFilter(ProfilingContainerResponseFilter.class.getName());
- builder.addJerseyFilter(RequestDataFilter.class.getName());
// Broader, to support the "Try it out!" feature
//builder.addFilter("/" + SWAGGER_PATH + "*", ResponseCorsFilter.class);
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/log/RequestIdConverter.java b/profiles/killbill/src/main/java/org/killbill/billing/server/log/RequestIdConverter.java
new file mode 100644
index 0000000..94c4081
--- /dev/null
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/log/RequestIdConverter.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2016 Groupon, Inc
+ * Copyright 2016 The Billing Project, LLC
+ *
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.server.log;
+
+import org.killbill.commons.request.Request;
+import org.killbill.commons.request.RequestData;
+
+import ch.qos.logback.classic.pattern.ClassicConverter;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+
+public class RequestIdConverter extends ClassicConverter {
+
+ @Override
+ public String convert(final ILoggingEvent event) {
+ final RequestData perThreadRequestData = Request.getPerThreadRequestData();
+ return perThreadRequestData == null ? null : perThreadRequestData.getRequestId();
+ }
+}
diff --git a/profiles/killbill/src/main/resources/logback.xml b/profiles/killbill/src/main/resources/logback.xml
index 4a56c96..9e61520 100644
--- a/profiles/killbill/src/main/resources/logback.xml
+++ b/profiles/killbill/src/main/resources/logback.xml
@@ -18,11 +18,12 @@
<configuration>
<conversionRule conversionWord="maskedMsg" converterClass="org.killbill.billing.server.log.obfuscators.ObfuscatorConverter" />
+ <conversionRule conversionWord="requestId" converterClass="org.killbill.billing.server.log.RequestIdConverter" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- See http://jira.qos.ch/browse/LOGBACK-262 -->
- <pattern>%date{"yyyy-MM-dd'T'HH:mm:ss,SSSZ", UTC} thread='%thread', level='%level', logger='%logger{0}', %maskedMsg%n%ex</pattern>
+ <pattern>%date{"yyyy-MM-dd'T'HH:mm:ss,SSSZ", UTC} rId='%requestId', thread='%thread', level='%level', logger='%logger{0}', %maskedMsg%n%ex</pattern>
</encoder>
</appender>