diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-02-16 09:18:07 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-16 09:18:07 +0100 |
commit | e13645c831e7e4e00f5a12d57b0fc8f81f2bd3a9 (patch) | |
tree | 2ea3fcd675b129d8a6611d0cd02b0be1e51dced1 /controller-api | |
parent | 466f952a65bd421433d8f7ddde6bdca0bf47d0ce (diff) | |
parent | 750b26387defd3a5fcabf84874bebb2fd412c238 (diff) |
Merge pull request #26051 from vespa-engine/bratseth/cold-autoscaling-2
Exchange BCP info WIP
Diffstat (limited to 'controller-api')
6 files changed, 99 insertions, 19 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Application.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Application.java index dcb7be1ffff..2d04140b365 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Application.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Application.java @@ -20,7 +20,7 @@ public class Application { public Application(ApplicationId id, Collection<Cluster> clusters) { this.id = id; - this.clusters = clusters.stream().collect(Collectors.toUnmodifiableMap(c -> c.id(), c -> c)); + this.clusters = clusters.stream().collect(Collectors.toMap(c -> c.id(), c -> c)); } public ApplicationId id() { return id; } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java index 788c1ea878b..d845057b633 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java @@ -71,7 +71,7 @@ public class Cluster { @Override public String toString() { - return "cluster '" + id + "'"; + return id.toString(); } public static class ScalingEvent { @@ -127,15 +127,17 @@ public class Cluster { private final Instant at; private final Load peak; private final Load ideal; + private final Metrics metrics; public Autoscaling(String status, String description, Optional<ClusterResources> resources, Instant at, - Load peak, Load ideal) { + Load peak, Load ideal, Metrics metrics) { this.status = status; this.description = description; this.resources = resources; this.at = at; this.peak = peak; this.ideal = ideal; + this.metrics = metrics; } public String status() {return status;} @@ -146,6 +148,7 @@ public class Cluster { public Instant at() {return at;} public Load peak() {return peak;} public Load ideal() {return ideal;} + public Metrics metrics() { return metrics; } @Override public boolean equals(Object o) { @@ -156,6 +159,7 @@ public class Cluster { if (!this.at.equals(other.at)) return false; if (!this.peak.equals(other.peak)) return false; if (!this.ideal.equals(other.ideal)) return false; + if (!this.metrics.equals(other.metrics)) return false; return true; } @@ -176,7 +180,17 @@ public class Cluster { Optional.empty(), Instant.EPOCH, Load.zero(), - Load.zero()); + Load.zero(), + Metrics.zero()); + } + + // Used to create BcpGroupInfo + public record Metrics(double queryRate, double growthRateHeadroom, double cpuCostPerQuery) { + + public static Metrics zero() { + return new Metrics(0, 0, 0); + } + } } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java index a65b35b4dbe..1768de8d012 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java @@ -7,7 +7,12 @@ import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.zone.ZoneId; +import com.yahoo.vespa.hosted.controller.api.integration.noderepository.ApplicationPatch; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import java.net.URI; import java.util.List; import java.util.Map; @@ -38,8 +43,7 @@ public interface NodeRepository { Application getApplication(ZoneId zone, ApplicationId application); /** Update application */ - void patchApplication(ZoneId zone, ApplicationId application, - double currentReadShare, double maxReadShare); + void patchApplication(ZoneId zone, ApplicationId application, ApplicationPatch patch); /** Get node statistics such as cost and load from given zone */ NodeRepoStats getStats(ZoneId zone); diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ApplicationPatch.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ApplicationPatch.java index 2bcdf6ef422..4bfd592443b 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ApplicationPatch.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ApplicationPatch.java @@ -1,11 +1,13 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.api.integration.noderepository; -import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.LinkedHashMap; +import java.util.Map; + /** * Patchable data under Application * @@ -15,20 +17,45 @@ import com.fasterxml.jackson.annotation.JsonProperty; @JsonInclude(JsonInclude.Include.NON_NULL) public class ApplicationPatch { - @JsonProperty - private final Double currentReadShare; + @JsonProperty("currentReadShare") + public Double currentReadShare; + + @JsonProperty("maxReadShare") + public Double maxReadShare; + + @JsonProperty("clusters") + public Map<String, ClusterPatch> clusters = new LinkedHashMap<>(); - @JsonProperty - private final Double maxReadShare; + public static class ClusterPatch { + + @JsonProperty("bcpGroupInfo") + public BcpGroupInfo bcpGroupInfo; + + public ClusterPatch(BcpGroupInfo bcpGroupInfo) { + this.bcpGroupInfo = bcpGroupInfo; + } - @JsonCreator - public ApplicationPatch(@JsonProperty("currentReadShare") Double currentReadShare, - @JsonProperty("maxReadShare") Double maxReadShare) { - this.currentReadShare = currentReadShare; - this.maxReadShare = maxReadShare; } - public Double getCurrentReadShare() { return currentReadShare; } - public Double getMaxReadShare() { return maxReadShare; } + public static class BcpGroupInfo { + + @JsonProperty("queryRate") + public Double queryRate; + + @JsonProperty("growthRateHeadroom") + public Double growthRateHeadroom; + + @JsonProperty("cpuCostPerQuery") + public Double cpuCostPerQuery; + + public BcpGroupInfo(@JsonProperty("queryRate")double queryRate, + @JsonProperty("growthRateHeadroom")double growthRateHeadroom, + @JsonProperty("cpuCostPerQuery")double cpuCostPerQuery) { + this.queryRate = queryRate; + this.growthRateHeadroom = growthRateHeadroom; + this.cpuCostPerQuery = cpuCostPerQuery; + } + + } } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingData.java index 3541799b0d0..e82db76831f 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingData.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingData.java @@ -10,6 +10,9 @@ import java.time.Duration; import java.time.Instant; import java.util.Optional; +/** + * @author bratseth + */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) public class AutoscalingData { @@ -32,13 +35,17 @@ public class AutoscalingData { @JsonProperty("ideal") public LoadData ideal; + @JsonProperty("metrics") + public AutoscalingMetricsData metrics; + public Cluster.Autoscaling toAutoscaling() { return new Cluster.Autoscaling(status == null ? "" : status, description == null ? "" : description, resources == null ? Optional.empty() : Optional.ofNullable(resources.toClusterResources()), at == null ? Instant.EPOCH : Instant.ofEpochMilli(at), peak == null ? Load.zero() : peak.toLoad(), - ideal == null ? Load.zero() : ideal.toLoad()); + ideal == null ? Load.zero() : ideal.toLoad(), + metrics == null ? Cluster.Autoscaling.Metrics.zero() : metrics.toMetrics()); } } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingMetricsData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingMetricsData.java new file mode 100644 index 00000000000..fddeea9ed2c --- /dev/null +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingMetricsData.java @@ -0,0 +1,28 @@ +package com.yahoo.vespa.hosted.controller.api.integration.noderepository; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.Cluster; + +/** + * @author bratseth + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class AutoscalingMetricsData { + + @JsonProperty("queryRate") + public Double queryRate; + + @JsonProperty("growthRateHeadroom") + public Double growthRateHeadroom; + + @JsonProperty("cpuCostPerQuery") + public Double cpuCostPerQuery; + + public Cluster.Autoscaling.Metrics toMetrics() { + return new Cluster.Autoscaling.Metrics(queryRate, growthRateHeadroom, cpuCostPerQuery); + } + +} |