summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorØyvind Grønnesby <oyving@yahooinc.com>2022-06-23 14:37:35 +0200
committerGitHub <noreply@github.com>2022-06-23 14:37:35 +0200
commit7c1985de6e9fcab0a67558b0d0ee9aa8073d44a2 (patch)
tree3a8c36ec87003a891f27d9696c7af10c23c5f952 /controller-server
parent4b68b35aedc4c714a76b158dcd81a7db03a0b7a6 (diff)
parente7091f3c04a4e3940542025186bf357cb19f1d17 (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.java26
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();