aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationActivity.java
blob: 09acb12d6604e77955100bd374bf2491866c7952 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Copyright Yahoo. 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.Objects;
import java.util.Optional;
import java.util.OptionalDouble;
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(),
                                                                           OptionalDouble.empty(),
                                                                           OptionalDouble.empty());

    private final Optional<Instant> lastQueried;
    private final Optional<Instant> lastWritten;
    private final OptionalDouble lastQueriesPerSecond;
    private final OptionalDouble lastWritesPerSecond;

    private ApplicationActivity(Optional<Instant> lastQueried, Optional<Instant> lastWritten,
                                OptionalDouble lastQueriesPerSecond, OptionalDouble lastWritesPerSecond) {
        this.lastQueried = Objects.requireNonNull(lastQueried, "lastQueried must be non-null");
        this.lastWritten = Objects.requireNonNull(lastWritten, "lastWritten must be non-null");
        this.lastQueriesPerSecond = Objects.requireNonNull(lastQueriesPerSecond, "lastQueriesPerSecond must be non-null");
        this.lastWritesPerSecond = Objects.requireNonNull(lastWritesPerSecond, "lastWritesPerSecond must be non-null");
    }

    /** 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;
    }

    /** Query rate the last time this was queried */
    public OptionalDouble lastQueriesPerSecond() {
        return lastQueriesPerSecond;
    }

    /** Write rate the last time this was written */
    public OptionalDouble lastWritesPerSecond() {
        return lastWritesPerSecond;
    }

    public static ApplicationActivity from(Collection<Deployment> deployments) {
        Optional<DeploymentActivity> lastActivityByQuery = lastActivityBy(DeploymentActivity::lastQueried, deployments);
        Optional<DeploymentActivity> lastActivityByWrite = lastActivityBy(DeploymentActivity::lastWritten, deployments);
        if (lastActivityByQuery.isEmpty() && lastActivityByWrite.isEmpty()) {
            return none;
        }
        return new ApplicationActivity(lastActivityByQuery.flatMap(DeploymentActivity::lastQueried),
                                       lastActivityByWrite.flatMap(DeploymentActivity::lastWritten),
                                       lastActivityByQuery.map(DeploymentActivity::lastQueriesPerSecond)
                                                          .orElseGet(OptionalDouble::empty),
                                       lastActivityByWrite.map(DeploymentActivity::lastWritesPerSecond)
                                                          .orElseGet(OptionalDouble::empty));
    }

    private static Optional<DeploymentActivity> lastActivityBy(Function<DeploymentActivity, Optional<Instant>> field,
                                                               Collection<Deployment> deployments) {
        return deployments.stream()
                          .map(Deployment::activity)
                          .filter(activity -> field.apply(activity).isPresent())
                          .max(Comparator.comparing(activity -> field.apply(activity).get()));
    }

}