summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-03-28 10:15:43 +0200
committerMartin Polden <mpolden@mpolden.no>2019-04-01 12:31:46 +0200
commit285e338194307a8a80a8b8351ffb4b222e55e82a (patch)
tree663f21042633c20f3bd8c893e4607af35aafb019 /controller-server
parentc582119fcd6fe0275ce4e1937943005f2982cb54 (diff)
Allow updating individual fields in DeploymentMetrics
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentActivity.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentMetrics.java51
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java29
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java5
4 files changed, 63 insertions, 24 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentActivity.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentActivity.java
index 881de040e28..03c08509a5e 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentActivity.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentActivity.java
@@ -63,7 +63,7 @@ public class DeploymentActivity {
public static DeploymentActivity create(Optional<Instant> queriedAt, Optional<Instant> writtenAt,
OptionalDouble lastQueriesPerSecond, OptionalDouble lastWritesPerSecond) {
- if (!queriedAt.isPresent() && !writtenAt.isPresent()) {
+ if (queriedAt.isEmpty() && writtenAt.isEmpty()) {
return none;
}
return new DeploymentActivity(queriedAt, writtenAt, lastQueriesPerSecond, lastWritesPerSecond);
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentMetrics.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentMetrics.java
index 1ee461cbb8d..e99ecbd8fe9 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentMetrics.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentMetrics.java
@@ -2,16 +2,19 @@
package com.yahoo.vespa.hosted.controller.application;
import java.time.Instant;
+import java.util.Objects;
import java.util.Optional;
/**
- * Metrics for a deployment of an application.
+ * Metrics for a deployment of an application. This contains a snapshot of metrics gathered at a point in time, it does
+ * not contain any historical data.
*
* @author smorgrav
+ * @author mpolden
*/
public class DeploymentMetrics {
- public static final DeploymentMetrics none = new DeploymentMetrics(0, 0, 0, 0, 0);
+ public static final DeploymentMetrics none = new DeploymentMetrics(0, 0, 0, 0, 0, Optional.empty());
private final double queriesPerSecond;
private final double writesPerSecond;
@@ -20,11 +23,7 @@ public class DeploymentMetrics {
private final double writeLatencyMills;
private final Optional<Instant> instant;
- public DeploymentMetrics(double queriesPerSecond, double writesPerSecond, double documentCount,
- double queryLatencyMillis, double writeLatencyMills) {
- this(queriesPerSecond, writesPerSecond, documentCount, queryLatencyMillis, writeLatencyMills, Optional.empty());
- }
-
+ /* DO NOT USE. Public for serialization purposes */
public DeploymentMetrics(double queriesPerSecond, double writesPerSecond, double documentCount,
double queryLatencyMillis, double writeLatencyMills, Optional<Instant> instant) {
this.queriesPerSecond = queriesPerSecond;
@@ -32,31 +31,67 @@ public class DeploymentMetrics {
this.documentCount = documentCount;
this.queryLatencyMillis = queryLatencyMillis;
this.writeLatencyMills = writeLatencyMills;
- this.instant = instant;
+ this.instant = Objects.requireNonNull(instant, "instant must be non-null");
}
+ /** Returns the number of queries per second */
public double queriesPerSecond() {
return queriesPerSecond;
}
+ /** Returns the number of writes per second */
public double writesPerSecond() {
return writesPerSecond;
}
+ /** Returns the number of documents */
public double documentCount() {
return documentCount;
}
+ /** Returns the average query latency in milliseconds */
public double queryLatencyMillis() {
return queryLatencyMillis;
}
+ /** Returns the average write latency in milliseconds */
public double writeLatencyMillis() {
return writeLatencyMills;
}
+ /** Returns the approximate time this was measured */
public Optional<Instant> instant() {
return instant;
}
+ public DeploymentMetrics withQueriesPerSecond(double queriesPerSecond) {
+ return new DeploymentMetrics(queriesPerSecond, writesPerSecond, documentCount, queryLatencyMillis,
+ writeLatencyMills, instant);
+ }
+
+ public DeploymentMetrics withWritesPerSecond(double writesPerSecond) {
+ return new DeploymentMetrics(queriesPerSecond, writesPerSecond, documentCount, queryLatencyMillis,
+ writeLatencyMills, instant);
+ }
+
+ public DeploymentMetrics withDocumentCount(double documentCount) {
+ return new DeploymentMetrics(queriesPerSecond, writesPerSecond, documentCount, queryLatencyMillis,
+ writeLatencyMills, instant);
+ }
+
+ public DeploymentMetrics withQueryLatencyMillis(double queryLatencyMillis) {
+ return new DeploymentMetrics(queriesPerSecond, writesPerSecond, documentCount, queryLatencyMillis,
+ writeLatencyMills, instant);
+ }
+
+ public DeploymentMetrics withWriteLatencyMillis(double writeLatencyMills) {
+ return new DeploymentMetrics(queriesPerSecond, writesPerSecond, documentCount, queryLatencyMillis,
+ writeLatencyMills, instant);
+ }
+
+ public DeploymentMetrics at(Instant instant) {
+ return new DeploymentMetrics(queriesPerSecond, writesPerSecond, documentCount, queryLatencyMillis,
+ writeLatencyMills, Optional.of(instant));
+ }
+
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java
index c3474a485ca..787a050e59e 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java
@@ -11,10 +11,10 @@ import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics;
import com.yahoo.vespa.hosted.controller.application.RotationStatus;
import java.time.Duration;
+import java.time.Instant;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.TreeMap;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;
@@ -61,19 +61,20 @@ public class DeploymentMetricsMaintainer extends Maintainer {
applications.store(locked.withRotationStatus(rotationStatus(application))));
for (Deployment deployment : application.deployments().values()) {
- MetricsService.DeploymentMetrics deploymentMetrics = controller().metricsService()
- .getDeploymentMetrics(application.id(), deployment.zone());
-
- DeploymentMetrics newMetrics = new DeploymentMetrics(deploymentMetrics.queriesPerSecond(),
- deploymentMetrics.writesPerSecond(),
- deploymentMetrics.documentCount(),
- deploymentMetrics.queryLatencyMillis(),
- deploymentMetrics.writeLatencyMillis(),
- Optional.of(controller().clock().instant()));
-
- applications.lockIfPresent(application.id(), locked ->
- applications.store(locked.with(deployment.zone(), newMetrics)
- .recordActivityAt(controller().clock().instant(), deployment.zone())));
+ MetricsService.DeploymentMetrics collectedMetrics = controller().metricsService()
+ .getDeploymentMetrics(application.id(), deployment.zone());
+ Instant now = controller().clock().instant();
+ applications.lockIfPresent(application.id(), locked -> {
+ DeploymentMetrics newMetrics = locked.get().deployments().get(deployment.zone()).metrics()
+ .withQueriesPerSecond(collectedMetrics.queriesPerSecond())
+ .withWritesPerSecond(collectedMetrics.writesPerSecond())
+ .withDocumentCount(collectedMetrics.documentCount())
+ .withQueryLatencyMillis(collectedMetrics.queryLatencyMillis())
+ .withWriteLatencyMillis(collectedMetrics.writeLatencyMillis())
+ .at(now);
+ applications.store(locked.with(deployment.zone(), newMetrics)
+ .recordActivityAt(now, deployment.zone()));
+ });
}
} catch (Exception e) {
failures.incrementAndGet();
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java
index e11440a372c..de9da83826d 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java
@@ -41,11 +41,13 @@ public class DeploymentMetricsMaintainerTest {
// No metrics gathered yet
assertEquals(0, app.get().metrics().queryServiceQuality(), 0);
assertEquals(0, deployment.get().metrics().documentCount(), 0);
+ assertFalse("No timestamp set", deployment.get().metrics().instant().isPresent());
assertFalse("Never received any queries", deployment.get().activity().lastQueried().isPresent());
assertFalse("Never received any writes", deployment.get().activity().lastWritten().isPresent());
// Metrics are gathered and saved to application
maintainer.maintain();
+ Instant t1 = tester.clock().instant().truncatedTo(MILLIS);
assertEquals(0.5, app.get().metrics().queryServiceQuality(), Double.MIN_VALUE);
assertEquals(0.7, app.get().metrics().writeServiceQuality(), Double.MIN_VALUE);
assertEquals(1, deployment.get().metrics().queriesPerSecond(), Double.MIN_VALUE);
@@ -53,7 +55,7 @@ public class DeploymentMetricsMaintainerTest {
assertEquals(3, deployment.get().metrics().documentCount(), Double.MIN_VALUE);
assertEquals(4, deployment.get().metrics().queryLatencyMillis(), Double.MIN_VALUE);
assertEquals(5, deployment.get().metrics().writeLatencyMillis(), Double.MIN_VALUE);
- Instant t1 = tester.clock().instant().truncatedTo(MILLIS);
+ assertEquals(t1, deployment.get().metrics().instant().get());
assertEquals(t1, deployment.get().activity().lastQueried().get());
assertEquals(t1, deployment.get().activity().lastWritten().get());
@@ -61,6 +63,7 @@ public class DeploymentMetricsMaintainerTest {
tester.clock().advance(Duration.ofHours(1));
Instant t2 = tester.clock().instant().truncatedTo(MILLIS);
maintainer.maintain();
+ assertEquals(t2, deployment.get().metrics().instant().get());
assertEquals(t2, deployment.get().activity().lastQueried().get());
assertEquals(t2, deployment.get().activity().lastWritten().get());
assertEquals(1, deployment.get().activity().lastQueriesPerSecond().getAsDouble(), Double.MIN_VALUE);