summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2023-02-27 11:18:31 +0100
committerJon Bratseth <bratseth@gmail.com>2023-02-27 11:18:31 +0100
commit3022b0f16b18e392863e4a114ea756e6e1ba41cc (patch)
tree9151c3898dba94cd699f61056aa164480ba8802b /node-repository
parent310e42fc49911471eebcb1f031c954fab5bb17a4 (diff)
Add details on why an autoscaling is empty
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaling.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterNodesTimeseries.java20
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 */