aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorValerij Fredriksen <valerij92@gmail.com>2021-05-31 12:12:48 +0200
committerValerij Fredriksen <valerij92@gmail.com>2021-05-31 15:52:41 +0200
commit0a84d8be46ade948a40a57be59590c3655130314 (patch)
tree96025c85039a59360dc3e0b90352db14a710f0f1 /controller-server
parent8509f12256bc2b2d8e934bf3f527d196b2feb978 (diff)
Add cost to Deployment
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java7
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java22
-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.java6
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java5
5 files changed, 33 insertions, 10 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 0fcb3cd9be4..515b156af48 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
@@ -24,6 +24,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.OptionalDouble;
import java.util.OptionalLong;
import java.util.Set;
import java.util.function.Function;
@@ -69,11 +70,13 @@ public class Instance {
version, instant,
DeploymentMetrics.none,
DeploymentActivity.none,
- QuotaUsage.none));
+ QuotaUsage.none,
+ OptionalDouble.empty()));
Deployment newDeployment = new Deployment(zone, applicationVersion, version, instant,
previousDeployment.metrics().with(warnings),
previousDeployment.activity(),
- quotaUsage);
+ quotaUsage,
+ previousDeployment.cost());
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 3d17a7f8681..53305c54bc4 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
@@ -7,6 +7,7 @@ import com.yahoo.config.provision.zone.ZoneId;
import java.time.Instant;
import java.util.Objects;
+import java.util.OptionalDouble;
/**
* A deployment of an application in a particular zone.
@@ -23,9 +24,10 @@ public class Deployment {
private final DeploymentMetrics metrics;
private final DeploymentActivity activity;
private final QuotaUsage quota;
+ private final OptionalDouble cost;
public Deployment(ZoneId zone, ApplicationVersion applicationVersion, Version version, Instant deployTime,
- DeploymentMetrics metrics, DeploymentActivity activity, QuotaUsage quota) {
+ DeploymentMetrics metrics, DeploymentActivity activity, QuotaUsage quota, OptionalDouble cost) {
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");
@@ -33,6 +35,7 @@ public class Deployment {
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");
+ this.cost = Objects.requireNonNull(cost, "cost cannot be null");
}
/** Returns the zone this was deployed to */
@@ -58,17 +61,28 @@ public class Deployment {
/** Returns quota usage for this */
public QuotaUsage quota() { return quota; }
+ /** Returns cost, in dollars per hour, for this */
+ public OptionalDouble cost() { return cost; }
+
public Deployment recordActivityAt(Instant instant) {
return new Deployment(zone, applicationVersion, version, deployTime, metrics,
- activity.recordAt(instant, metrics), quota);
+ activity.recordAt(instant, metrics), quota, cost);
}
public Deployment withMetrics(DeploymentMetrics metrics) {
- return new Deployment(zone, applicationVersion, version, deployTime, metrics, activity, quota);
+ return new Deployment(zone, applicationVersion, version, deployTime, metrics, activity, quota, cost);
}
public Deployment withQuota(QuotaUsage quota) {
- return new Deployment(zone, applicationVersion, version, deployTime, metrics, activity, quota);
+ return new Deployment(zone, applicationVersion, version, deployTime, metrics, activity, quota, cost);
+ }
+
+ public Deployment withCost(double cost) {
+ return new Deployment(zone, applicationVersion, version, deployTime, metrics, activity, quota, OptionalDouble.of(cost));
+ }
+
+ public Deployment withoutCost() {
+ return new Deployment(zone, applicationVersion, version, deployTime, metrics, activity, quota, OptionalDouble.empty());
}
@Override
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 5b873f11618..8981ad4e6db 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
@@ -246,7 +246,8 @@ public class DeploymentStatus {
existing.at(),
existing.metrics(),
existing.activity(),
- existing.quota())
+ existing.quota(),
+ existing.cost())
: 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 24b553e5153..06442779b9c 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
@@ -142,6 +142,8 @@ public class ApplicationSerializer {
// Quota usage fields
private static final String quotaUsageRateField = "quotaUsageRate";
+ private static final String deploymentCostField = "cost";
+
// ------------------ Serialization
public Slime toSlime(Application application) {
@@ -196,6 +198,7 @@ public class ApplicationSerializer {
deployment.activity().lastQueriesPerSecond().ifPresent(value -> object.setDouble(lastQueriesPerSecondField, value));
deployment.activity().lastWritesPerSecond().ifPresent(value -> object.setDouble(lastWritesPerSecondField, value));
object.setDouble(quotaUsageRateField, deployment.quota().rate());
+ deployment.cost().ifPresent(cost -> object.setDouble(deploymentCostField, cost));
}
private void deploymentMetricsToSlime(DeploymentMetrics metrics, Cursor object) {
@@ -357,7 +360,8 @@ public class ApplicationSerializer {
Serializers.optionalInstant(deploymentObject.field(lastWrittenField)),
Serializers.optionalDouble(deploymentObject.field(lastQueriesPerSecondField)),
Serializers.optionalDouble(deploymentObject.field(lastWritesPerSecondField))),
- QuotaUsage.create(Serializers.optionalDouble(deploymentObject.field(quotaUsageRateField))));
+ QuotaUsage.create(Serializers.optionalDouble(deploymentObject.field(quotaUsageRateField))),
+ Serializers.optionalDouble(deploymentObject.field(deploymentCostField)));
}
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 2dcf012ac6d..37a173ffc37 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
@@ -96,14 +96,15 @@ public class ApplicationSerializerTest {
Version.fromString("6.3.1"), Instant.ofEpochMilli(496));
Instant activityAt = Instant.parse("2018-06-01T10:15:30.00Z");
deployments.add(new Deployment(zone1, applicationVersion1, Version.fromString("1.2.3"), Instant.ofEpochMilli(3),
- DeploymentMetrics.none, DeploymentActivity.none, QuotaUsage.none));
+ DeploymentMetrics.none, DeploymentActivity.none, QuotaUsage.none, OptionalDouble.empty()));
deployments.add(new Deployment(zone2, applicationVersion2, Version.fromString("1.2.3"), Instant.ofEpochMilli(5),
new DeploymentMetrics(2, 3, 4, 5, 6,
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)),
- QuotaUsage.create(OptionalDouble.of(23.5))));
+ QuotaUsage.create(OptionalDouble.of(23.5)),
+ OptionalDouble.of(12.3)));
var rotationStatus = RotationStatus.from(Map.of(new RotationId("my-rotation"),
new RotationStatus.Targets(