diff options
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 |
commit | 68db015f44741b4396aa80ed16758ca5d714110f (patch) | |
tree | 1d076936101d8b7c489eced41bf60f2b207c40e5 | |
parent | 5202d0b9d3900ba43ed602a2b409ea56a489749b (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.java | 30 | ||||
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/metrics/MetricsRetriever.java | 45 |
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) { |