summaryrefslogtreecommitdiffstats
path: root/controller-api
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-09-09 13:05:10 +0200
committerMartin Polden <mpolden@mpolden.no>2019-09-09 14:46:09 +0200
commit46708d8c64baea341aa332f18d026dd7936bc745 (patch)
tree490489429d4e92cf6be6ccc8eaf769c50873ffa2 /controller-api
parentdd25c2a3c4c16ba96eda61e996f5347f1f8eaa9c (diff)
Move config server metrics fetching to controller-server
`MetricsService` interface and component setup is no longer needed.
Diffstat (limited to 'controller-api')
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/application/v4/model/ClusterMetrics.java20
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/ConfigServerMetricsService.java73
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/MetricsService.java114
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/package-info.java5
-rw-r--r--controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/metrics/ConfigServerMetricsServiceTest.java75
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);
- }
-
-}