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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
// 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.Objects;
import java.util.Optional;
import java.util.OptionalDouble;
/**
* Recent activity in a deployment.
*
* @author mpolden
*/
public class DeploymentActivity {
/** Query rates at or below this threshold indicate inactivity */
private static final double inactivityThreshold = 0;
public static final DeploymentActivity none = new DeploymentActivity(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 DeploymentActivity(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 this deployment received queries (search) */
public Optional<Instant> lastQueried() {
return lastQueried;
}
/** The last time this deployment received writes (feed) */
public Optional<Instant> lastWritten() {
return lastWritten;
}
/** Query rate the last time this deployment received queries (search) */
public OptionalDouble lastQueriesPerSecond() {
return lastQueriesPerSecond;
}
/** Write rate the last time this deployment received writes (feed) */
public OptionalDouble lastWritesPerSecond() {
return lastWritesPerSecond;
}
/** Record activity using given metrics */
public DeploymentActivity recordAt(Instant instant, DeploymentMetrics metrics) {
return new DeploymentActivity(activityAt(instant, lastQueried, metrics.queriesPerSecond()),
activityAt(instant, lastWritten, metrics.writesPerSecond()),
activeRate(metrics.queriesPerSecond(), lastQueriesPerSecond),
activeRate(metrics.writesPerSecond(), lastWritesPerSecond));
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DeploymentActivity that = (DeploymentActivity) o;
return lastQueried.equals(that.lastQueried) && lastWritten.equals(that.lastWritten) && lastQueriesPerSecond.equals(that.lastQueriesPerSecond) && lastWritesPerSecond.equals(that.lastWritesPerSecond);
}
@Override
public int hashCode() {
return Objects.hash(lastQueried, lastWritten, lastQueriesPerSecond, lastWritesPerSecond);
}
public static DeploymentActivity create(Optional<Instant> queriedAt, Optional<Instant> writtenAt,
OptionalDouble lastQueriesPerSecond, OptionalDouble lastWritesPerSecond) {
if (queriedAt.isEmpty() && writtenAt.isEmpty()) {
return none;
}
return new DeploymentActivity(queriedAt, writtenAt, lastQueriesPerSecond, lastWritesPerSecond);
}
public static DeploymentActivity create(Optional<Instant> queriedAt, Optional<Instant> writtenAt) {
return create(queriedAt, writtenAt, OptionalDouble.empty(), OptionalDouble.empty());
}
private static OptionalDouble activeRate(double newRate, OptionalDouble oldRate) {
return newRate > inactivityThreshold ? OptionalDouble.of(newRate) : oldRate;
}
private static Optional<Instant> activityAt(Instant newInstant, Optional<Instant> oldInstant, double rate) {
return rate > inactivityThreshold ? Optional.of(newInstant) : oldInstant;
}
}
|