diff options
author | Øyvind Grønnesby <oyving@yahooinc.com> | 2022-06-23 14:37:35 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-23 14:37:35 +0200 |
commit | 7c1985de6e9fcab0a67558b0d0ee9aa8073d44a2 (patch) | |
tree | 3a8c36ec87003a891f27d9696c7af10c23c5f952 /controller-server | |
parent | 4b68b35aedc4c714a76b158dcd81a7db03a0b7a6 (diff) | |
parent | e7091f3c04a4e3940542025186bf357cb19f1d17 (diff) |
Merge pull request #23213 from vespa-engine/ogronnesby/scaling-event-api
Expose scaling events in the application api
Diffstat (limited to 'controller-server')
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java | 26 |
1 files changed, 26 insertions, 0 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 cf21b8ef0af..670cb775c69 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 @@ -137,6 +137,8 @@ import java.security.PublicKey; import java.time.DayOfWeek; import java.time.Duration; import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Base64; @@ -283,6 +285,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/environment/{environment}/region/{region}/logs")) return logs(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request.propertyMap()); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/environment/{environment}/region/{region}/access/support")) return supportAccess(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request.propertyMap()); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/environment/{environment}/region/{region}/node/{node}/service-dump")) return getServiceDump(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), path.get("node"), request); + if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/environment/{environment}/region/{region}/scaling")) return scaling(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/metrics")) return metrics(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region")); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/environment/{environment}/region/{region}/global-rotation")) return rotationStatus(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), Optional.ofNullable(request.getProperty("endpointId"))); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/environment/{environment}/region/{region}/global-rotation/override")) return getGlobalRotationOverride(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region")); @@ -1426,6 +1429,29 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { return buildResponseFromProtonMetrics(protonMetrics); } + private HttpResponse scaling(String tenantName, String applicationName, String instanceName, String environment, String region, HttpRequest request) { + var from = Optional.ofNullable(request.getProperty("from")) + .map(Long::valueOf) + .map(Instant::ofEpochSecond) + .orElse(Instant.EPOCH); + var until = Optional.ofNullable(request.getProperty("until")) + .map(Long::valueOf) + .map(Instant::ofEpochSecond) + .orElse(Instant.now(controller.clock())); + + var application = ApplicationId.from(tenantName, applicationName, instanceName); + var zone = requireZone(environment, region); + var deployment = new DeploymentId(application, zone); + var events = controller.serviceRegistry().resourceDatabase().scalingEvents(from, until, deployment); + var slime = new Slime(); + var root = slime.setObject(); + for (var entry : events.entrySet()) { + var serviceRoot = root.setArray(entry.getKey().clusterId().value()); + scalingEventsToSlime(entry.getValue(), serviceRoot); + } + return new SlimeJsonResponse(slime); + } + private JsonResponse buildResponseFromProtonMetrics(List<ProtonMetrics> protonMetrics) { try { var jsonObject = jsonMapper.createObjectNode(); |