From bbd2558265dd80455f6b03285be926017c20a6ab Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Tue, 16 Feb 2021 21:42:34 +0100 Subject: Expose the last hour average utilization --- .../vespa/hosted/provision/autoscale/ClusterTimeseries.java | 1 + .../hosted/provision/restapi/ApplicationSerializer.java | 13 ++++++++++++- .../hosted/provision/restapi/responses/application1.json | 5 +++++ .../hosted/provision/restapi/responses/application2.json | 5 +++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterTimeseries.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterTimeseries.java index 147335753eb..e359579117f 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterTimeseries.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterTimeseries.java @@ -49,6 +49,7 @@ public class ClusterTimeseries { /** Returns the average load of this resource in this */ public double averageLoad(Resource resource) { int measurementCount = allTimeseries.stream().mapToInt(m -> m.size()).sum(); + if (measurementCount == 0) return 0; double measurementSum = allTimeseries.stream().flatMap(m -> m.asList().stream()).mapToDouble(m -> value(resource, m)).sum(); return measurementSum / measurementCount; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java index 9206f80080b..ceaf88dd7d9 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java @@ -10,9 +10,12 @@ import com.yahoo.vespa.hosted.provision.applications.Application; import com.yahoo.vespa.hosted.provision.applications.Cluster; import com.yahoo.vespa.hosted.provision.applications.ScalingEvent; import com.yahoo.vespa.hosted.provision.autoscale.AllocatableClusterResources; +import com.yahoo.vespa.hosted.provision.autoscale.ClusterTimeseries; import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb; +import com.yahoo.vespa.hosted.provision.autoscale.Resource; import java.net.URI; +import java.time.Duration; import java.util.Collection; import java.util.List; @@ -59,7 +62,7 @@ public class ApplicationSerializer { if (cluster.shouldSuggestResources(currentResources)) cluster.suggestedResources().ifPresent(suggested -> toSlime(suggested.resources(), clusterObject.setObject("suggested"))); cluster.targetResources().ifPresent(target -> toSlime(target, clusterObject.setObject("target"))); - //toSlime(metricsDb.getNodeTimeseries(NodeList.copyOf(nodes),)) + clusterUtilizationToSlime(cluster, NodeList.copyOf(applicationNodes), metricsDb, clusterObject.setObject("utilization")); scalingEventsToSlime(cluster.scalingEvents(), clusterObject.setArray("scalingEvents")); clusterObject.setString("autoscalingStatus", cluster.autoscalingStatus()); } @@ -70,6 +73,14 @@ public class ApplicationSerializer { NodeResourcesSerializer.toSlime(resources.nodeResources(), clusterResourcesObject.setObject("resources")); } + private static void clusterUtilizationToSlime(Cluster cluster, NodeList nodes, MetricsDb metricsDb, Cursor utilizationObject) { + var timeseries = new ClusterTimeseries(Duration.ofHours(1), cluster, nodes, metricsDb); + + utilizationObject.setDouble("cpu", timeseries.averageLoad(Resource.cpu)); + utilizationObject.setDouble("memory", timeseries.averageLoad(Resource.memory)); + utilizationObject.setDouble("disk", timeseries.averageLoad(Resource.disk)); + } + private static void scalingEventsToSlime(List scalingEvents, Cursor scalingEventsArray) { for (ScalingEvent scalingEvent : scalingEvents) { Cursor scalingEventObject = scalingEventsArray.addObject(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application1.json index 82f7e04f92b..a35c742bc2a 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application1.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application1.json @@ -63,6 +63,11 @@ "storageType" : "any" } }, + "utilization" : { + "cpu" : 0.0, + "memory" : 0.0, + "disk" : 0.0 + }, "scalingEvents" : [ { "from": { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application2.json index 0ee590f60e0..baf2528c74a 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application2.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application2.json @@ -39,6 +39,11 @@ "storageType": "local" } }, + "utilization" : { + "cpu" : 0.0, + "memory" : 0.0, + "disk" : 0.0 + }, "scalingEvents" : [ { "from": { -- cgit v1.2.3