Skip to content

Commit ac789a1

Browse files
authored
Merge pull request #270 from goughy000/fix/request-time-log
Bug Fix: Log request time from ALB requests
2 parents e991c56 + 3368df1 commit ac789a1

File tree

2 files changed

+98
-10
lines changed

2 files changed

+98
-10
lines changed

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,11 @@
1111
import javax.servlet.http.HttpServletResponse;
1212
import javax.ws.rs.core.SecurityContext;
1313

14-
import java.time.LocalDateTime;
15-
import java.time.ZoneId;
16-
import java.time.ZoneOffset;
17-
import java.time.ZonedDateTime;
14+
import java.time.*;
1815
import java.time.format.DateTimeFormatter;
1916
import java.time.format.DateTimeFormatterBuilder;
2017
import java.util.Locale;
2118

22-
import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY;
2319
import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY;
2420
import static java.time.temporal.ChronoField.DAY_OF_MONTH;
2521
import static java.time.temporal.ChronoField.HOUR_OF_DAY;
@@ -37,10 +33,16 @@
3733
*/
3834
public class ApacheCombinedServletLogFormatter<ContainerRequestType extends HttpServletRequest, ContainerResponseType extends HttpServletResponse>
3935
implements LogFormatter<ContainerRequestType, ContainerResponseType> {
40-
DateTimeFormatter dateFormat;
36+
private final DateTimeFormatter dateFormat;
37+
private final Clock clock;
4138

4239
public ApacheCombinedServletLogFormatter() {
43-
dateFormat = new DateTimeFormatterBuilder()
40+
this(Clock.systemDefaultZone());
41+
}
42+
43+
ApacheCombinedServletLogFormatter(Clock clock) {
44+
this.clock = clock;
45+
this.dateFormat = new DateTimeFormatterBuilder()
4446
.parseCaseInsensitive()
4547
.appendLiteral("[")
4648
.appendValue(DAY_OF_MONTH, 2)
@@ -93,17 +95,17 @@ public String format(ContainerRequestType servletRequest, ContainerResponseType
9395

9496

9597
// %t
96-
if (gatewayContext != null) {
98+
if (gatewayContext != null && gatewayContext.getRequestTimeEpoch() > 0) {
9799
logLineBuilder.append(
98100
dateFormat.format(
99101
ZonedDateTime.of(
100102
LocalDateTime.ofEpochSecond(gatewayContext.getRequestTimeEpoch() / 1000, 0, ZoneOffset.UTC),
101-
ZoneId.systemDefault()
103+
clock.getZone()
102104
)
103105
)
104106
);
105107
} else {
106-
logLineBuilder.append(dateFormat.format(ZonedDateTime.now()));
108+
logLineBuilder.append(dateFormat.format(ZonedDateTime.now(clock)));
107109
}
108110
logLineBuilder.append(" ");
109111

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.amazonaws.serverless.proxy.internal.servlet;
2+
3+
4+
import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity;
5+
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
6+
import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext;
7+
import org.junit.Before;
8+
import org.junit.Test;
9+
10+
import javax.servlet.http.HttpServletRequest;
11+
import javax.servlet.http.HttpServletResponse;
12+
13+
import java.time.Clock;
14+
import java.time.Instant;
15+
import java.time.ZoneId;
16+
17+
import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY;
18+
import static org.hamcrest.CoreMatchers.containsString;
19+
import static org.junit.Assert.assertThat;
20+
import static org.mockito.Matchers.eq;
21+
import static org.mockito.Mockito.mock;
22+
import static org.mockito.Mockito.when;
23+
24+
public class ApacheCombinedServletLogFormatterTest {
25+
26+
private ApacheCombinedServletLogFormatter sut;
27+
28+
private HttpServletRequest mockServletRequest;
29+
private HttpServletResponse mockServletResponse;
30+
private AwsProxyRequest proxyRequest;
31+
private AwsProxyRequestContext context;
32+
33+
@Before
34+
public void setup() {
35+
proxyRequest = new AwsProxyRequest();
36+
Clock fixedClock = Clock.fixed(Instant.ofEpochSecond(665888523L), ZoneId.of("UTC"));
37+
mockServletRequest = mock(HttpServletRequest.class);
38+
when(mockServletRequest.getAttribute(eq(API_GATEWAY_EVENT_PROPERTY)))
39+
.thenReturn(proxyRequest);
40+
when(mockServletRequest.getMethod())
41+
.thenReturn("GET");
42+
mockServletResponse = mock(HttpServletResponse.class);
43+
context = new AwsProxyRequestContext();
44+
context.setIdentity(new ApiGatewayRequestIdentity());
45+
proxyRequest.setRequestContext(context);
46+
47+
sut = new ApacheCombinedServletLogFormatter(fixedClock);
48+
}
49+
50+
@Test
51+
public void logsCurrentTimeWhenContextNull() {
52+
// given
53+
proxyRequest.setRequestContext(null);
54+
55+
// when
56+
String actual = sut.format(mockServletRequest, mockServletResponse, null);
57+
58+
// then
59+
assertThat(actual, containsString("[07/02/1991:01:02:03Z]"));
60+
}
61+
62+
@Test
63+
public void logsCurrentTimeWhenRequestTimeZero() {
64+
// given
65+
context.setRequestTimeEpoch(0);
66+
67+
// when
68+
String actual = sut.format(mockServletRequest, mockServletResponse, null);
69+
70+
// then
71+
assertThat(actual, containsString("[07/02/1991:01:02:03Z]"));
72+
}
73+
74+
@Test
75+
public void logsRequestTimeWhenRequestTimeEpochGreaterThanZero() {
76+
// given
77+
context.setRequestTimeEpoch(1563023494000L);
78+
79+
// when
80+
String actual = sut.format(mockServletRequest, mockServletResponse, null);
81+
82+
// then
83+
assertThat(actual, containsString("[13/07/2019:13:11:34Z]"));
84+
}
85+
86+
}

0 commit comments

Comments
 (0)