diff options
author | Jon Bratseth <bratseth@gmail.com> | 2023-02-27 11:18:31 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2023-02-27 11:18:31 +0100 |
commit | 3022b0f16b18e392863e4a114ea756e6e1ba41cc (patch) | |
tree | 9151c3898dba94cd699f61056aa164480ba8802b /node-repository | |
parent | 310e42fc49911471eebcb1f031c954fab5bb17a4 (diff) |
Add details on why an autoscaling is empty
Diffstat (limited to 'node-repository')
4 files changed, 28 insertions, 4 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java index 4020166a132..f52c4cc85f7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java @@ -62,7 +62,7 @@ public class Autoscaler { clusterNodes, nodeRepository.metricsDb(), nodeRepository.clock()); - if (clusterModel.isEmpty()) return Autoscaling.empty(); + if (clusterModel.isEmpty()) return Autoscaling.empty(clusterModel.description()); if (! limits.isEmpty() && cluster.minResources().equals(cluster.maxResources())) return Autoscaling.dontScale(Autoscaling.Status.unavailable, "Autoscaling is not enabled", clusterModel); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaling.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaling.java index 3825309e97b..9506bba73e7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaling.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaling.java @@ -102,8 +102,12 @@ public class Autoscaling { } public static Autoscaling empty() { + return empty(""); + } + + public static Autoscaling empty(String description) { return new Autoscaling(Status.unavailable, - "", + description, Optional.empty(), Instant.EPOCH, Load.zero(), diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java index 4f262fb8105..3f916f1cc59 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java @@ -113,6 +113,10 @@ public class ClusterModel { public ClusterSpec clusterSpec() { return clusterSpec; } public Cluster cluster() { return cluster; } + public String description() { + return nodeTimeseries.description(); + } + public boolean isEmpty() { return nodeTimeseries().isEmpty(); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java index 6c02f7466eb..10f3b54dd45 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java @@ -23,6 +23,8 @@ public class ClusterNodesTimeseries { /** The measurements for all nodes in this snapshot */ private final List<NodeTimeseries> timeseries; + private int initialCount, afterWarmupCount, afterStableCount, finalCount; + public ClusterNodesTimeseries(Duration period, Cluster cluster, NodeList clusterNodes, MetricsDb db) { this.clusterNodes = clusterNodes; @@ -31,12 +33,16 @@ public class ClusterNodesTimeseries { // If either this is the case, or there is a generation change, we ignore // the first warmupWindow metrics. var timeseries = db.getNodeTimeseries(period.plus(warmupDuration.multipliedBy(4)), clusterNodes); + initialCount = totalMeasurementsIn(timeseries); if (cluster.lastScalingEvent().isPresent()) { long currentGeneration = cluster.lastScalingEvent().get().generation(); timeseries = keepGenerationAfterWarmup(timeseries, currentGeneration); + afterWarmupCount = totalMeasurementsIn(timeseries); } timeseries = keep(timeseries, snapshot -> snapshot.inService() && snapshot.stable()); + afterStableCount = totalMeasurementsIn(timeseries); timeseries = keep(timeseries, snapshot -> ! snapshot.at().isBefore(db.clock().instant().minus(period))); + finalCount = totalMeasurementsIn(timeseries); this.timeseries = timeseries; } @@ -45,6 +51,13 @@ public class ClusterNodesTimeseries { this.timeseries = timeseries; } + public String description() { + return "initial measurements: " + initialCount + + ", after warmpup: " + afterWarmupCount + + ", after stable: " + afterStableCount + + ", final measurements: " + finalCount; + } + public boolean isEmpty() { return measurementsPerNode() == 0; } @@ -52,8 +65,11 @@ public class ClusterNodesTimeseries { /** Returns the average number of measurements per node */ public double measurementsPerNode() { if (clusterNodes.size() == 0) return 0; - int measurementCount = timeseries.stream().mapToInt(m -> m.size()).sum(); - return (double)measurementCount / clusterNodes.size(); + return (double) totalMeasurementsIn(timeseries) / clusterNodes.size(); + } + + private int totalMeasurementsIn(List<NodeTimeseries> timeseries) { + return timeseries.stream().mapToInt(m -> m.size()).sum(); } /** Returns the number of nodes measured in this */ |