diff options
author | Øyvind Grønnesby <oyving@verizonmedia.com> | 2020-10-08 14:11:29 +0200 |
---|---|---|
committer | Øyvind Grønnesby <oyving@verizonmedia.com> | 2020-10-08 14:11:29 +0200 |
commit | f7060198a5ddb5e11de592b2b93a39c016e47f23 (patch) | |
tree | f8959ff77a1586571fd877e3bef90368e58d3f2d /controller-server | |
parent | c683ff8478cf8e07448349bdd94a5b0aa54cb678 (diff) |
Add fields to Deployment to record quota usage
Diffstat (limited to 'controller-server')
6 files changed, 66 insertions, 8 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java index d12e7dbc0ca..243566c72bd 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java @@ -68,7 +68,8 @@ public class Instance { version, instant)); Deployment newDeployment = new Deployment(zone, applicationVersion, version, instant, previousDeployment.metrics().with(warnings), - previousDeployment.activity()); + previousDeployment.activity(), + previousDeployment.quota()); return with(newDeployment); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java index 200f41c8bcf..800680d7327 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java @@ -22,19 +22,21 @@ public class Deployment { private final Instant deployTime; private final DeploymentMetrics metrics; private final DeploymentActivity activity; + private final QuotaUsage quota; public Deployment(ZoneId zone, ApplicationVersion applicationVersion, Version version, Instant deployTime) { - this(zone, applicationVersion, version, deployTime, DeploymentMetrics.none, DeploymentActivity.none); + this(zone, applicationVersion, version, deployTime, DeploymentMetrics.none, DeploymentActivity.none, QuotaUsage.none); } public Deployment(ZoneId zone, ApplicationVersion applicationVersion, Version version, Instant deployTime, - DeploymentMetrics metrics, DeploymentActivity activity) { + DeploymentMetrics metrics, DeploymentActivity activity, QuotaUsage quota) { this.zone = Objects.requireNonNull(zone, "zone cannot be null"); this.applicationVersion = Objects.requireNonNull(applicationVersion, "applicationVersion cannot be null"); this.version = Objects.requireNonNull(version, "version cannot be null"); this.deployTime = Objects.requireNonNull(deployTime, "deployTime cannot be null"); this.metrics = Objects.requireNonNull(metrics, "deploymentMetrics cannot be null"); this.activity = Objects.requireNonNull(activity, "activity cannot be null"); + this.quota = Objects.requireNonNull(quota, "usage cannot be null"); } /** Returns the zone this was deployed to */ @@ -57,13 +59,20 @@ public class Deployment { /** Returns activity for this */ public DeploymentActivity activity() { return activity; } + /** Returns quota usage for this */ + public QuotaUsage quota() { return quota; } + public Deployment recordActivityAt(Instant instant) { return new Deployment(zone, applicationVersion, version, deployTime, metrics, - activity.recordAt(instant, metrics)); + activity.recordAt(instant, metrics), quota); } public Deployment withMetrics(DeploymentMetrics metrics) { - return new Deployment(zone, applicationVersion, version, deployTime, metrics, activity); + return new Deployment(zone, applicationVersion, version, deployTime, metrics, activity, quota); + } + + public Deployment withQuota(QuotaUsage quota) { + return new Deployment(zone, applicationVersion, version, deployTime, metrics, activity, quota); } @Override diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/QuotaUsage.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/QuotaUsage.java new file mode 100644 index 00000000000..39309ca3fcf --- /dev/null +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/QuotaUsage.java @@ -0,0 +1,36 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.controller.application; + +import java.util.OptionalDouble; + +/** + * @author ogronnesby + */ +public class QuotaUsage { + public static final QuotaUsage none = new QuotaUsage(0.0); + + private final double rate; + + public QuotaUsage(double rate) { + this.rate = rate; + } + + public double rate() { + return rate; + } + + public static QuotaUsage create(OptionalDouble rate) { + if (rate.isEmpty()) { + return QuotaUsage.none; + } + return new QuotaUsage(rate.getAsDouble()); + } + + @Override + public String toString() { + return "QuotaUsage{" + + "rate=" + rate + + '}'; + } + +} diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java index a188ca9abc3..124b913eb01 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java @@ -237,7 +237,8 @@ public class DeploymentStatus { change.platform().orElse(existing.version()), existing.at(), existing.metrics(), - existing.activity()) + existing.activity(), + existing.quota()) : existing); if ( job.application().instance().equals(instance) && job.type().isProduction() diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java index 121347c4b61..3aac5eb2266 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java @@ -32,6 +32,7 @@ import com.yahoo.vespa.hosted.controller.application.Deployment; import com.yahoo.vespa.hosted.controller.application.DeploymentActivity; import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics; import com.yahoo.vespa.hosted.controller.application.EndpointId; +import com.yahoo.vespa.hosted.controller.application.QuotaUsage; import com.yahoo.vespa.hosted.controller.application.TenantAndApplicationId; import com.yahoo.vespa.hosted.controller.metric.ApplicationMetrics; import com.yahoo.vespa.hosted.controller.rotation.RotationId; @@ -143,6 +144,9 @@ public class ApplicationSerializer { private static final String rotationStateField = "state"; private static final String statusField = "status"; + // Quota usage fields + private static final String quotaUsageRateField = "quotaUsageRate"; + // A cache of deserialized applications. // // Deserializing an application from slime is expensive, particularly XML fields, such as DeploymentSpec and @@ -203,6 +207,7 @@ public class ApplicationSerializer { deployment.activity().lastWritten().ifPresent(instant -> object.setLong(lastWrittenField, instant.toEpochMilli())); deployment.activity().lastQueriesPerSecond().ifPresent(value -> object.setDouble(lastQueriesPerSecondField, value)); deployment.activity().lastWritesPerSecond().ifPresent(value -> object.setDouble(lastWritesPerSecondField, value)); + object.setDouble(quotaUsageRateField, deployment.quota().rate()); } private void deploymentMetricsToSlime(DeploymentMetrics metrics, Cursor object) { @@ -368,7 +373,8 @@ public class ApplicationSerializer { DeploymentActivity.create(Serializers.optionalInstant(deploymentObject.field(lastQueriedField)), Serializers.optionalInstant(deploymentObject.field(lastWrittenField)), Serializers.optionalDouble(deploymentObject.field(lastQueriesPerSecondField)), - Serializers.optionalDouble(deploymentObject.field(lastWritesPerSecondField)))); + Serializers.optionalDouble(deploymentObject.field(lastWritesPerSecondField))), + QuotaUsage.create(Serializers.optionalDouble(deploymentObject.field(quotaUsageRateField)))); } private DeploymentMetrics deploymentMetricsFromSlime(Inspector object) { diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java index a73445dfa5a..16a17d96c03 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java @@ -20,6 +20,7 @@ import com.yahoo.vespa.hosted.controller.application.Change; import com.yahoo.vespa.hosted.controller.application.Deployment; import com.yahoo.vespa.hosted.controller.application.DeploymentActivity; import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics; +import com.yahoo.vespa.hosted.controller.application.QuotaUsage; import com.yahoo.vespa.hosted.controller.application.TenantAndApplicationId; import com.yahoo.vespa.hosted.controller.metric.ApplicationMetrics; import com.yahoo.vespa.hosted.controller.rotation.RotationId; @@ -100,7 +101,8 @@ public class ApplicationSerializerTest { Optional.of(Instant.now().truncatedTo(ChronoUnit.MILLIS)), Map.of(DeploymentMetrics.Warning.all, 3)), DeploymentActivity.create(Optional.of(activityAt), Optional.of(activityAt), - OptionalDouble.of(200), OptionalDouble.of(10)))); + OptionalDouble.of(200), OptionalDouble.of(10)), + QuotaUsage.create(OptionalDouble.of(23.5)))); var rotationStatus = RotationStatus.from(Map.of(new RotationId("my-rotation"), new RotationStatus.Targets( @@ -193,6 +195,9 @@ public class ApplicationSerializerTest { assertEquals(original.require(id1.instance()).deployments().get(zone2).metrics().writeLatencyMillis(), serialized.require(id1.instance()).deployments().get(zone2).metrics().writeLatencyMillis(), Double.MIN_VALUE); assertEquals(original.require(id1.instance()).deployments().get(zone2).metrics().instant(), serialized.require(id1.instance()).deployments().get(zone2).metrics().instant()); assertEquals(original.require(id1.instance()).deployments().get(zone2).metrics().warnings(), serialized.require(id1.instance()).deployments().get(zone2).metrics().warnings()); + + // Test quota + assertEquals(original.require(id1.instance()).deployments().get(zone2).quota().rate(), serialized.require(id1.instance()).deployments().get(zone2).quota().rate(), 0.001); } @Test |