diff options
author | Jon Bratseth <bratseth@gmail.com> | 2023-01-02 16:55:03 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2023-01-02 16:55:03 +0100 |
commit | 20a6b5041b179a382a90ca37382a0b6ba3f963f7 (patch) | |
tree | 08997145ac9497279caacf295b0b09261cdce1de /controller-api | |
parent | e5d908c70f1063b05c965e989af1da8c4cb393b1 (diff) |
Output load in target/suggested block
Diffstat (limited to 'controller-api')
6 files changed, 156 insertions, 111 deletions
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 d2b1f6a0803..b7a71cc7b91 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 @@ -20,12 +20,9 @@ public class Cluster { private final ClusterResources min; private final ClusterResources max; private final ClusterResources current; - private final Optional<ClusterResources> target; - private final Optional<ClusterResources> suggested; - private final Utilization utilization; + private final Autoscaling target; + private final Autoscaling suggested; private final List<ScalingEvent> scalingEvents; - private final String autoscalingStatusCode; - private final String autoscalingStatus; private final Duration scalingDuration; public Cluster(ClusterSpec.Id id, @@ -33,12 +30,9 @@ public class Cluster { ClusterResources min, ClusterResources max, ClusterResources current, - Optional<ClusterResources> target, - Optional<ClusterResources> suggested, - Utilization utilization, + Autoscaling target, + Autoscaling suggested, List<ScalingEvent> scalingEvents, - String autoscalingStatusCode, - String autoscalingStatus, Duration scalingDuration) { this.id = id; this.type = type; @@ -47,24 +41,26 @@ public class Cluster { this.current = current; this.target = target; this.suggested = suggested; - this.utilization = utilization; this.scalingEvents = scalingEvents; - this.autoscalingStatusCode = autoscalingStatusCode; - this.autoscalingStatus = autoscalingStatus; this.scalingDuration = scalingDuration; } public ClusterSpec.Id id() { return id; } + public ClusterSpec.Type type() { return type; } + public ClusterResources min() { return min; } + public ClusterResources max() { return max; } + public ClusterResources current() { return current; } - public Optional<ClusterResources> target() { return target; } - public Optional<ClusterResources> suggested() { return suggested; } - public Utilization utilization() { return utilization; } + + public Autoscaling target() { return target; } + + public Autoscaling suggested() { return suggested; } + public List<ScalingEvent> scalingEvents() { return scalingEvents; } - public String autoscalingStatusCode() { return autoscalingStatusCode; } - public String autoscalingStatus() { return autoscalingStatus; } + public Duration scalingDuration() { return scalingDuration; } @Override @@ -72,40 +68,6 @@ public class Cluster { return "cluster '" + id + "'"; } - public static class Utilization { - - private final double idealCpu, peakCpu; - private final double idealMemory, peakMemory; - private final double idealDisk, peakDisk; - - public Utilization(double idealCpu, double peakCpu, - double idealMemory, double peakMemory, - double idealDisk, double peakDisk) { - this.idealCpu = idealCpu; - this.peakCpu = peakCpu; - - this.idealMemory = idealMemory; - this.peakMemory = peakMemory; - - this.idealDisk = idealDisk; - this.peakDisk = peakDisk; - } - - public double idealCpu() { return idealCpu; } - public double peakCpu() { return peakCpu; } - - public double idealMemory() { return idealMemory; } - public double peakMemory() { return peakMemory; } - - public double idealDisk() { return idealDisk; } - public double peakDisk() { return peakDisk; } - - public static Utilization empty() { return new Utilization(0, 0, - 0, 0, - 0, 0); } - - } - public static class ScalingEvent { private final ClusterResources from, to; @@ -119,10 +81,13 @@ public class Cluster { this.completion = completion; } - public ClusterResources from() { return from; } - public ClusterResources to() { return to; } - public Instant at() { return at; } - public Optional<Instant> completion() { return completion; } + public ClusterResources from() {return from;} + + public ClusterResources to() {return to;} + + public Instant at() {return at;} + + public Optional<Instant> completion() {return completion;} @Override public boolean equals(Object o) { @@ -140,12 +105,74 @@ public class Cluster { @Override public String toString() { return "ScalingEvent{" + - "from=" + from + - ", to=" + to + - ", at=" + at + - ", completion=" + completion + - '}'; + "from=" + from + + ", to=" + to + + ", at=" + at + + ", completion=" + completion + + '}'; } } + public static class Autoscaling { + + private final String status; + private final String description; + private final Optional<ClusterResources> resources; + private final Instant at; + private final Load peak; + private final Load ideal; + + public Autoscaling(String status, String description, Optional<ClusterResources> resources, Instant at, + Load peak, Load ideal) { + this.status = status; + this.description = description; + this.resources = resources; + this.at = at; + this.peak = peak; + this.ideal = ideal; + } + + public String status() {return status;} + public String description() {return description;} + public Optional<ClusterResources> resources() { + return resources; + } + public Instant at() {return at;} + public Load peak() {return peak;} + public Load ideal() {return ideal;} + + @Override + public boolean equals(Object o) { + if (!(o instanceof Autoscaling other)) return false; + if (!this.status.equals(other.status)) return false; + if (!this.description.equals(other.description)) return false; + if (!this.resources.equals(other.resources)) return false; + if (!this.at.equals(other.at)) return false; + if (!this.peak.equals(other.peak)) return false; + if (!this.ideal.equals(other.ideal)) return false; + return true; + } + + @Override + public int hashCode() { + return Objects.hash(status, description, at, peak, ideal); + } + + @Override + public String toString() { + return (resources.isPresent() ? "Autoscaling to " + resources : "Don't autoscale") + + (description.isEmpty() ? "" : ": " + description); + } + + public static Autoscaling empty() { + return new Autoscaling("unavailable", + "", + Optional.empty(), + Instant.EPOCH, + Load.zero(), + Load.zero()); + } + + } + } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Load.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Load.java index 548fac7d11b..f954d0c8392 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Load.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Load.java @@ -1,6 +1,8 @@ // 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.configserver; +import java.util.Objects; + /** * @author bratseth */ @@ -20,10 +22,20 @@ public class Load { public double memory() { return memory; } public double disk() { return disk; } + @Override public String toString() { return "load: cpu " + cpu + ", memory " + memory + ", disk " + disk; } + @Override + public int hashCode() { return Objects.hash(cpu, memory, disk); } + + @Override + public boolean equals(Object o) { + if ( ! (o instanceof Load other)) return false; + return cpu == other.cpu && memory == other.memory && disk == other.disk; + } + public static Load zero() { return new Load(0, 0, 0); } } 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 new file mode 100644 index 00000000000..3541799b0d0 --- /dev/null +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingData.java @@ -0,0 +1,44 @@ +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; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.Load; + +import java.time.Duration; +import java.time.Instant; +import java.util.Optional; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class AutoscalingData { + + @JsonProperty("status") + public String status; + + @JsonProperty("description") + public String description; + + @JsonProperty("resources") + public ClusterResourcesData resources; + + @JsonProperty("at") + public Long at; + + @JsonProperty("peak") + public LoadData peak; + + @JsonProperty("ideal") + public LoadData ideal; + + 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()); + } + +} diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java index 574b6149508..539f0545c88 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java @@ -21,24 +21,25 @@ public class ClusterData { @JsonProperty("type") public String type; + @JsonProperty("min") public ClusterResourcesData min; + @JsonProperty("max") public ClusterResourcesData max; + @JsonProperty("current") public ClusterResourcesData current; + @JsonProperty("suggested") - public ClusterResourcesData suggested; + public AutoscalingData suggested; + @JsonProperty("target") - public ClusterResourcesData target; - @JsonProperty("utilization") - public ClusterUtilizationData utilization; + public AutoscalingData target; + @JsonProperty("scalingEvents") public List<ScalingEventData> scalingEvents; - @JsonProperty("autoscalingStatusCode") - public String autoscalingStatusCode; - @JsonProperty("autoscalingStatus") - public String autoscalingStatus; + @JsonProperty("scalingDuration") public Long scalingDuration; @@ -48,13 +49,10 @@ public class ClusterData { min.toClusterResources(), max.toClusterResources(), current.toClusterResources(), - target == null ? Optional.empty() : Optional.of(target.toClusterResources()), - suggested == null ? Optional.empty() : Optional.of(suggested.toClusterResources()), - utilization == null ? Cluster.Utilization.empty() : utilization.toClusterUtilization(), + target == null ? Cluster.Autoscaling.empty() : target.toAutoscaling(), + suggested == null ? Cluster.Autoscaling.empty() : suggested.toAutoscaling(), scalingEvents == null ? List.of() : scalingEvents.stream().map(data -> data.toScalingEvent()).toList(), - autoscalingStatusCode, - autoscalingStatus, scalingDuration == null ? Duration.ofMillis(0) : Duration.ofMillis(scalingDuration)); } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java index 801ee4ee853..2a9ab1e3a55 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java @@ -23,6 +23,7 @@ public class ClusterResourcesData { public NodeResources resources; public ClusterResources toClusterResources() { + if (resources == null) return null; // TODO: Compatibility, remove after January 2023 return new ClusterResources(nodes, groups, resources.toNodeResources()); } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterUtilizationData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterUtilizationData.java deleted file mode 100644 index b4fee25d1ad..00000000000 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterUtilizationData.java +++ /dev/null @@ -1,37 +0,0 @@ -// 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.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.yahoo.vespa.hosted.controller.api.integration.configserver.Cluster; - -/** - * Utilization ratios - * - * @author bratseth - */ -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonInclude(JsonInclude.Include.NON_NULL) -public class ClusterUtilizationData { - - @JsonProperty("idealCpu") - public Double idealCpu; - @JsonProperty("peakCpu") - public Double peakCpu; - - @JsonProperty("idealMemory") - public Double idealMemory; - @JsonProperty("peakMemory") - public Double peakMemory; - - @JsonProperty("idealDisk") - public Double idealDisk; - @JsonProperty("peakDisk") - public Double peakDisk; - - public Cluster.Utilization toClusterUtilization() { - return new Cluster.Utilization(idealCpu, peakCpu, idealMemory, peakMemory, idealDisk, peakDisk); - } - -} |