-
Notifications
You must be signed in to change notification settings - Fork 48
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Remove side-effect in RequestRecordFactory (#117)
* Remove side-effect in RequestRecordFactory This change removes the http header propagation to log fields in the RequestRecordFactory. This feature was refactored to the AddHttpHeadersToLogContextFilter. The change include several test to ensure correct behaviour.
- Loading branch information
1 parent
671d10b
commit 2f192a1
Showing
5 changed files
with
175 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
143 changes: 143 additions & 0 deletions
143
...support-servlet/src/test/java/com/sap/hcp/cf/logging/servlet/filter/CustomFilterTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
package com.sap.hcp.cf.logging.servlet.filter; | ||
|
||
import static org.hamcrest.MatcherAssert.assertThat; | ||
import static org.hamcrest.Matchers.equalTo; | ||
import static org.hamcrest.Matchers.hasEntry; | ||
import static org.hamcrest.Matchers.is; | ||
|
||
import java.util.EnumSet; | ||
|
||
import javax.servlet.DispatcherType; | ||
import javax.servlet.Filter; | ||
import javax.servlet.http.HttpServletRequest; | ||
import javax.servlet.http.HttpServletResponse; | ||
|
||
import org.apache.http.client.methods.CloseableHttpResponse; | ||
import org.apache.http.client.methods.HttpGet; | ||
import org.apache.http.impl.client.CloseableHttpClient; | ||
import org.apache.http.impl.client.HttpClientBuilder; | ||
import org.eclipse.jetty.server.Server; | ||
import org.eclipse.jetty.server.ServerConnector; | ||
import org.eclipse.jetty.servlet.FilterHolder; | ||
import org.eclipse.jetty.servlet.ServletContextHandler; | ||
import org.junit.Rule; | ||
import org.junit.Test; | ||
import org.slf4j.MDC; | ||
|
||
import com.sap.hcp.cf.logging.common.Fields; | ||
import com.sap.hcp.cf.logging.common.request.HttpHeaders; | ||
|
||
public class CustomFilterTest { | ||
|
||
@Rule | ||
public SystemOutRule systemOutRule = new SystemOutRule(); | ||
|
||
@Test | ||
public void setsFixedTenantId() throws Exception { | ||
Server jetty = initJetty(constantTenantId("my_tenant")); | ||
try (CloseableHttpClient client = HttpClientBuilder.create().build()) { | ||
jetty.start(); | ||
try (CloseableHttpResponse response = client.execute(createBasicGetRequest(jetty))) { | ||
assertThat(response.getStatusLine().getStatusCode(), is(equalTo(200))); | ||
assertThat(systemOutRule.findLineAsMapWith(Fields.MSG, LoggingTestServlet.LOG_MESSAGE), hasEntry( | ||
Fields.TENANT_ID, | ||
"my_tenant")); | ||
} | ||
} finally { | ||
jetty.stop(); | ||
} | ||
} | ||
|
||
/** | ||
* This test case addresses | ||
* <a href="https://github.com/SAP/cf-java-logging-support/issues/111"> | ||
* Github issue #111</a>, by ensuring the elimination of a side-effect in | ||
* {@link RequestRecordFactory}, which used to overwrite custom set log | ||
* fields with values extracted from http headers. | ||
* | ||
* @throws Exception | ||
*/ | ||
@Test | ||
public void usesCustomTenantIdInRequestLog() throws Exception { | ||
Filter filter = new CompositeFilter(constantTenantId("custom_tenant"), new GenerateRequestLogFilter()); | ||
Server jetty = initJetty(filter); | ||
try (CloseableHttpClient client = HttpClientBuilder.create().build()) { | ||
jetty.start(); | ||
HttpGet request = createBasicGetRequest(jetty); | ||
request.addHeader(HttpHeaders.TENANT_ID.getName(), "other_tenant"); | ||
try (CloseableHttpResponse response = client.execute(request)) { | ||
assertThat(response.getStatusLine().getStatusCode(), is(equalTo(200))); | ||
assertThat(systemOutRule.findLineAsMapWith(Fields.MSG, LoggingTestServlet.LOG_MESSAGE), hasEntry( | ||
Fields.TENANT_ID, | ||
"custom_tenant")); | ||
assertThat(systemOutRule.findLineAsMapWith(Fields.LAYER, "[SERVLET]"), hasEntry(Fields.TENANT_ID, | ||
"custom_tenant")); | ||
} | ||
} finally { | ||
jetty.stop(); | ||
} | ||
} | ||
|
||
@Test | ||
public void canOverwriteGeneratedCorrelationId() throws Exception { | ||
Filter filter = new CompositeFilter(new CorrelationIdFilter(), constantCorrelationId("my_correlation"), | ||
new GenerateRequestLogFilter()); | ||
Server jetty = initJetty(filter); | ||
try (CloseableHttpClient client = HttpClientBuilder.create().build()) { | ||
jetty.start(); | ||
try (CloseableHttpResponse response = client.execute(createBasicGetRequest(jetty))) { | ||
assertThat(response.getStatusLine().getStatusCode(), is(equalTo(200))); | ||
assertThat(systemOutRule.findLineAsMapWith(Fields.MSG, LoggingTestServlet.LOG_MESSAGE), hasEntry( | ||
Fields.CORRELATION_ID, | ||
"my_correlation")); | ||
assertThat(systemOutRule.findLineAsMapWith(Fields.LAYER, "[SERVLET]"), hasEntry(Fields.CORRELATION_ID, | ||
"my_correlation")); | ||
} | ||
} finally { | ||
jetty.stop(); | ||
} | ||
} | ||
|
||
private Server initJetty(Filter filter) { | ||
Server jetty = new Server(0); | ||
ServletContextHandler contextHandler = new ServletContextHandler(jetty, null); | ||
EnumSet<DispatcherType> dispatches = EnumSet.of(DispatcherType.INCLUDE, DispatcherType.REQUEST, | ||
DispatcherType.ERROR, DispatcherType.FORWARD, | ||
DispatcherType.ASYNC); | ||
contextHandler.addFilter(new FilterHolder(filter), "/*", dispatches); | ||
contextHandler.addServlet(LoggingTestServlet.class, "/test"); | ||
return jetty; | ||
} | ||
|
||
private HttpGet createBasicGetRequest(Server jetty) { | ||
return new HttpGet(getBaseUrl(jetty) + "/test"); | ||
} | ||
|
||
private String getBaseUrl(Server server) { | ||
int port = ((ServerConnector) server.getConnectors()[0]).getLocalPort(); | ||
return "http://localhost:" + port; | ||
} | ||
|
||
private static Filter constantTenantId(String tenantId) { | ||
return constantField(Fields.TENANT_ID, tenantId); | ||
} | ||
|
||
private static Filter constantCorrelationId(String correlationId) { | ||
return constantField(Fields.CORRELATION_ID, correlationId); | ||
} | ||
|
||
private static Filter constantField(String field, String value) { | ||
return new AbstractLoggingFilter() { | ||
@Override | ||
protected void beforeFilter(HttpServletRequest request, HttpServletResponse response) { | ||
MDC.put(field, value); | ||
} | ||
|
||
@Override | ||
protected void cleanup(HttpServletRequest request, HttpServletResponse response) { | ||
MDC.remove(field); | ||
} | ||
}; | ||
} | ||
|
||
} |
25 changes: 25 additions & 0 deletions
25
...pport-servlet/src/test/java/com/sap/hcp/cf/logging/servlet/filter/LoggingTestServlet.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package com.sap.hcp.cf.logging.servlet.filter; | ||
|
||
import java.io.IOException; | ||
|
||
import javax.servlet.ServletException; | ||
import javax.servlet.http.HttpServlet; | ||
import javax.servlet.http.HttpServletRequest; | ||
import javax.servlet.http.HttpServletResponse; | ||
|
||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
public class LoggingTestServlet extends HttpServlet { | ||
|
||
public static final String LOG_MESSAGE = "request received"; | ||
|
||
private static final long serialVersionUID = -4594560302550583354L; | ||
private static final Logger LOG = LoggerFactory.getLogger(LoggingTestServlet.class); | ||
|
||
@Override | ||
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { | ||
LOG.info(LOG_MESSAGE); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters