diff options
author | Martin Polden <mpolden@mpolden.no> | 2018-06-08 14:57:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-08 14:57:57 +0200 |
commit | 9fa71da75e98f8486884a45ef4035763997fd620 (patch) | |
tree | 4ad7c0d49ccedbfc2758ee6da29d6e1df8db3fe6 | |
parent | 87ccad88a9f9c30a9fb924d1f2e5638f8930406a (diff) | |
parent | 078f9fd5e50d49e37e8328a68a27eb9d3fbb7a03 (diff) |
Merge pull request #6134 from vespa-engine/mpolden/application-activity
Add application level activity
6 files changed, 81 insertions, 0 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java index 295b1adbca9..295e0102782 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java @@ -10,6 +10,7 @@ import com.yahoo.config.provision.Environment; import com.yahoo.vespa.hosted.controller.api.integration.MetricsService.ApplicationMetrics; import com.yahoo.vespa.hosted.controller.api.integration.organization.IssueId; import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneId; +import com.yahoo.vespa.hosted.controller.application.ApplicationActivity; import com.yahoo.vespa.hosted.controller.application.ApplicationRotation; import com.yahoo.vespa.hosted.controller.application.ApplicationVersion; import com.yahoo.vespa.hosted.controller.application.Change; @@ -142,14 +143,21 @@ public class Application { */ public Change outstandingChange() { return outstandingChange; } + /** Returns ID of the last ownership issue filed for this */ public Optional<IssueId> ownershipIssueId() { return ownershipIssueId; } + /** Returns metrics for this */ public ApplicationMetrics metrics() { return metrics; } + /** Returns activity for this */ + public ApplicationActivity activity() { + return ApplicationActivity.from(deployments.values()); + } + /** * Returns the oldest platform version this has deployed in a permanent zone (not test or staging). */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationActivity.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationActivity.java new file mode 100644 index 00000000000..ddd519382a6 --- /dev/null +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationActivity.java @@ -0,0 +1,56 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.controller.application; + +import java.time.Instant; +import java.util.Collection; +import java.util.Comparator; +import java.util.Optional; +import java.util.function.Function; + +/** + * Recent activity in an application. + * + * @author mpolden + */ +public class ApplicationActivity { + + public static final ApplicationActivity none = new ApplicationActivity(Optional.empty(), Optional.empty()); + + private final Optional<Instant> lastQueried; + private final Optional<Instant> lastWritten; + + private ApplicationActivity(Optional<Instant> lastQueried, Optional<Instant> lastWritten) { + this.lastQueried = lastQueried; + this.lastWritten = lastWritten; + } + + /** The last time any deployment in this was queried */ + public Optional<Instant> lastQueried() { + return lastQueried; + } + + /** The last time any deployment in this was written */ + public Optional<Instant> lastWritten() { + return lastWritten; + } + + public static ApplicationActivity from(Collection<Deployment> deployments) { + Optional<Instant> lastQueried = lastActivity(deployments, DeploymentActivity::lastQueried); + Optional<Instant> lastWritten = lastActivity(deployments, DeploymentActivity::lastWritten); + if (!lastQueried.isPresent() && !lastWritten.isPresent()) { + return none; + } + return new ApplicationActivity(lastQueried, lastWritten); + } + + private static Optional<Instant> lastActivity(Collection<Deployment> deployments, + Function<DeploymentActivity, Optional<Instant>> activityField) { + return deployments.stream() + .map(Deployment::activity) + .map(activityField) + .filter(Optional::isPresent) + .map(Optional::get) + .max(Comparator.naturalOrder()); + } + +} 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 6b35e09e049..3eced6d943e 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 @@ -425,6 +425,11 @@ public class ApplicationApiHandler extends LoggingRequestHandler { metricsObject.setDouble("queryServiceQuality", application.metrics().queryServiceQuality()); metricsObject.setDouble("writeServiceQuality", application.metrics().writeServiceQuality()); + // Activity + Cursor activity = object.setObject("activity"); + application.activity().lastQueried().ifPresent(lastQueried -> activity.setLong("queriedAt", lastQueried.toEpochMilli())); + application.activity().lastWritten().ifPresent(lastQueried -> activity.setLong("writtenAt", lastQueried.toEpochMilli())); + application.ownershipIssueId().ifPresent(issueId -> object.setString("ownershipIssueId", issueId.value())); application.deploymentJobs().issueId().ifPresent(issueId -> object.setString("deploymentIssueId", issueId.value())); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application-without-change-multiple-deployments.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application-without-change-multiple-deployments.json index 30070e509c7..f8c4c26d6a8 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application-without-change-multiple-deployments.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application-without-change-multiple-deployments.json @@ -249,5 +249,9 @@ "metrics": { "queryServiceQuality": 0.5, "writeServiceQuality": 0.7 + }, + "activity": { + "queriedAt": 1527848130000, + "writtenAt": 1527848130000 } } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application.json index dabeb3239aa..fc0f83c2cdc 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application.json @@ -234,5 +234,9 @@ "metrics": { "queryServiceQuality": 0.5, "writeServiceQuality": 0.7 + }, + "activity": { + "queriedAt": 1527848130000, + "writtenAt": 1527848130000 } } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application1-recursive.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application1-recursive.json index 174bb2f1ba7..8bb1ee83282 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application1-recursive.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application1-recursive.json @@ -222,6 +222,10 @@ "queryServiceQuality": 0.5, "writeServiceQuality": 0.7 }, + "activity": { + "queriedAt": 1527848130000, + "writtenAt": 1527848130000 + }, "ownershipIssueId": "321", "deploymentIssueId": "123" } |