aboutsummaryrefslogtreecommitdiffstats
path: root/controller-api
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-02-16 09:18:07 +0100
committerGitHub <noreply@github.com>2023-02-16 09:18:07 +0100
commite13645c831e7e4e00f5a12d57b0fc8f81f2bd3a9 (patch)
tree2ea3fcd675b129d8a6611d0cd02b0be1e51dced1 /controller-api
parent466f952a65bd421433d8f7ddde6bdca0bf47d0ce (diff)
parent750b26387defd3a5fcabf84874bebb2fd412c238 (diff)
Merge pull request #26051 from vespa-engine/bratseth/cold-autoscaling-2
Exchange BCP info WIP
Diffstat (limited to 'controller-api')
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Application.java2
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java20
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java8
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ApplicationPatch.java51
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingData.java9
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingMetricsData.java28
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);
+ }
+
+}