summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorØyvind Grønnesby <oyving@verizonmedia.com>2019-07-12 16:38:14 +0200
committerØyvind Grønnesby <oyving@verizonmedia.com>2019-07-12 16:38:14 +0200
commit68db015f44741b4396aa80ed16758ca5d714110f (patch)
tree1d076936101d8b7c489eced41bf60f2b207c40e5
parent5202d0b9d3900ba43ed602a2b409ea56a489749b (diff)
Make all retrievals of metrics from cluster in context of the cluster
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java30
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/metrics/MetricsRetriever.java45
2 files changed, 27 insertions, 48 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
index 020e0a69205..0c7b6d24ed9 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
@@ -42,8 +42,10 @@ import com.yahoo.vespa.config.server.deploy.Deployment;
import com.yahoo.vespa.config.server.deploy.InfraDeployerProvider;
import com.yahoo.vespa.config.server.http.LogRetriever;
import com.yahoo.vespa.config.server.http.SimpleHttpFetcher;
+import com.yahoo.vespa.config.server.http.v2.MetricsResponse;
import com.yahoo.vespa.config.server.http.v2.PrepareResult;
import com.yahoo.vespa.config.server.metrics.ClusterInfo;
+import com.yahoo.vespa.config.server.metrics.MetricsAggregator;
import com.yahoo.vespa.config.server.metrics.MetricsRetriever;
import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.config.server.session.LocalSession;
@@ -74,6 +76,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -641,10 +644,17 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
// ---------------- Metrics ------------------------------------------------------------------------
- public HttpResponse getMetrics() {
- MetricsRetriever metricsRetriever = new MetricsRetriever();
- Map<ApplicationId, Collection<ClusterInfo>> applicationClusters = getApplicationClusters();
- return metricsRetriever.retrieveAllMetrics(applicationClusters);
+ public HttpResponse getMetrics(ApplicationId applicationId) {
+ var metricsRetriever = new MetricsRetriever();
+ var clusters = getClustersOfApplication(applicationId);
+ var clusterMetrics = new LinkedHashMap<ClusterInfo, MetricsAggregator>();
+
+ clusters.forEach(cluster -> {
+ var metrics = metricsRetriever.requestMetricsForCluster(cluster);
+ clusterMetrics.put(cluster, metrics);
+ });
+
+ return new MetricsResponse(200, Map.of(applicationId, clusterMetrics));
}
// ---------------- Misc operations ----------------------------------------------------------------
@@ -778,18 +788,6 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
return port;
}
- /** Finds all hosts, grouping them by application ID and cluster name */
- private Map<ApplicationId, Collection<ClusterInfo>> getApplicationClusters() {
- Map<ApplicationId, Collection<ClusterInfo>> applicationHosts = new HashMap<>();
- tenantRepository.getAllTenants().stream()
- .flatMap(tenant -> tenant.getApplicationRepo().activeApplications().stream())
- .forEach(applicationId ->{
- applicationHosts.put(applicationId, getClustersOfApplication(applicationId));
- }
- );
- return applicationHosts;
- }
-
/** Finds the hosts of an application, grouped by cluster name */
private Collection<ClusterInfo> getClustersOfApplication(ApplicationId applicationId) {
Application application = getApplication(applicationId);
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/MetricsRetriever.java b/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/MetricsRetriever.java
index d41606a946f..273979cead5 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/MetricsRetriever.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/MetricsRetriever.java
@@ -1,12 +1,10 @@
// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.server.metrics;
-import com.yahoo.config.provision.ApplicationId;
import com.yahoo.slime.ArrayTraverser;
import com.yahoo.slime.Inspector;
import com.yahoo.slime.Slime;
import com.yahoo.vespa.config.SlimeUtils;
-import com.yahoo.vespa.config.server.http.v2.MetricsResponse;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
@@ -17,43 +15,26 @@ import java.io.InputStream;
import java.io.UncheckedIOException;
import java.net.URI;
import java.time.Instant;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
/**
+ * Client for reaching out to nodes in an application instance and get their
+ * metrics.
+ *
* @author olaa
+ * @author ogronnesby
*/
public class MetricsRetriever {
+ private final HttpClient httpClient = HttpClientBuilder.create().build();
- private static final Logger logger = Logger.getLogger(MetricsRetriever.class.getName());
- HttpClient httpClient = HttpClientBuilder.create().build();
-
- public MetricsResponse retrieveAllMetrics(Map<ApplicationId, Collection<ClusterInfo>> applicationClusters) {
- Map<ApplicationId, Map<ClusterInfo, MetricsAggregator>> allMetrics = applicationClusters.entrySet().stream()
- .collect(Collectors.toMap(
- Map.Entry::getKey,
- e -> getMetricsByCluster(e.getValue())));
- return new MetricsResponse(200, allMetrics);
- }
-
- private Map<ClusterInfo, MetricsAggregator> getMetricsByCluster(Collection<ClusterInfo> clusters) {
- return clusters.stream()
- .collect(LinkedHashMap::new,
- (map, item) -> map.put(item, getClusterMetrics(item.getHostnames())),
- Map::putAll
- );
- }
-
- private MetricsAggregator getClusterMetrics(List<URI> hosts) {
- MetricsAggregator clusterMetrics = new MetricsAggregator();
- hosts.stream()
- .forEach(host -> getHostMetrics(host, clusterMetrics));
- return clusterMetrics;
+ /**
+ * Call the metrics API on each host in the cluster and aggregate the metrics
+ * into a single value.
+ */
+ public MetricsAggregator requestMetricsForCluster(ClusterInfo clusterInfo) {
+ var aggregator = new MetricsAggregator();
+ clusterInfo.getHostnames().forEach(host -> getHostMetrics(host, aggregator));
+ return aggregator;
}
private void getHostMetrics(URI hostURI, MetricsAggregator metrics) {