diff options
author | Jon Bratseth <bratseth@gmail.com> | 2020-10-21 08:43:19 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2020-10-22 15:34:50 +0200 |
commit | 081c3fb60c09797e64f317563901c3aefa35f3f0 (patch) | |
tree | 87d5add0ebc9e45af6c64a9cce84fe12ccf0043e | |
parent | 53e5f06cd8e545be91a7fc1e9cf0e7eacb249aae (diff) |
Create MetricsDb interface
14 files changed, 104 insertions, 70 deletions
diff --git a/node-repository/src/main/config/node-repository.xml b/node-repository/src/main/config/node-repository.xml index a51b0a2287d..0f61ff831ef 100644 --- a/node-repository/src/main/config/node-repository.xml +++ b/node-repository/src/main/config/node-repository.xml @@ -2,7 +2,7 @@ <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> <component id="com.yahoo.vespa.hosted.provision.provisioning.InfraDeployerImpl" bundle="node-repository"/> <component id="com.yahoo.vespa.hosted.provision.autoscale.MetricsV2MetricsFetcher" bundle="node-repository"/> -<component id="com.yahoo.vespa.hosted.provision.autoscale.NodeMetricsDb" bundle="node-repository"/> +<component id="com.yahoo.vespa.hosted.provision.autoscale.MetricsDb" bundle="node-repository"/> <component id="com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner" bundle="node-repository" /> <component id="NodeRepository" class="com.yahoo.vespa.hosted.provision.NodeRepository" bundle="node-repository"/> <component id="com.yahoo.vespa.hosted.provision.maintenance.NodeRepositoryMaintenance" bundle="node-repository"/> diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java index 5b26c53b937..f1835302b18 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java @@ -24,11 +24,11 @@ public class Autoscaler { /** What difference factor for a resource is worth a reallocation? */ private static final double resourceDifferenceWorthReallocation = 0.1; - private final NodeMetricsDb metricsDb; + private final MetricsDb metricsDb; private final NodeRepository nodeRepository; private final AllocationOptimizer allocationOptimizer; - public Autoscaler(NodeMetricsDb metricsDb, NodeRepository nodeRepository) { + public Autoscaler(MetricsDb metricsDb, NodeRepository nodeRepository) { this.metricsDb = metricsDb; this.nodeRepository = nodeRepository; this.allocationOptimizer = new AllocationOptimizer(nodeRepository); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterTimeseries.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterTimeseries.java index 52f6a5bbabc..58bc08165d0 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterTimeseries.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterTimeseries.java @@ -26,7 +26,7 @@ public class ClusterTimeseries { /** The measurements for all hosts in this snapshot */ private final List<NodeTimeseries> nodeTimeseries; - public ClusterTimeseries(Cluster cluster, List<Node> clusterNodes, NodeMetricsDb db, NodeRepository nodeRepository) { + public ClusterTimeseries(Cluster cluster, List<Node> clusterNodes, MetricsDb db, NodeRepository nodeRepository) { this.clusterNodes = clusterNodes; ClusterSpec.Type clusterType = clusterNodes.get(0).allocation().get().membership().cluster().type(); this.nodeTimeseries = db.getNodeTimeseries(nodeRepository.clock().instant().minus(Autoscaler.scalingWindow(clusterType)), diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsDb.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MemoryMetricsDb.java index 271f8601ae2..c00cd60dfcf 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/NodeMetricsDb.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MemoryMetricsDb.java @@ -13,15 +13,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; /** - * An in-memory time-series "database" of node metrics. + * An in-memory implementation of the metrics Db. * Thread model: One writer, many readers. * * @author bratseth */ -public class NodeMetricsDb { +public class MemoryMetricsDb implements MetricsDb { private final NodeRepository nodeRepository; @@ -31,11 +30,11 @@ public class NodeMetricsDb { /** Lock all access for now since we modify lists inside a map */ private final Object lock = new Object(); - public NodeMetricsDb(NodeRepository nodeRepository) { + public MemoryMetricsDb(NodeRepository nodeRepository) { this.nodeRepository = nodeRepository; } - /** Adds snapshots to this. */ + @Override public void add(Collection<Pair<String, MetricSnapshot>> nodeMetrics) { synchronized (lock) { for (var value : nodeMetrics) { @@ -44,21 +43,7 @@ public class NodeMetricsDb { } } - private void add(String hostname, MetricSnapshot snapshot) { - NodeTimeseries timeseries = db.get(hostname); - if (timeseries == null) { // new node - Optional<Node> node = nodeRepository.getNode(hostname); - if (node.isEmpty()) return; - if (node.get().allocation().isEmpty()) return; - timeseries = new NodeTimeseries(hostname, - node.get().allocation().get().membership().cluster().type(), - new ArrayList<>()); - db.put(hostname, timeseries); - } - db.put(hostname, timeseries.add(snapshot)); - } - - /** Must be called intermittently (as long as any add methods are called) to gc old data */ + @Override public void gc(Clock clock) { synchronized (lock) { // Each measurement is Object + long + float = 16 + 8 + 4 = 28 bytes @@ -74,10 +59,7 @@ public class NodeMetricsDb { } } - /** - * Returns a list of measurements with one entry for each of the given host names - * which have any values after startTime, in the same order - */ + @Override public List<NodeTimeseries> getNodeTimeseries(Instant startTime, List<String> hostnames) { synchronized (lock) { List<NodeTimeseries> measurementsList = new ArrayList<>(hostnames.size()); @@ -92,4 +74,21 @@ public class NodeMetricsDb { } } + @Override + public void close() {} + + private void add(String hostname, MetricSnapshot snapshot) { + NodeTimeseries timeseries = db.get(hostname); + if (timeseries == null) { // new node + Optional<Node> node = nodeRepository.getNode(hostname); + if (node.isEmpty()) return; + if (node.get().allocation().isEmpty()) return; + timeseries = new NodeTimeseries(hostname, + node.get().allocation().get().membership().cluster().type(), + new ArrayList<>()); + db.put(hostname, timeseries); + } + db.put(hostname, timeseries.add(snapshot)); + } + } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsDb.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsDb.java new file mode 100644 index 00000000000..c9cf295cade --- /dev/null +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsDb.java @@ -0,0 +1,37 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.provision.autoscale; + +import com.yahoo.collections.Pair; +import com.yahoo.vespa.hosted.provision.NodeRepository; + +import java.time.Clock; +import java.time.Instant; +import java.util.Collection; +import java.util.List; + +/** + * An in-memory time-series database of node metrics. + * + * @author bratseth + */ +public interface MetricsDb { + + /** Adds snapshots to this. */ + void add(Collection<Pair<String, MetricSnapshot>> nodeMetrics); + + /** Must be called intermittently (as long as add is called) to gc old data */ + void gc(Clock clock); + + /** + * Returns a list of time series for each of the given host names + * which have any values after startTime. + */ + List<NodeTimeseries> getNodeTimeseries(Instant startTime, List<String> hostnames); + + void close(); + + static MetricsDb createTestInstance(NodeRepository nodeRepository) { + return new MemoryMetricsDb(nodeRepository); + } + +} diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java index 2a38dec3230..3b01f678982 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java @@ -11,10 +11,9 @@ import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.applications.Application; import com.yahoo.vespa.hosted.provision.applications.Applications; import com.yahoo.vespa.hosted.provision.applications.Cluster; -import com.yahoo.vespa.hosted.provision.applications.ScalingEvent; import com.yahoo.vespa.hosted.provision.autoscale.AllocatableClusterResources; import com.yahoo.vespa.hosted.provision.autoscale.Autoscaler; -import com.yahoo.vespa.hosted.provision.autoscale.NodeMetricsDb; +import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb; import java.time.Duration; import java.util.List; @@ -29,13 +28,13 @@ import java.util.stream.Collectors; */ public class AutoscalingMaintainer extends NodeRepositoryMaintainer { - private final NodeMetricsDb metricsDb; + private final MetricsDb metricsDb; private final Autoscaler autoscaler; private final Deployer deployer; private final Metric metric; public AutoscalingMaintainer(NodeRepository nodeRepository, - NodeMetricsDb metricsDb, + MetricsDb metricsDb, Deployer deployer, Metric metric, Duration interval) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainer.java index 4c312694df1..de8065fe32b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeMetricsDbMaintainer.java @@ -5,7 +5,7 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.jdisc.Metric; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.autoscale.MetricsFetcher; -import com.yahoo.vespa.hosted.provision.autoscale.NodeMetricsDb; +import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb; import com.yahoo.yolean.Exceptions; import java.time.Duration; @@ -22,16 +22,16 @@ public class NodeMetricsDbMaintainer extends NodeRepositoryMaintainer { private static final int maxWarningsPerInvocation = 2; private final MetricsFetcher nodeMetrics; - private final NodeMetricsDb nodeMetricsDb; + private final MetricsDb metricsDb; public NodeMetricsDbMaintainer(NodeRepository nodeRepository, MetricsFetcher nodeMetrics, - NodeMetricsDb nodeMetricsDb, + MetricsDb metricsDb, Duration interval, Metric metric) { super(nodeRepository, interval, metric); this.nodeMetrics = nodeMetrics; - this.nodeMetricsDb = nodeMetricsDb; + this.metricsDb = metricsDb; } @Override @@ -39,7 +39,7 @@ public class NodeMetricsDbMaintainer extends NodeRepositoryMaintainer { int warnings = 0; for (ApplicationId application : activeNodesByApplication().keySet()) { try { - nodeMetricsDb.add(nodeMetrics.fetchMetrics(application)); + metricsDb.add(nodeMetrics.fetchMetrics(application)); } catch (Exception e) { // TODO: Don't warn if this only happens occasionally @@ -47,7 +47,7 @@ public class NodeMetricsDbMaintainer extends NodeRepositoryMaintainer { log.log(Level.WARNING, "Could not update metrics for " + application + ": " + Exceptions.toMessageString(e)); } } - nodeMetricsDb.gc(nodeRepository().clock()); + metricsDb.gc(nodeRepository().clock()); // Suppress failures for manual zones for now to avoid noise if (nodeRepository().zone().environment().isManuallyDeployed()) return true; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java index 35fbd4eed1e..5e3584bfcd0 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java @@ -12,7 +12,7 @@ import com.yahoo.jdisc.Metric; import com.yahoo.vespa.flags.FlagSource; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.autoscale.MetricsFetcher; -import com.yahoo.vespa.hosted.provision.autoscale.NodeMetricsDb; +import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb; import com.yahoo.vespa.hosted.provision.provisioning.ProvisionServiceProvider; import com.yahoo.vespa.orchestrator.Orchestrator; import com.yahoo.vespa.service.monitor.ServiceMonitor; @@ -56,16 +56,16 @@ public class NodeRepositoryMaintenance extends AbstractComponent { HostLivenessTracker hostLivenessTracker, ServiceMonitor serviceMonitor, Zone zone, Orchestrator orchestrator, Metric metric, ProvisionServiceProvider provisionServiceProvider, FlagSource flagSource, - MetricsFetcher nodeMetrics, NodeMetricsDb nodeMetricsDb) { + MetricsFetcher nodeMetrics, MetricsDb metricsDb) { this(nodeRepository, deployer, infraDeployer, hostLivenessTracker, serviceMonitor, zone, Clock.systemUTC(), - orchestrator, metric, provisionServiceProvider, flagSource, nodeMetrics, nodeMetricsDb); + orchestrator, metric, provisionServiceProvider, flagSource, nodeMetrics, metricsDb); } public NodeRepositoryMaintenance(NodeRepository nodeRepository, Deployer deployer, InfraDeployer infraDeployer, HostLivenessTracker hostLivenessTracker, ServiceMonitor serviceMonitor, Zone zone, Clock clock, Orchestrator orchestrator, Metric metric, ProvisionServiceProvider provisionServiceProvider, FlagSource flagSource, - MetricsFetcher nodeMetrics, NodeMetricsDb nodeMetricsDb) { + MetricsFetcher metricsFetcher, MetricsDb metricsDb) { DefaultTimes defaults = new DefaultTimes(zone, deployer); nodeFailer = new NodeFailer(deployer, hostLivenessTracker, serviceMonitor, nodeRepository, defaults.failGrace, @@ -89,9 +89,9 @@ public class NodeRepositoryMaintenance extends AbstractComponent { spareCapacityMaintainer = new SpareCapacityMaintainer(deployer, nodeRepository, metric, defaults.spareCapacityMaintenanceInterval); osUpgradeActivator = new OsUpgradeActivator(nodeRepository, defaults.osUpgradeActivatorInterval, metric); rebalancer = new Rebalancer(deployer, nodeRepository, metric, defaults.rebalancerInterval); - nodeMetricsDbMaintainer = new NodeMetricsDbMaintainer(nodeRepository, nodeMetrics, nodeMetricsDb, defaults.nodeMetricsCollectionInterval, metric); - autoscalingMaintainer = new AutoscalingMaintainer(nodeRepository, nodeMetricsDb, deployer, metric, defaults.autoscalingInterval); - scalingSuggestionsMaintainer = new ScalingSuggestionsMaintainer(nodeRepository, nodeMetricsDb, defaults.scalingSuggestionsInterval, metric); + nodeMetricsDbMaintainer = new NodeMetricsDbMaintainer(nodeRepository, metricsFetcher, metricsDb, defaults.nodeMetricsCollectionInterval, metric); + autoscalingMaintainer = new AutoscalingMaintainer(nodeRepository, metricsDb, deployer, metric, defaults.autoscalingInterval); + scalingSuggestionsMaintainer = new ScalingSuggestionsMaintainer(nodeRepository, metricsDb, defaults.scalingSuggestionsInterval, metric); switchRebalancer = new SwitchRebalancer(nodeRepository, defaults.switchRebalancerInterval, metric, deployer); // The DuperModel is filled with infrastructure applications by the infrastructure provisioner, so explicitly run that now diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainer.java index db0e5f03097..c9538d878f2 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainer.java @@ -12,7 +12,7 @@ import com.yahoo.vespa.hosted.provision.applications.Application; import com.yahoo.vespa.hosted.provision.applications.Applications; import com.yahoo.vespa.hosted.provision.applications.Cluster; import com.yahoo.vespa.hosted.provision.autoscale.Autoscaler; -import com.yahoo.vespa.hosted.provision.autoscale.NodeMetricsDb; +import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb; import java.time.Duration; import java.util.List; @@ -30,7 +30,7 @@ public class ScalingSuggestionsMaintainer extends NodeRepositoryMaintainer { private final Autoscaler autoscaler; public ScalingSuggestionsMaintainer(NodeRepository nodeRepository, - NodeMetricsDb metricsDb, + MetricsDb metricsDb, Duration interval, Metric metric) { super(nodeRepository, interval, metric); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/ContainerConfig.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/ContainerConfig.java index 7e2060ed402..26e528d0be9 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/ContainerConfig.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/ContainerConfig.java @@ -25,7 +25,7 @@ public class ContainerConfig { " <component id='com.yahoo.vespa.hosted.provision.testutils.ServiceMonitorStub'/>\n" + " <component id='com.yahoo.vespa.hosted.provision.testutils.MockDuperModel'/>\n" + " <component id='com.yahoo.vespa.hosted.provision.testutils.MockNodeFlavors'/>\n" + - " <component id='com.yahoo.vespa.hosted.provision.autoscale.NodeMetricsDb'/>\n" + + " <component id='com.yahoo.vespa.hosted.provision.autoscale.MemoryMetricsDb'/>\n" + " <component id='com.yahoo.vespa.hosted.provision.testutils.MockMetricsFetcher'/>\n" + " <component id='com.yahoo.vespa.hosted.provision.testutils.MockNodeRepository'/>\n" + " <component id='com.yahoo.vespa.hosted.provision.testutils.MockProvisionServiceProvider'/>\n" + diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java index ffee79eb895..9625996f3a6 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTester.java @@ -41,7 +41,7 @@ class AutoscalingTester { private final ProvisioningTester provisioningTester; private final Autoscaler autoscaler; - private final NodeMetricsDb db; + private final MetricsDb db; private final MockHostResourcesCalculator hostResourcesCalculator; /** Creates an autoscaling tester with a single host type ready */ @@ -68,7 +68,7 @@ class AutoscalingTester { .build(); hostResourcesCalculator = new MockHostResourcesCalculator(zone); - db = new NodeMetricsDb(provisioningTester.nodeRepository()); + db = MetricsDb.createTestInstance(provisioningTester.nodeRepository()); autoscaler = new Autoscaler(db, nodeRepository()); } @@ -229,7 +229,7 @@ class AutoscalingTester { return provisioningTester.nodeRepository(); } - public NodeMetricsDb nodeMetricsDb() { return db; } + public MetricsDb nodeMetricsDb() { return db; } private static class MockHostResourcesCalculator implements HostResourcesCalculator { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsFetcherDbTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsFetcherDbTest.java index b2a76cdd103..9dad8ed9df8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsFetcherDbTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsFetcherDbTest.java @@ -36,7 +36,7 @@ public class MetricsFetcherDbTest { String node0 = hosts.iterator().next().hostname(); ManualClock clock = tester.clock(); - NodeMetricsDb db = new NodeMetricsDb(tester.nodeRepository()); + MetricsDb db = MetricsDb.createTestInstance(tester.nodeRepository()); Collection<Pair<String, MetricSnapshot>> values = new ArrayList<>(); for (int i = 0; i < 40; i++) { values.add(new Pair<>(node0, new MetricSnapshot(clock.instant(), 0.9f, 0.6f, 0.6f, 0))); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java index 5342e52f5a6..6e8b75a9af5 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java @@ -14,9 +14,9 @@ import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.test.ManualClock; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; +import com.yahoo.vespa.hosted.provision.autoscale.MemoryMetricsDb; import com.yahoo.vespa.hosted.provision.autoscale.MetricSnapshot; -import com.yahoo.vespa.hosted.provision.autoscale.MetricsFetcher; -import com.yahoo.vespa.hosted.provision.autoscale.NodeMetricsDb; +import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; @@ -34,7 +34,7 @@ import java.util.stream.Collectors; public class AutoscalingMaintainerTester { private final ProvisioningTester provisioningTester; - private final NodeMetricsDb nodeMetricsDb; + private final MetricsDb metricsDb; private final AutoscalingMaintainer maintainer; private final MockDeployer deployer; @@ -46,9 +46,9 @@ public class AutoscalingMaintainerTester { Map<ApplicationId, MockDeployer.ApplicationContext> apps = Arrays.stream(appContexts) .collect(Collectors.toMap(c -> c.id(), c -> c)); deployer = new MockDeployer(provisioningTester.provisioner(), provisioningTester.clock(), apps); - nodeMetricsDb = new NodeMetricsDb(provisioningTester.nodeRepository()); + metricsDb = MetricsDb.createTestInstance(provisioningTester.nodeRepository()); maintainer = new AutoscalingMaintainer(provisioningTester.nodeRepository(), - nodeMetricsDb, + metricsDb, deployer, new TestMetric(), Duration.ofMinutes(1)); @@ -60,7 +60,7 @@ public class AutoscalingMaintainerTester { public ManualClock clock() { return provisioningTester.clock(); } public MockDeployer deployer() { return deployer; } public AutoscalingMaintainer maintainer() { return maintainer; } - public NodeMetricsDb nodeMetricsDb() { return nodeMetricsDb; } + public MetricsDb nodeMetricsDb() { return metricsDb; } public static ApplicationId makeApplicationId(String name) { return ProvisioningTester.makeApplicationId(name); } public static ClusterSpec containerClusterSpec() { return ProvisioningTester.containerClusterSpec(); } @@ -73,11 +73,11 @@ public class AutoscalingMaintainerTester { List<Node> nodes = nodeRepository().getNodes(applicationId, Node.State.active); for (int i = 0; i < count; i++) { for (Node node : nodes) - nodeMetricsDb.add(List.of(new Pair<>(node.hostname(), new MetricSnapshot(clock().instant(), - cpu, - mem, - disk, - generation)))); + metricsDb.add(List.of(new Pair<>(node.hostname(), new MetricSnapshot(clock().instant(), + cpu, + mem, + disk, + generation)))); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java index 2ebcd84e71a..9c952cc605e 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainerTest.java @@ -16,8 +16,7 @@ import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.autoscale.MetricSnapshot; -import com.yahoo.vespa.hosted.provision.autoscale.MetricsFetcher; -import com.yahoo.vespa.hosted.provision.autoscale.NodeMetricsDb; +import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester; import org.junit.Test; @@ -45,7 +44,7 @@ public class ScalingSuggestionsMaintainerTest { ApplicationId app2 = ProvisioningTester.makeApplicationId("app2"); ClusterSpec cluster2 = ProvisioningTester.contentClusterSpec(); - NodeMetricsDb nodeMetricsDb = new NodeMetricsDb(tester.nodeRepository()); + MetricsDb metricsDb = MetricsDb.createTestInstance(tester.nodeRepository()); tester.makeReadyNodes(20, "flt", NodeType.host, 8); tester.activateTenantHosts(); @@ -57,11 +56,11 @@ public class ScalingSuggestionsMaintainerTest { new ClusterResources(10, 1, new NodeResources(6.5, 5, 15, 0.1)), false, true)); - addMeasurements(0.90f, 0.90f, 0.90f, 0, 500, app1, tester.nodeRepository(), nodeMetricsDb); - addMeasurements(0.99f, 0.99f, 0.99f, 0, 500, app2, tester.nodeRepository(), nodeMetricsDb); + addMeasurements(0.90f, 0.90f, 0.90f, 0, 500, app1, tester.nodeRepository(), metricsDb); + addMeasurements(0.99f, 0.99f, 0.99f, 0, 500, app2, tester.nodeRepository(), metricsDb); ScalingSuggestionsMaintainer maintainer = new ScalingSuggestionsMaintainer(tester.nodeRepository(), - nodeMetricsDb, + metricsDb, Duration.ofMinutes(1), new TestMetric()); maintainer.maintain(); @@ -73,7 +72,7 @@ public class ScalingSuggestionsMaintainerTest { } public void addMeasurements(float cpu, float memory, float disk, int generation, int count, ApplicationId applicationId, - NodeRepository nodeRepository, NodeMetricsDb db) { + NodeRepository nodeRepository, MetricsDb db) { List<Node> nodes = nodeRepository.getNodes(applicationId, Node.State.active); for (int i = 0; i < count; i++) { for (Node node : nodes) |