summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2021-03-24 19:47:14 +0100
committerJon Bratseth <bratseth@gmail.com>2021-03-24 19:47:14 +0100
commitb88d6461ef52af5c11866f425898cc0251ae4e75 (patch)
treec9ae3debe715a8f7f2c846d77317eeeb494def4e /node-repository
parent32eab56d7dc6ade8a8eb1d359c50dd5dcfa90ef9 (diff)
Add stats to nodes/v2
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java30
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java5
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/stats.json54
3 files changed, 89 insertions, 0 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java
index 52081877d98..8510cf86fef 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java
@@ -29,6 +29,7 @@ import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeMutex;
import com.yahoo.vespa.hosted.provision.NodeRepository;
import com.yahoo.vespa.hosted.provision.applications.Application;
+import com.yahoo.vespa.hosted.provision.autoscale.Load;
import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb;
import com.yahoo.vespa.hosted.provision.node.Address;
import com.yahoo.vespa.hosted.provision.node.Agent;
@@ -125,6 +126,7 @@ public class NodesV2ApiHandler extends LoggingRequestHandler {
if (path.matches( "/nodes/v2/capacity")) return new HostCapacityResponse(nodeRepository, request);
if (path.matches( "/nodes/v2/application")) return applicationList(request.getUri());
if (path.matches( "/nodes/v2/application/{applicationId}")) return application(path.get("applicationId"), request.getUri());
+ if (path.matches( "/nodes/v2/stats")) return stats();
throw new NotFoundException("Nothing at " + path);
}
@@ -452,6 +454,34 @@ public class NodesV2ApiHandler extends LoggingRequestHandler {
return new SlimeJsonResponse(slime);
}
+ private HttpResponse stats() {
+ var stats = nodeRepository.computeStats();
+
+ Slime slime = new Slime();
+ Cursor root = slime.setObject();
+
+ toSlime(stats.load(), root.setObject("load"));
+ toSlime(stats.load(), root.setObject("activeLoad"));
+ Cursor applicationsObject = root.setArray("applications");
+ for (int i = 0; i <= 5; i++) {
+ if (i >= stats.applicationStats().size()) break;
+
+ var applicationStats = stats.applicationStats().get(i);
+ Cursor applicationObject = applicationsObject.addObject();
+ applicationObject.setString("application", applicationStats.id().toFullString());
+ toSlime(applicationStats.load(), applicationObject.setObject("load"));
+ applicationObject.setDouble("cost", applicationStats.cost());
+ applicationObject.setDouble("unutilizedCost", applicationStats.unutilizedCost());
+ }
+ return new SlimeJsonResponse(slime);
+ }
+
+ private void toSlime(Load load, Cursor object) {
+ object.setDouble("cpu", load.cpu());
+ object.setDouble("memory", load.memory());
+ object.setDouble("disk", load.disk());
+ }
+
/** Returns a copy of the given URI with the host and port from the given URI and the path set to the given path */
private URI withPath(String newPath, URI uri) {
try {
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java
index 598692ad598..69f1b72fe09 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java
@@ -260,6 +260,11 @@ public class NodesV2ApiTest {
}
@Test
+ public void test_stats_request() throws Exception {
+ assertFile(new Request("http://localhost:8080/nodes/v2/stats"), "stats.json");
+ }
+
+ @Test
public void maintenance_requests() throws Exception {
// GET a list of all maintenance jobs
assertFile(new Request("http://localhost:8080/nodes/v2/maintenance/"), "maintenance.json");
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/stats.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/stats.json
new file mode 100644
index 00000000000..1613389796c
--- /dev/null
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/stats.json
@@ -0,0 +1,54 @@
+{
+ "load": {
+ "cpu": 0.0,
+ "memory": 0.0,
+ "disk": 0.0
+ },
+ "activeLoad": {
+ "cpu": 0.0,
+ "memory": 0.0,
+ "disk": 0.0
+ },
+ "applications": [
+ {
+ "application": "tenant3.application3.instance3",
+ "load": {
+ "cpu": 0.0,
+ "memory": 0.0,
+ "disk": 0.0
+ },
+ "cost": 0.0,
+ "unutilizedCost": 0.0
+ },
+ {
+ "application": "tenant2.application2.instance2",
+ "load": {
+ "cpu": 0.0,
+ "memory": 0.0,
+ "disk": 0.0
+ },
+ "cost": 0.0,
+ "unutilizedCost": 0.0
+ },
+ {
+ "application": "tenant4.application4.instance4",
+ "load": {
+ "cpu": 0.0,
+ "memory": 0.0,
+ "disk": 0.0
+ },
+ "cost": 0.0,
+ "unutilizedCost": 0.0
+ },
+ {
+ "application": "tenant1.application1.instance1",
+ "load": {
+ "cpu": 0.0,
+ "memory": 0.0,
+ "disk": 0.0
+ },
+ "cost": 0.0,
+ "unutilizedCost": 0.0
+ }
+ ]
+} \ No newline at end of file