summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
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
commitf7060198a5ddb5e11de592b2b93a39c016e47f23 (patch)
treef8959ff77a1586571fd877e3bef90368e58d3f2d /controller-server
parentc683ff8478cf8e07448349bdd94a5b0aa54cb678 (diff)
Add fields to Deployment to record quota usage
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java17
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/QuotaUsage.java36
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java7
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