Skip to content

Commit 351ab99

Browse files
committed
Add logging for slow http requests
The threshold is 1s by default and can be configured.
1 parent f1679b9 commit 351ab99

4 files changed

Lines changed: 65 additions & 11 deletions

File tree

src/main/java/com/faforever/api/config/FafApiProperties.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public class FafApiProperties {
3939
private Tutorial tutorial = new Tutorial();
4040
private Nodebb nodebb = new Nodebb();
4141
private Recaptcha recaptcha = new Recaptcha();
42+
private Monitoring monitoring = new Monitoring();
4243

4344
@Data
4445
public static class OAuth2 {
@@ -267,4 +268,9 @@ public static class Recaptcha {
267268
private boolean enabled;
268269
private String secret;
269270
}
271+
272+
@Data
273+
public static class Monitoring {
274+
private double slowRequestThresholdSeconds = 1.0;
275+
}
270276
}

src/main/java/com/faforever/api/logging/RequestIdFilter.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import javax.servlet.Filter;
1111
import javax.servlet.FilterChain;
12-
import javax.servlet.FilterConfig;
1312
import javax.servlet.ServletException;
1413
import javax.servlet.ServletRequest;
1514
import javax.servlet.ServletResponse;
@@ -34,16 +33,11 @@ public class RequestIdFilter implements Filter {
3433
*/
3534
private static final String REQUEST_ID_HEADER = "X-Request-ID";
3635

37-
@Override
38-
public void init(FilterConfig filterConfig) {
39-
}
40-
4136
@Override
4237
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
4338
String requestId = null;
4439

45-
if (request instanceof HttpServletRequest) {
46-
HttpServletRequest httpRequest = (HttpServletRequest) request;
40+
if (request instanceof HttpServletRequest httpRequest) {
4741
requestId = httpRequest.getHeader(REQUEST_ID_HEADER);
4842
}
4943

@@ -65,8 +59,4 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
6559
}
6660
}
6761

68-
@Override
69-
public void destroy() {
70-
}
71-
7262
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.faforever.api.logging;
2+
3+
import com.faforever.api.config.FafApiProperties;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.stereotype.Component;
7+
import org.springframework.util.StopWatch;
8+
import org.springframework.util.StringUtils;
9+
10+
import javax.servlet.Filter;
11+
import javax.servlet.FilterChain;
12+
import javax.servlet.ServletException;
13+
import javax.servlet.ServletRequest;
14+
import javax.servlet.ServletResponse;
15+
import javax.servlet.http.HttpServletRequest;
16+
import java.io.IOException;
17+
18+
/**
19+
* This logging interceptor checks for slow http calls and logs the whole request url.
20+
*/
21+
@Component
22+
@Slf4j
23+
@RequiredArgsConstructor
24+
public class SlowRequestDetectionFilter implements Filter {
25+
26+
private final FafApiProperties properties;
27+
28+
@Override
29+
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
30+
StopWatch stopWatch = new StopWatch();
31+
log.trace("Start stopwatch for performance measuring");
32+
stopWatch.start();
33+
34+
try {
35+
chain.doFilter(request, response);
36+
} finally {
37+
stopWatch.stop();
38+
log.trace("Stop stopwatch for performance measuring, total time: {}", stopWatch.getTotalTimeSeconds());
39+
40+
if (request instanceof HttpServletRequest httpRequest &&
41+
stopWatch.getTotalTimeSeconds() > properties.getMonitoring().getSlowRequestThresholdSeconds()) {
42+
StringBuffer urlBuffer = httpRequest.getRequestURL();
43+
44+
if (StringUtils.hasText(httpRequest.getQueryString())) {
45+
urlBuffer.append("?");
46+
urlBuffer.append(httpRequest.getQueryString());
47+
}
48+
49+
log.warn("Slow request detected: {} seconds @ {}", stopWatch.getTotalTimeSeconds(), urlBuffer.toString());
50+
}
51+
}
52+
}
53+
54+
}

src/test/java/com/faforever/api/deployment/ExeUploaderControllerTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public class ExeUploaderControllerTest {
3636
private FafApiProperties fafApiProperties;
3737
@MockBean
3838
private FafApiProperties.Deployment deployment;
39+
@MockBean
40+
private FafApiProperties.Monitoring monitoring;
3941

4042
@Mock
4143
private MockMultipartFile file;
@@ -48,8 +50,10 @@ public void init(MockMvc mvc) {
4850
@BeforeEach
4951
public void setUp() {
5052
when(fafApiProperties.getDeployment()).thenReturn(deployment);
53+
when(fafApiProperties.getMonitoring()).thenReturn(monitoring);
5154
when(deployment.getAllowedExeExtension()).thenReturn("exe");
5255
when(deployment.getTestingExeUploadKey()).thenReturn(API_KEY);
56+
when(monitoring.getSlowRequestThresholdSeconds()).thenReturn(1.0);
5357
file = new MockMultipartFile("file",
5458
"ForgedAlliance.exe",
5559
"application/octet-stream",

0 commit comments

Comments
 (0)