diff options
author | Valerij Fredriksen <valerij92@gmail.com> | 2021-05-31 12:12:48 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerij92@gmail.com> | 2021-05-31 15:52:41 +0200 |
commit | 0a84d8be46ade948a40a57be59590c3655130314 (patch) | |
tree | 96025c85039a59360dc3e0b90352db14a710f0f1 /controller-server/src | |
parent | 8509f12256bc2b2d8e934bf3f527d196b2feb978 (diff) |
Add cost to Deployment
Diffstat (limited to 'controller-server/src')
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( |