summaryrefslogtreecommitdiffstats
path: root/metrics-proxy
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2020-04-28 02:19:16 +0200
committergjoranv <gv@verizonmedia.com>2020-04-28 02:19:16 +0200
commitab63bd7b1482c7e0fcfc3d1bd4d936f4267a7df1 (patch)
tree87be05933bc08b5ca5781716cb25519982d193a5 /metrics-proxy
parent737fb3450c5bb253aec2c1ca8959093885593421 (diff)
Limit number of threads for applications with <20 nodes.
Diffstat (limited to 'metrics-proxy')
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetriever.java15
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetrieverTest.java15
2 files changed, 23 insertions, 7 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetriever.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetriever.java
index 4d57e89fc76..40011a0dc72 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetriever.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetriever.java
@@ -19,7 +19,6 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
@@ -37,16 +36,16 @@ public class ApplicationMetricsRetriever extends AbstractComponent {
private static final Logger log = Logger.getLogger(ApplicationMetricsRetriever.class.getName());
- private static final int PARALLELISM = 20;
+ static final int MAX_THREADS = 20;
static final Duration MIN_TIMEOUT = Duration.ofSeconds(60);
- private static final Duration MAX_TIMEOUT = Duration.ofSeconds(240);
+ static final Duration MAX_TIMEOUT = Duration.ofSeconds(240);
private static final int HTTP_CONNECT_TIMEOUT = 5000;
private static final int HTTP_SOCKET_TIMEOUT = 30000;
private final HttpClient httpClient = createHttpClient();
private final List<NodeMetricsClient> clients;
- private final ForkJoinPool forkJoinPool = new ForkJoinPool(PARALLELISM);
+ private final ForkJoinPool forkJoinPool;
// Non-final for testing
private Duration taskTimeout;
@@ -55,7 +54,9 @@ public class ApplicationMetricsRetriever extends AbstractComponent {
@Inject
public ApplicationMetricsRetriever(MetricsNodesConfig nodesConfig) {
clients = createNodeClients(nodesConfig);
- taskTimeout = timeout(clients.size());
+ int numThreads = Math.min(clients.size(), MAX_THREADS);
+ taskTimeout = timeout(clients.size(), numThreads);
+ forkJoinPool = new ForkJoinPool(numThreads);
}
@Override
@@ -112,8 +113,8 @@ public class ApplicationMetricsRetriever extends AbstractComponent {
.build();
}
- private static Duration timeout(int clients) {
- Duration timeout = Duration.ofSeconds(Long.max(MIN_TIMEOUT.toSeconds(), 20 * clients / PARALLELISM));
+ static Duration timeout(int clients, int numThreads) {
+ Duration timeout = Duration.ofSeconds(Long.max(MIN_TIMEOUT.toSeconds(), 20 * clients / numThreads));
return timeout.compareTo(MAX_TIMEOUT) > 0 ? MAX_TIMEOUT : timeout;
}
diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetrieverTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetrieverTest.java
index 1f2852e3526..a74989f7af6 100644
--- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetrieverTest.java
+++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetrieverTest.java
@@ -11,6 +11,10 @@ import java.util.Arrays;
import java.util.concurrent.TimeoutException;
import static ai.vespa.metricsproxy.TestUtil.getFileContents;
+import static ai.vespa.metricsproxy.http.application.ApplicationMetricsRetriever.MAX_THREADS;
+import static ai.vespa.metricsproxy.http.application.ApplicationMetricsRetriever.MAX_TIMEOUT;
+import static ai.vespa.metricsproxy.http.application.ApplicationMetricsRetriever.MIN_TIMEOUT;
+import static ai.vespa.metricsproxy.http.application.ApplicationMetricsRetriever.timeout;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
@@ -146,6 +150,17 @@ public class ApplicationMetricsRetrieverTest {
verifyRetrievingMetricsFromSingleNode(config, node);
}
+ @Test
+ public void test_timeout_calculation() {
+ assertEquals(MIN_TIMEOUT, timeout(1, 1));
+ assertEquals(MIN_TIMEOUT, timeout(MAX_THREADS, MAX_THREADS));
+
+ // These values must be updated if the calculation in the timeout method itself is changed.
+ assertEquals(Duration.ofSeconds(100), timeout(100, MAX_THREADS));
+ assertEquals(Duration.ofSeconds(200), timeout(200, MAX_THREADS));
+ assertEquals(MAX_TIMEOUT, timeout(240, MAX_THREADS));
+ }
+
private MetricsNodesConfig nodesConfig(String... paths) {
var nodes = Arrays.stream(paths)
.map(this::nodeConfig)