diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-09-09 13:05:10 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-09-09 14:46:09 +0200 |
commit | 46708d8c64baea341aa332f18d026dd7936bc745 (patch) | |
tree | 490489429d4e92cf6be6ccc8eaf769c50873ffa2 /controller-api | |
parent | dd25c2a3c4c16ba96eda61e996f5347f1f8eaa9c (diff) |
Move config server metrics fetching to controller-server
`MetricsService` interface and component setup is no longer needed.
Diffstat (limited to 'controller-api')
5 files changed, 12 insertions, 275 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/application/v4/model/ClusterMetrics.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/application/v4/model/ClusterMetrics.java index 28c94960daf..9296e144bf7 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/application/v4/model/ClusterMetrics.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/application/v4/model/ClusterMetrics.java @@ -4,7 +4,6 @@ package com.yahoo.vespa.hosted.controller.api.application.v4.model; import java.util.HashMap; import java.util.Map; import java.util.Optional; -import java.util.OptionalDouble; /** * @author olaa @@ -12,11 +11,11 @@ import java.util.OptionalDouble; public class ClusterMetrics { // These field names originate from the MetricsResponse class - private static final String QUERIES_PER_SECOND = "queriesPerSecond"; - private static final String FEED_PER_SECOND = "feedPerSecond"; - private static final String DOCUMENT_COUNT = "documentCount"; - private static final String FEED_LATENCY = "feedLatency"; - private static final String QUERY_LATENCY = "queryLatency"; + public static final String QUERIES_PER_SECOND = "queriesPerSecond"; + public static final String FEED_PER_SECOND = "feedPerSecond"; + public static final String DOCUMENT_COUNT = "documentCount"; + public static final String FEED_LATENCY = "feedLatency"; + public static final String QUERY_LATENCY = "queryLatency"; private final String clusterId; private final ClusterType clusterType; @@ -56,9 +55,14 @@ public class ClusterMetrics { return Optional.ofNullable(metrics.get(QUERY_LATENCY)); } - public void addMetric(String name, double value) { + public ClusterMetrics addMetric(String name, double value) { metrics.put(name, value); + return this; + } + + public enum ClusterType { + content, + container } - public enum ClusterType {content, container}; } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/ConfigServerMetricsService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/ConfigServerMetricsService.java deleted file mode 100644 index 125212d7a65..00000000000 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/ConfigServerMetricsService.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.yahoo.vespa.hosted.controller.api.integration.metrics; - -import com.google.inject.Inject; -import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.zone.ZoneId; -import com.yahoo.vespa.hosted.controller.api.application.v4.model.ClusterMetrics; -import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId; -import com.yahoo.vespa.hosted.controller.api.integration.ServiceRegistry; -import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServer; - -import java.util.List; -import java.util.Optional; -import java.util.function.Function; - -/** - * Retrieves metrics from the configuration server. - * - * @author ogronnesby - */ -// TODO: This module should not contain components. Move this to controller-server. -public class ConfigServerMetricsService implements MetricsService { - - private final ConfigServer configServerClient; - - @Inject - public ConfigServerMetricsService(ServiceRegistry serviceRegistry) { - this(serviceRegistry.configServer()); - } - - ConfigServerMetricsService(ConfigServer configServer) { - this.configServerClient = configServer; - } - - @Override - public ApplicationMetrics getApplicationMetrics(ApplicationId application) { - // TODO(ogronnesby): How to produce these values in Public context? - return new ApplicationMetrics(0.0, 0.0); - } - - @Override - public DeploymentMetrics getDeploymentMetrics(ApplicationId application, ZoneId zone) { - var deploymentId = new DeploymentId(application, zone); - var metrics = configServerClient.getMetrics(deploymentId); - - // The field names here come from the MetricsResponse class. - return new DeploymentMetrics( - metrics.stream().flatMap(m -> m.queriesPerSecond().stream()).mapToDouble(Double::doubleValue).sum(), - metrics.stream().flatMap(m -> m.feedPerSecond().stream()).mapToDouble(Double::doubleValue).sum(), - metrics.stream().flatMap(m -> m.documentCount().stream()).mapToLong(Double::longValue).sum(), - weightedAverageLatency(metrics, ClusterMetrics::queriesPerSecond, ClusterMetrics::queryLatency), - weightedAverageLatency(metrics, ClusterMetrics::feedPerSecond, ClusterMetrics::feedLatency) - ); - } - - private double weightedAverageLatency(List<ClusterMetrics> metrics, - Function<ClusterMetrics, Optional<Double>> rateExtractor, - Function<ClusterMetrics, Optional<Double>> latencyExtractor) - { - var rateSum = metrics.stream().flatMap(m -> rateExtractor.apply(m).stream()).mapToDouble(Double::longValue).sum(); - if (rateSum == 0) { - return 0.0; - } - - var weightedLatency = metrics.stream() - .flatMap(m -> { - return latencyExtractor.apply(m).flatMap(l -> rateExtractor.apply(m).map(r -> l * r)).stream(); - }) - .mapToDouble(Double::doubleValue) - .sum(); - - return weightedLatency / rateSum; - } -} diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/MetricsService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/MetricsService.java deleted file mode 100644 index abc9d53d4c7..00000000000 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/MetricsService.java +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.controller.api.integration.metrics; - -import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.zone.ZoneId; - -/** - * A service which returns metric values on request - * - * @author bratseth - */ -public interface MetricsService { - - ApplicationMetrics getApplicationMetrics(ApplicationId application); - - DeploymentMetrics getDeploymentMetrics(ApplicationId application, ZoneId zone); - - class DeploymentMetrics { - - private final double queriesPerSecond; - private final double writesPerSecond; - private final long documentCount; - private final double queryLatencyMillis; - private final double writeLatencyMillis; - - public DeploymentMetrics(double queriesPerSecond, double writesPerSecond, - long documentCount, - double queryLatencyMillis, double writeLatencyMillis) { - this.queriesPerSecond = queriesPerSecond; - this.writesPerSecond = writesPerSecond; - this.documentCount = documentCount; - this.queryLatencyMillis = queryLatencyMillis; - this.writeLatencyMillis = writeLatencyMillis; - } - - public double queriesPerSecond() { return queriesPerSecond; } - - public double writesPerSecond() { return writesPerSecond; } - - public long documentCount() { return documentCount; } - - public double queryLatencyMillis() { return queryLatencyMillis; } - - public double writeLatencyMillis() { return writeLatencyMillis; } - - } - - class ApplicationMetrics { - - private final double queryServiceQuality; - private final double writeServiceQuality; - - public ApplicationMetrics(double queryServiceQuality, double writeServiceQuality) { - this.queryServiceQuality = queryServiceQuality; - this.writeServiceQuality = writeServiceQuality; - } - - /** Returns the quality of service for queries as a number between 1 (perfect) and 0 (none) */ - public double queryServiceQuality() { return queryServiceQuality; } - - /** Returns the quality of service for writes as a number between 1 (perfect) and 0 (none) */ - public double writeServiceQuality() { return writeServiceQuality; } - - } - - class SystemMetrics { - - private final double cpuUtil; - private final double memUtil; - private final double diskUtil; - - /** - * @param cpuUtil percentage of system cpu utilization - * @param memUtil percentage of system memory utilization - * @param diskUtil percentage of system disk utilization - */ - public SystemMetrics(double cpuUtil, double memUtil, double diskUtil) { - this.cpuUtil = cpuUtil; - this.memUtil = memUtil; - this.diskUtil = diskUtil; - } - - /** @return the percentage of cpu utilization **/ - public double cpuUtil() { return cpuUtil; } - - /** @return the percentage of memory utilization **/ - public double memUtil() { return memUtil; } - - /** @return the percentage of disk utilization **/ - public double diskUtil() { return diskUtil; } - - public static class Builder { - private double cpuUtil; - private double memUtil; - private double diskUtil; - - public void setCpuUtil(double cpuUtil) { - this.cpuUtil = cpuUtil; - } - - public void setMemUtil(double memUtil) { - this.memUtil = memUtil; - } - - public void setDiskUtil(double diskUtil) { - this.diskUtil = diskUtil; - } - - public SystemMetrics build() { return new SystemMetrics(cpuUtil, memUtil, diskUtil); } - } - - } - -} diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/package-info.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/package-info.java deleted file mode 100644 index d14f2e79882..00000000000 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -@ExportPackage -package com.yahoo.vespa.hosted.controller.api.integration.metrics; - -import com.yahoo.osgi.annotation.ExportPackage; diff --git a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/ConfigServerMetricsServiceTest.java b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/ConfigServerMetricsServiceTest.java deleted file mode 100644 index 7a271132e7d..00000000000 --- a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/ConfigServerMetricsServiceTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.yahoo.vespa.hosted.controller.api.integration.metrics; - -import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.zone.ZoneId; -import com.yahoo.vespa.hosted.controller.api.application.v4.model.ClusterMetrics; -import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId; -import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServer; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -import java.util.List; - -import static org.junit.Assert.assertEquals; - -public class ConfigServerMetricsServiceTest { - - private final ApplicationId applicationId = new ApplicationId.Builder() - .tenant("foo") - .applicationName("bar") - .instanceName("default") - .build(); - - private final ZoneId zoneId = ZoneId.from("prod", "us-west-1"); - - private ConfigServer configServer; - private ConfigServerMetricsService service; - - @Before - public void before() { - configServer = Mockito.mock(ConfigServer.class); - service = new ConfigServerMetricsService(configServer); - } - - @Test - public void test_returning_metrics() { - // - // Wire up the test - // - var deploymentId = new DeploymentId(applicationId, zoneId); - - var clusterMetrics1 = new ClusterMetrics("niceCluster", ClusterMetrics.ClusterType.container) {{ - addMetric("queriesPerSecond", 23.0); - addMetric("queryLatency", 1337.0); - }}; - - var clusterMetrics2 = new ClusterMetrics("alsoNiceCluster", ClusterMetrics.ClusterType.container) {{ - addMetric("queriesPerSecond", 11.0); - addMetric("queryLatency", 12.0); - }}; - - var response = List.of(clusterMetrics1, clusterMetrics2); - - Mockito.when(configServer.getMetrics(deploymentId)).thenReturn(response); - - // - // Now we can actually test stuff :( - // - var deploymentMetrics = service.getDeploymentMetrics(applicationId, zoneId); - - assertEquals(23.0 + 11.0, deploymentMetrics.queriesPerSecond(), 0.001); - assertEquals(908.323, deploymentMetrics.queryLatencyMillis(), 0.001); - assertEquals(0, deploymentMetrics.documentCount()); - assertEquals(0.0, deploymentMetrics.writeLatencyMillis(), 0.001); - assertEquals(0.0, deploymentMetrics.writesPerSecond(), 0.001); - } - - @Test - public void test_not_implemented_application_metrics() { - var applicationMetrics = service.getApplicationMetrics(applicationId); - assertEquals(0.0, applicationMetrics.queryServiceQuality(), 0.001); - assertEquals(0.0, applicationMetrics.writeServiceQuality(), 0.001); - } - -} |