diff options
author | Jon Bratseth <bratseth@gmail.com> | 2021-03-24 19:47:14 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2021-03-24 19:47:14 +0100 |
commit | b88d6461ef52af5c11866f425898cc0251ae4e75 (patch) | |
tree | c9ae3debe715a8f7f2c846d77317eeeb494def4e /node-repository | |
parent | 32eab56d7dc6ade8a8eb1d359c50dd5dcfa90ef9 (diff) |
Add stats to nodes/v2
Diffstat (limited to 'node-repository')
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 |