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 Vespa.ai. 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()));
}
}
|