diff options
author | Ola Aunrønning <olaa@verizonmedia.com> | 2020-02-11 18:08:31 +0100 |
---|---|---|
committer | Ola Aunrønning <olaa@verizonmedia.com> | 2020-02-11 18:17:09 +0100 |
commit | 7ee5738452cbae5413bfc6fb904290a0474dd0ae (patch) | |
tree | 006f4dfa65d505e4af7d9ddd6a05a70988a9d2f5 /controller-server | |
parent | 0200e6c6c57c69f4a877d3f5eccb0b9eeb79f293 (diff) |
Get raw snapshot history for tenant
Diffstat (limited to 'controller-server')
6 files changed, 88 insertions, 9 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index bf1b6c5ab84..f37304025ac 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -56,7 +56,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; import com.yahoo.vespa.hosted.controller.api.integration.deployment.RunId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.SourceRevision; import com.yahoo.vespa.hosted.controller.api.integration.resource.CostInfo; -import com.yahoo.vespa.hosted.controller.api.integration.resource.MeteringInfo; +import com.yahoo.vespa.hosted.controller.api.integration.resource.MeteringData; import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceAllocation; import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceSnapshot; import com.yahoo.vespa.hosted.controller.api.role.Role; @@ -1272,33 +1272,34 @@ public class ApplicationApiHandler extends LoggingRequestHandler { } private HttpResponse metering(String tenant, String application, HttpRequest request) { + Slime slime = new Slime(); Cursor root = slime.setObject(); - MeteringInfo meteringInfo = controller.serviceRegistry() + MeteringData meteringData = controller.serviceRegistry() .meteringService() - .getResourceSnapshots(TenantName.from(tenant), ApplicationName.from(application)); + .getMeteringData(TenantName.from(tenant), ApplicationName.from(application)); - ResourceAllocation currentSnapshot = meteringInfo.getCurrentSnapshot(); + ResourceAllocation currentSnapshot = meteringData.getCurrentSnapshot(); Cursor currentRate = root.setObject("currentrate"); currentRate.setDouble("cpu", currentSnapshot.getCpuCores()); currentRate.setDouble("mem", currentSnapshot.getMemoryGb()); currentRate.setDouble("disk", currentSnapshot.getDiskGb()); - ResourceAllocation thisMonth = meteringInfo.getThisMonth(); + ResourceAllocation thisMonth = meteringData.getThisMonth(); Cursor thismonth = root.setObject("thismonth"); thismonth.setDouble("cpu", thisMonth.getCpuCores()); thismonth.setDouble("mem", thisMonth.getMemoryGb()); thismonth.setDouble("disk", thisMonth.getDiskGb()); - ResourceAllocation lastMonth = meteringInfo.getLastMonth(); + ResourceAllocation lastMonth = meteringData.getLastMonth(); Cursor lastmonth = root.setObject("lastmonth"); lastmonth.setDouble("cpu", lastMonth.getCpuCores()); lastmonth.setDouble("mem", lastMonth.getMemoryGb()); lastmonth.setDouble("disk", lastMonth.getDiskGb()); - Map<ApplicationId, List<ResourceSnapshot>> history = meteringInfo.getSnapshotHistory(); + Map<ApplicationId, List<ResourceSnapshot>> history = meteringData.getSnapshotHistory(); Cursor details = root.setObject("details"); Cursor detailsCpu = details.setObject("cpu"); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiHandler.java index ad847621c3e..ea3559a92ae 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiHandler.java @@ -70,6 +70,7 @@ public class ControllerApiHandler extends AuditLoggingRequestHandler { if (path.matches("/controller/v1/auditlog/")) return new AuditLogResponse(controller.auditLogger().readLog()); if (path.matches("/controller/v1/maintenance/")) return new JobsResponse(maintenance.jobControl()); if (path.matches("/controller/v1/jobs/upgrader")) return new UpgraderResponse(maintenance.upgrader()); + if (path.matches("/controller/v1/metering/tenant/{tenant}/month/{month}")) return new MeteringResponse(controller.serviceRegistry().meteringService(), path.get("tenant"), path.get("month")); return notFound(path); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/MeteringResponse.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/MeteringResponse.java new file mode 100644 index 00000000000..23e3195db01 --- /dev/null +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/controller/MeteringResponse.java @@ -0,0 +1,39 @@ +// Copyright 2020 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.controller.restapi.controller; + +import com.yahoo.config.provision.TenantName; +import com.yahoo.restapi.SlimeJsonResponse; +import com.yahoo.slime.Cursor; +import com.yahoo.slime.Slime; +import com.yahoo.vespa.hosted.controller.api.integration.resource.MeteringClient; +import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceSnapshot; + +import java.time.YearMonth; +import java.util.List; + +/** + * @author olaa + */ +public class MeteringResponse extends SlimeJsonResponse { + + public MeteringResponse(MeteringClient meteringClient, String tenantName, String month) { + super(toSlime(meteringClient, tenantName, month)); + } + + private static Slime toSlime(MeteringClient meteringClient, String tenantName, String month) { + Slime slime = new Slime(); + Cursor root = slime.setArray(); + List<ResourceSnapshot> snapshots = meteringClient.getSnapshotHistoryForTenant(TenantName.from(tenantName), YearMonth.parse(month)); + snapshots.forEach(snapshot -> { + Cursor object = root.addObject(); + object.setString("applicationId", snapshot.getApplicationId().toShortString()); + object.setLong("timestamp", snapshot.getTimestamp().toEpochMilli()); + object.setString("zoneId", snapshot.getZoneId().value()); + object.setDouble("cpu", snapshot.getCpuCores()); + object.setDouble("memory", snapshot.getMemoryGb()); + object.setDouble("disk", snapshot.getDiskGb()); + }); + return slime; + } + +} diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java index 0f846ab57e4..fb7d54759f8 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java @@ -40,7 +40,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.organization.Contact; import com.yahoo.vespa.hosted.controller.api.integration.organization.IssueId; import com.yahoo.vespa.hosted.controller.api.integration.organization.User; import com.yahoo.vespa.hosted.controller.api.integration.resource.CostInfo; -import com.yahoo.vespa.hosted.controller.api.integration.resource.MeteringInfo; +import com.yahoo.vespa.hosted.controller.api.integration.resource.MeteringData; import com.yahoo.vespa.hosted.controller.api.integration.resource.MockTenantCost; import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceAllocation; import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceSnapshot; @@ -944,7 +944,7 @@ public class ApplicationApiTest extends ControllerContainerTest { new ResourceSnapshot(applicationId, 1, 2,3, Instant.ofEpochMilli(246), ZoneId.defaultId()), new ResourceSnapshot(applicationId, 1, 2,3, Instant.ofEpochMilli(492), ZoneId.defaultId()))); - mockMeteringClient.setMeteringInfo(new MeteringInfo(thisMonth, lastMonth, currentSnapshot, snapshotHistory)); + mockMeteringClient.setMeteringData(new MeteringData(thisMonth, lastMonth, currentSnapshot, snapshotHistory)); tester.assertResponse(request("/application/v4/tenant/doesnotexist/application/doesnotexist/metering", GET) .userIdentity(USER_ID) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiTest.java index b21c588235e..8029d650b75 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/ControllerApiTest.java @@ -2,8 +2,11 @@ package com.yahoo.vespa.hosted.controller.restapi.controller; import com.yahoo.application.container.handler.Request; +import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.test.ManualClock; +import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceSnapshot; import com.yahoo.vespa.hosted.controller.auditlog.AuditLogger; import com.yahoo.vespa.hosted.controller.restapi.ContainerTester; import com.yahoo.vespa.hosted.controller.restapi.ControllerContainerTest; @@ -15,6 +18,7 @@ import java.io.File; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.Instant; +import java.util.List; import java.util.Set; import static org.junit.Assert.assertFalse; @@ -156,4 +160,20 @@ public class ControllerApiTest extends ControllerContainerTest { tester.assertResponse(authenticatedRequest("http://localhost:8080/controller/v1/auditlog/"), new File("auditlog.json")); } + @Test + public void testMeteringApi() { + ApplicationId applicationId = ApplicationId.from("tenant", "app", "instance"); + Instant timestamp = Instant.ofEpochMilli(123456789); + ZoneId zoneId = ZoneId.defaultId(); + List<ResourceSnapshot> snapshots = List.of( + new ResourceSnapshot(applicationId, 12,48,1200, timestamp, zoneId), + new ResourceSnapshot(applicationId, 24, 96,2400, timestamp, zoneId) + ); + tester.controller().serviceRegistry().meteringService().consume(snapshots); + tester.assertResponse( + operatorRequest("http://localhost:8080/controller/v1/metering/tenant/tenantName/month/2020-02", "", Request.Method.GET), + new File("metering.json") + ); + } + } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/metering.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/metering.json new file mode 100644 index 00000000000..b64e8f26a63 --- /dev/null +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/metering.json @@ -0,0 +1,18 @@ +[ + { + "applicationId": "tenant.app.instance", + "timestamp": 123456789, + "zoneId": "prod.default", + "cpu": 12.0, + "memory": 48.0, + "disk": 1200.0 + }, + { + "applicationId": "tenant.app.instance", + "timestamp": 123456789, + "zoneId": "prod.default", + "cpu": 24.0, + "memory": 96.0, + "disk": 2400.0 + } +]
\ No newline at end of file |