diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-03-28 10:15:43 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-04-01 12:31:46 +0200 |
commit | 285e338194307a8a80a8b8351ffb4b222e55e82a (patch) | |
tree | 663f21042633c20f3bd8c893e4607af35aafb019 /controller-server | |
parent | c582119fcd6fe0275ce4e1937943005f2982cb54 (diff) |
Allow updating individual fields in DeploymentMetrics
Diffstat (limited to 'controller-server')
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); |