diff options
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MemoryMetricsDb.java')
-rw-r--r-- | node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MemoryMetricsDb.java | 59 |
1 files changed, 12 insertions, 47 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MemoryMetricsDb.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MemoryMetricsDb.java index bf8d354665a..1b1e5933604 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MemoryMetricsDb.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MemoryMetricsDb.java @@ -2,12 +2,9 @@ package com.yahoo.vespa.hosted.provision.autoscale; import com.yahoo.collections.Pair; -import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.ClusterSpec; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; -import java.time.Clock; import java.time.Duration; import java.time.Instant; import java.util.ArrayList; @@ -29,10 +26,8 @@ public class MemoryMetricsDb implements MetricsDb { private final NodeRepository nodeRepository; - /** Metric time series by node (hostname). Each list of metric snapshots is sorted by increasing timestamp */ - private final Map<String, NodeTimeseries> nodeTimeseries = new HashMap<>(); - - private final Map<Pair<ApplicationId, ClusterSpec.Id>, ClusterTimeseries> clusterTimeseries = new HashMap<>(); + /** Metric time seriest by node (hostname). Each list of metric snapshots is sorted by increasing timestamp */ + private final Map<String, NodeTimeseries> db = new HashMap<>(); /** Lock all access for now since we modify lists inside a map */ private final Object lock = new Object(); @@ -42,10 +37,7 @@ public class MemoryMetricsDb implements MetricsDb { } @Override - public Clock clock() { return nodeRepository.clock(); } - - @Override - public void addNodeMetrics(Collection<Pair<String, NodeMetricSnapshot>> nodeMetrics) { + public void add(Collection<Pair<String, MetricSnapshot>> nodeMetrics) { synchronized (lock) { for (var value : nodeMetrics) { add(value.getFirst(), value.getSecond()); @@ -54,48 +46,27 @@ public class MemoryMetricsDb implements MetricsDb { } @Override - public void addClusterMetrics(ApplicationId application, Map<ClusterSpec.Id, ClusterMetricSnapshot> clusterMetrics) { - synchronized (lock) { - for (var value : clusterMetrics.entrySet()) { - add(application, value.getKey(), value.getValue()); - } - } - } - - public void clearClusterMetrics(ApplicationId application, ClusterSpec.Id cluster) { - synchronized (lock) { - clusterTimeseries.remove(new Pair<>(application, cluster)); - } - } - - @Override public List<NodeTimeseries> getNodeTimeseries(Duration period, Set<String> hostnames) { Instant startTime = nodeRepository.clock().instant().minus(period); synchronized (lock) { return hostnames.stream() - .map(hostname -> nodeTimeseries.getOrDefault(hostname, new NodeTimeseries(hostname, List.of())).justAfter(startTime)) + .map(hostname -> db.getOrDefault(hostname, new NodeTimeseries(hostname, List.of())).justAfter(startTime)) .collect(Collectors.toList()); } } @Override - public ClusterTimeseries getClusterTimeseries(ApplicationId application, ClusterSpec.Id cluster) { - return clusterTimeseries.computeIfAbsent(new Pair<>(application, cluster), - __ -> new ClusterTimeseries(cluster, new ArrayList<>())); - } - - @Override public void gc() { synchronized (lock) { // Each measurement is Object + long + float = 16 + 8 + 4 = 28 bytes // 12 hours with 1k nodes and 3 resources and 1 measurement/sec is about 5Gb - for (String hostname : nodeTimeseries.keySet()) { - var timeseries = nodeTimeseries.get(hostname); + for (String hostname : db.keySet()) { + var timeseries = db.get(hostname); timeseries = timeseries.justAfter(nodeRepository.clock().instant().minus(Autoscaler.maxScalingWindow())); if (timeseries.isEmpty()) - nodeTimeseries.remove(hostname); + db.remove(hostname); else - nodeTimeseries.put(hostname, timeseries); + db.put(hostname, timeseries); } } } @@ -103,22 +74,16 @@ public class MemoryMetricsDb implements MetricsDb { @Override public void close() {} - private void add(String hostname, NodeMetricSnapshot snapshot) { - NodeTimeseries timeseries = nodeTimeseries.get(hostname); + private void add(String hostname, MetricSnapshot snapshot) { + NodeTimeseries timeseries = db.get(hostname); if (timeseries == null) { // new node Optional<Node> node = nodeRepository.nodes().node(hostname); if (node.isEmpty()) return; if (node.get().allocation().isEmpty()) return; timeseries = new NodeTimeseries(hostname, new ArrayList<>()); - nodeTimeseries.put(hostname, timeseries); + db.put(hostname, timeseries); } - nodeTimeseries.put(hostname, timeseries.add(snapshot)); - } - - private void add(ApplicationId application, ClusterSpec.Id cluster, ClusterMetricSnapshot snapshot) { - var key = new Pair<>(application, cluster); - var existing = clusterTimeseries.computeIfAbsent(key, __ -> new ClusterTimeseries(cluster, new ArrayList<>())); - clusterTimeseries.put(key, existing.add(snapshot)); + db.put(hostname, timeseries.add(snapshot)); } } |