diff options
Diffstat (limited to 'node-repository')
19 files changed, 144 insertions, 97 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java index e9e09781e31..44dd023677c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.provision.maintenance; import com.yahoo.concurrent.DaemonThreadFactory; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Deployer; +import com.yahoo.jdisc.Metric; import com.yahoo.log.LogLevel; import com.yahoo.vespa.hosted.provision.NodeRepository; @@ -22,6 +23,7 @@ import java.util.concurrent.TimeUnit; public abstract class ApplicationMaintainer extends Maintainer { private final Deployer deployer; + private final Metric metric; private final CopyOnWriteArrayList<ApplicationId> pendingDeployments = new CopyOnWriteArrayList<>(); // Use a fixed thread pool to avoid overload on config servers. Resource usage when deploying varies @@ -32,9 +34,10 @@ public abstract class ApplicationMaintainer extends Maintainer { new LinkedBlockingQueue<>(), new DaemonThreadFactory("node repo application maintainer")); - protected ApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Duration interval) { + protected ApplicationMaintainer(Deployer deployer, Metric metric, NodeRepository nodeRepository, Duration interval) { super(nodeRepository, interval); this.deployer = deployer; + this.metric = metric; } @Override @@ -73,7 +76,7 @@ public abstract class ApplicationMaintainer extends Maintainer { /** Redeploy this application. A lock will be taken for the duration of the deployment activation */ protected final void deployWithLock(ApplicationId application) { - try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, nodeRepository())) { + try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, metric, nodeRepository())) { if ( ! deployment.isValid()) return; // this will be done at another config server if ( ! canDeployNow(application)) return; // redeployment is no longer needed deployment.activate(); 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 abfe65408b6..0d7d10663c5 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 @@ -6,6 +6,7 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Deployer; import com.yahoo.config.provision.NodeResources; +import com.yahoo.jdisc.Metric; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.applications.Application; @@ -32,15 +33,18 @@ public class AutoscalingMaintainer extends Maintainer { private final Autoscaler autoscaler; private final Deployer deployer; + private final Metric metric; private final Map<Pair<ApplicationId, ClusterSpec.Id>, Instant> lastLogged = new HashMap<>(); public AutoscalingMaintainer(NodeRepository nodeRepository, HostResourcesCalculator hostResourcesCalculator, NodeMetricsDb metricsDb, Deployer deployer, + Metric metric, Duration interval) { super(nodeRepository, interval); this.autoscaler = new Autoscaler(hostResourcesCalculator, metricsDb, nodeRepository); + this.metric = metric; this.deployer = deployer; } @@ -52,7 +56,7 @@ public class AutoscalingMaintainer extends Maintainer { } private void autoscale(ApplicationId application, List<Node> applicationNodes) { - try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, nodeRepository())) { + try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, metric, nodeRepository())) { if ( ! deployment.isValid()) return; // Another config server will consider this application nodesByCluster(applicationNodes).forEach((clusterId, clusterNodes) -> autoscale(application, clusterId, clusterNodes, deployment)); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java index d9e06f87db7..8e1cd801a15 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java @@ -6,6 +6,7 @@ import com.yahoo.config.provision.ApplicationLockException; import com.yahoo.config.provision.Deployer; import com.yahoo.config.provision.Deployment; import com.yahoo.config.provision.TransientException; +import com.yahoo.jdisc.Metric; import com.yahoo.log.LogLevel; import com.yahoo.transaction.Mutex; import com.yahoo.vespa.hosted.provision.Node; @@ -14,6 +15,7 @@ import com.yahoo.yolean.Exceptions; import java.io.Closeable; import java.time.Duration; +import java.util.Map; import java.util.Optional; import java.util.logging.Logger; @@ -28,13 +30,18 @@ class MaintenanceDeployment implements Closeable { private static final Logger log = Logger.getLogger(MaintenanceDeployment.class.getName()); private final ApplicationId application; + private final Metric metric; private final Optional<Mutex> lock; private final Optional<Deployment> deployment; private boolean closed = false; - public MaintenanceDeployment(ApplicationId application, Deployer deployer, NodeRepository nodeRepository) { + public MaintenanceDeployment(ApplicationId application, + Deployer deployer, + Metric metric, + NodeRepository nodeRepository) { this.application = application; + this.metric = metric; Optional<Mutex> lock = tryLock(application, nodeRepository); try { deployment = tryDeployment(lock, application, deployer, nodeRepository); @@ -75,10 +82,12 @@ class MaintenanceDeployment implements Closeable { action.run(); return true; } catch (TransientException e) { + metric.add("maintenanceDeployment.transientFailure", 1, metric.createContext(Map.of())); log.log(LogLevel.INFO, "Failed to maintenance deploy " + application + " with a transient error: " + Exceptions.toMessageString(e)); return false; } catch (RuntimeException e) { + metric.add("maintenanceDeployment.failure", 1, metric.createContext(Map.of())); log.log(LogLevel.WARNING, "Exception on maintenance deploy of " + application, e); return false; } 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 104ab72a6a2..054c273dc99 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 @@ -72,10 +72,10 @@ public class NodeRepositoryMaintenance extends AbstractComponent { DefaultTimes defaults = new DefaultTimes(zone); nodeFailer = new NodeFailer(deployer, hostLivenessTracker, serviceMonitor, nodeRepository, defaults.failGrace, clock, orchestrator, throttlePolicyFromEnv().orElse(defaults.throttlePolicy), metric); - periodicApplicationMaintainer = new PeriodicApplicationMaintainer(deployer, nodeRepository, defaults.redeployMaintainerInterval, defaults.periodicRedeployInterval); - operatorChangeApplicationMaintainer = new OperatorChangeApplicationMaintainer(deployer, nodeRepository, defaults.operatorChangeRedeployInterval); + periodicApplicationMaintainer = new PeriodicApplicationMaintainer(deployer, metric, nodeRepository, defaults.redeployMaintainerInterval, defaults.periodicRedeployInterval); + operatorChangeApplicationMaintainer = new OperatorChangeApplicationMaintainer(deployer, metric, nodeRepository, defaults.operatorChangeRedeployInterval); reservationExpirer = new ReservationExpirer(nodeRepository, clock, defaults.reservationExpiry); - retiredExpirer = new RetiredExpirer(nodeRepository, orchestrator, deployer, clock, defaults.retiredInterval, defaults.retiredExpiry); + retiredExpirer = new RetiredExpirer(nodeRepository, orchestrator, deployer, metric, clock, defaults.retiredInterval, defaults.retiredExpiry); inactiveExpirer = new InactiveExpirer(nodeRepository, clock, defaults.inactiveExpiry); failedExpirer = new FailedExpirer(nodeRepository, zone, clock, defaults.failedExpirerInterval); dirtyExpirer = new DirtyExpirer(nodeRepository, clock, defaults.dirtyExpiry); @@ -91,7 +91,7 @@ public class NodeRepositoryMaintenance extends AbstractComponent { osUpgradeActivator = new OsUpgradeActivator(nodeRepository, defaults.osUpgradeActivatorInterval); rebalancer = new Rebalancer(deployer, nodeRepository, provisionServiceProvider.getHostResourcesCalculator(), provisionServiceProvider.getHostProvisioner(), metric, clock, defaults.rebalancerInterval); nodeMetricsDbMaintainer = new NodeMetricsDbMaintainer(nodeRepository, nodeMetrics, nodeMetricsDb, defaults.nodeMetricsCollectionInterval); - autoscalingMaintainer = new AutoscalingMaintainer(nodeRepository, provisionServiceProvider.getHostResourcesCalculator(), nodeMetricsDb, deployer, defaults.autoscalingInterval); + autoscalingMaintainer = new AutoscalingMaintainer(nodeRepository, provisionServiceProvider.getHostResourcesCalculator(), nodeMetricsDb, deployer, metric, defaults.autoscalingInterval); // The DuperModel is filled with infrastructure applications by the infrastructure provisioner, so explicitly run that now infrastructureProvisioner.maintainButThrowOnException(); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java index e7406bf3478..9f829c095f4 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainer.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.provision.maintenance; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Deployer; import com.yahoo.config.provision.NodeType; +import com.yahoo.jdisc.Metric; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.Agent; @@ -31,8 +32,8 @@ import java.util.stream.Collectors; */ public class OperatorChangeApplicationMaintainer extends ApplicationMaintainer { - OperatorChangeApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Duration interval) { - super(deployer, nodeRepository, interval); + OperatorChangeApplicationMaintainer(Deployer deployer, Metric metric, NodeRepository nodeRepository, Duration interval) { + super(deployer, metric, nodeRepository, interval); } @Override diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java index 6ab85e76ba2..d06d24872e1 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.provision.maintenance; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Deployer; +import com.yahoo.jdisc.Metric; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; @@ -29,9 +30,9 @@ public class PeriodicApplicationMaintainer extends ApplicationMaintainer { private final Clock clock; private final Instant start; - PeriodicApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, + PeriodicApplicationMaintainer(Deployer deployer, Metric metric, NodeRepository nodeRepository, Duration interval, Duration minTimeBetweenRedeployments) { - super(deployer, nodeRepository, interval); + super(deployer, metric, nodeRepository, interval); this.minTimeBetweenRedeployments = minTimeBetweenRedeployments; this.clock = nodeRepository.clock(); this.start = clock.instant(); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java index db99f8544f1..240dd85c8d4 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java @@ -129,7 +129,7 @@ public class Rebalancer extends Maintainer { */ private boolean deployTo(Move move) { ApplicationId application = move.node.allocation().get().owner(); - try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, nodeRepository())) { + try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, metric, nodeRepository())) { if ( ! deployment.isValid()) return false; boolean couldMarkRetiredNow = markWantToRetire(move.node, true); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java index 1d31917b3e1..3c01c8bc23c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.provision.maintenance; import com.google.common.util.concurrent.UncheckedTimeoutException; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Deployer; +import com.yahoo.jdisc.Metric; import com.yahoo.vespa.applicationmodel.HostName; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; @@ -26,6 +27,7 @@ import java.util.stream.Collectors; public class RetiredExpirer extends Maintainer { private final Deployer deployer; + private final Metric metric; private final Orchestrator orchestrator; private final Duration retiredExpiry; private final Clock clock; @@ -33,11 +35,13 @@ public class RetiredExpirer extends Maintainer { public RetiredExpirer(NodeRepository nodeRepository, Orchestrator orchestrator, Deployer deployer, + Metric metric, Clock clock, Duration maintenanceInterval, Duration retiredExpiry) { super(nodeRepository, maintenanceInterval); this.deployer = deployer; + this.metric = metric; this.orchestrator = orchestrator; this.retiredExpiry = retiredExpiry; this.clock = clock; @@ -56,7 +60,7 @@ public class RetiredExpirer extends Maintainer { ApplicationId application = entry.getKey(); List<Node> retiredNodes = entry.getValue(); - try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, nodeRepository())) { + try (MaintenanceDeployment deployment = new MaintenanceDeployment(application, deployer, metric, nodeRepository())) { if ( ! deployment.isValid()) continue; // this will be done at another config server List<Node> nodesToRemove = retiredNodes.stream().filter(this::canRemove).collect(Collectors.toList()); @@ -103,7 +107,7 @@ public class RetiredExpirer extends Maintainer { log.info("Node " + node + " has been granted permission to be removed"); return true; } catch (UncheckedTimeoutException e) { - log.info("Timed out trying to aquire permission to remove " + node.hostname() + ": " + e.getMessage()); + log.info("Timed out trying to acquire permission to remove " + node.hostname() + ": " + e.getMessage()); return false; } catch (OrchestrationException e) { log.info("Did not get permission to remove retired " + node + ": " + e.getMessage()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java index da169cba08f..8f8f8d0f38b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTest.java @@ -59,6 +59,7 @@ public class AutoscalingMaintainerTest { tester.identityHostResourcesCalculator(), nodeMetricsDb, deployer, + new TestMetric(), Duration.ofMinutes(1)); maintainer.maintain(); // noop assertTrue(deployer.lastDeployTime(app1).isEmpty()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java index 9bb3a55abfd..4fcd5793b8a 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java @@ -19,6 +19,7 @@ import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.History; import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; +import com.yahoo.vespa.hosted.provision.testutils.MockNodeMetrics; import com.yahoo.vespa.orchestrator.OrchestrationException; import com.yahoo.vespa.orchestrator.Orchestrator; import org.junit.Test; @@ -152,7 +153,7 @@ public class InactiveAndFailedExpirerTest { ); Orchestrator orchestrator = mock(Orchestrator.class); doThrow(new RuntimeException()).when(orchestrator).acquirePermissionToRemove(any()); - new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, tester.clock(), Duration.ofDays(30), + new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, new TestMetric(), tester.clock(), Duration.ofDays(30), Duration.ofMinutes(10)).run(); assertEquals(1, tester.nodeRepository().getNodes(Node.State.inactive).size()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java index ca7c33f96bd..665dd74176d 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java @@ -36,9 +36,7 @@ import org.junit.Test; import java.time.Clock; import java.time.Duration; import java.time.Instant; -import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -224,70 +222,4 @@ public class MetricsReporterTest { return Optional.empty(); } - public static class TestMetric implements Metric { - - public Map<String, Number> values = new LinkedHashMap<>(); - public Map<String, List<Context>> context = new LinkedHashMap<>(); - - @Override - public void set(String key, Number val, Context ctx) { - values.put(key, val); - if (ctx != null) { - //Create one context pr value added - copy the context to not have side effects - TestContext kontekst = (TestContext)createContext(((TestContext) ctx).properties); - if (!context.containsKey(key)) { - context.put(key, new ArrayList<>()); - } - kontekst.setValue(val); - context.get(key).add(kontekst); - } - } - - @Override - public void add(String key, Number val, Context ctx) { - values.put(key, val); - if (ctx != null) { - //Create one context pr value added - copy the context to not have side effects - TestContext copy = (TestContext) createContext(((TestContext) ctx).properties); - if (!context.containsKey(key)) { - context.put(key, new ArrayList<>()); - } - copy.setValue(val); - context.get(key).add(copy); - } - } - - @Override - public Context createContext(Map<String, ?> properties) { - return new TestContext(properties); - } - - double sumDoubleValues(String key, Context sumContext) { - double sum = 0.0; - for(Context c : context.get(key)) { - TestContext tc = (TestContext) c; - if (tc.value instanceof Double && tc.properties.equals(((TestContext) sumContext).properties)) { - sum += (double) tc.value; - } - } - return sum; - } - - /** - * Context where the propertymap is not shared - but unique to each value. - */ - private static class TestContext implements Context{ - Number value; - Map<String, ?> properties; - - public TestContext(Map<String, ?> properties) { - this.properties = properties; - } - - public void setValue(Number value) { - this.value = value; - } - } - } - } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java index 585d57aae4e..ab97de80418 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java @@ -65,7 +65,7 @@ public class NodeFailTester { public NodeFailer failer; public ServiceMonitorStub serviceMonitor; public MockDeployer deployer; - public MetricsReporterTest.TestMetric metric; + public TestMetric metric; private final TestHostLivenessTracker hostLivenessTracker; private final Orchestrator orchestrator; private final NodeRepositoryProvisioner provisioner; @@ -103,7 +103,7 @@ public class NodeFailTester { app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), apps); tester.serviceMonitor = new ServiceMonitorStub(apps, tester.nodeRepository); - tester.metric = new MetricsReporterTest.TestMetric(); + tester.metric = new TestMetric(); tester.failer = tester.createFailer(); return tester; } @@ -139,7 +139,7 @@ public class NodeFailTester { app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), apps); tester.serviceMonitor = new ServiceMonitorStub(apps, tester.nodeRepository); - tester.metric = new MetricsReporterTest.TestMetric(); + tester.metric = new TestMetric(); tester.failer = tester.createFailer(); return tester; } @@ -158,7 +158,7 @@ public class NodeFailTester { app1, new MockDeployer.ApplicationContext(app1, clusterApp1, allNodes)); tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), apps); tester.serviceMonitor = new ServiceMonitorStub(apps, tester.nodeRepository); - tester.metric = new MetricsReporterTest.TestMetric(); + tester.metric = new TestMetric(); tester.failer = tester.createFailer(); return tester; } @@ -167,7 +167,7 @@ public class NodeFailTester { NodeFailTester tester = new NodeFailTester(); tester.deployer = new MockDeployer(tester.provisioner, tester.clock(), Map.of()); tester.serviceMonitor = new ServiceMonitorStub(Map.of(), tester.nodeRepository); - tester.metric = new MetricsReporterTest.TestMetric(); + tester.metric = new TestMetric(); tester.failer = tester.createFailer(); return tester; } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java index 2dda6c714a7..eb2a1d4db68 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java @@ -66,7 +66,10 @@ public class OperatorChangeApplicationMaintainerTest { // Create applications fixture.activate(); assertEquals("Initial applications are deployed", 3, fixture.deployer.redeployments); - OperatorChangeApplicationMaintainer maintainer = new OperatorChangeApplicationMaintainer(fixture.deployer, nodeRepository, Duration.ofMinutes(1)); + OperatorChangeApplicationMaintainer maintainer = new OperatorChangeApplicationMaintainer(fixture.deployer, + new TestMetric(), + nodeRepository, + Duration.ofMinutes(1)); clock.advance(Duration.ofMinutes(2)); maintainer.maintain(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java index 3037d5972e5..63a22cc3029 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java @@ -303,7 +303,7 @@ public class PeriodicApplicationMaintainerTest { TestablePeriodicApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Duration interval, Duration minTimeBetweenRedeployments) { - super(deployer, nodeRepository, interval, minTimeBetweenRedeployments); + super(deployer, new TestMetric(), nodeRepository, interval, minTimeBetweenRedeployments); } @Override diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java index 387f614c5eb..d25ae234f35 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java @@ -17,7 +17,6 @@ import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; -import com.yahoo.vespa.hosted.provision.provisioning.HostResourcesCalculator; import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import org.junit.Test; @@ -46,7 +45,7 @@ public class RebalancerTest { NodeResources memResources = new NodeResources(4, 9, 1, 0.1); ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.perf, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build(); - MetricsReporterTest.TestMetric metric = new MetricsReporterTest.TestMetric(); + TestMetric metric = new TestMetric(); Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( cpuApp, new MockDeployer.ApplicationContext(cpuApp, clusterSpec("c"), Capacity.from(new ClusterResources(1, 1, cpuResources))), diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java index 276b9484ad4..7ece8cba65e 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java @@ -241,6 +241,7 @@ public class RetiredExpirerTest { nodeRepository, orchestrator, deployer, + new TestMetric(), clock, Duration.ofDays(30), /* Maintenance interval, use large value so it never runs by itself */ RETIRED_EXPIRATION); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/TestMetric.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/TestMetric.java new file mode 100644 index 00000000000..c98216f9d14 --- /dev/null +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/TestMetric.java @@ -0,0 +1,75 @@ +// 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.maintenance; + +import com.yahoo.jdisc.Metric; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class TestMetric implements Metric { + + public Map<String, Number> values = new LinkedHashMap<>(); + public Map<String, List<Context>> context = new LinkedHashMap<>(); + + @Override + public void set(String key, Number val, Context ctx) { + values.put(key, val); + if (ctx != null) { + //Create one context pr value added - copy the context to not have side effects + TestContext kontekst = (TestContext)createContext(((TestContext) ctx).properties); + if (!context.containsKey(key)) { + context.put(key, new ArrayList<>()); + } + kontekst.setValue(val); + context.get(key).add(kontekst); + } + } + + @Override + public void add(String key, Number val, Context ctx) { + values.put(key, val); + if (ctx != null) { + //Create one context pr value added - copy the context to not have side effects + TestContext copy = (TestContext) createContext(((TestContext) ctx).properties); + if (!context.containsKey(key)) { + context.put(key, new ArrayList<>()); + } + copy.setValue(val); + context.get(key).add(copy); + } + } + + @Override + public Context createContext(Map<String, ?> properties) { + return new TestContext(properties); + } + + double sumDoubleValues(String key, Context sumContext) { + double sum = 0.0; + for(Context c : context.get(key)) { + TestContext tc = (TestContext) c; + if (tc.value instanceof Double && tc.properties.equals(((TestContext) sumContext).properties)) { + sum += (double) tc.value; + } + } + return sum; + } + + /** + * Context where the propertymap is not shared - but unique to each value. + */ + private static class TestContext implements Context{ + Number value; + Map<String, ?> properties; + + public TestContext(Map<String, ?> properties) { + this.properties = properties; + } + + public void setValue(Number value) { + this.value = value; + } + } +} diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java index 4a75d86f530..1265961e351 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java @@ -12,6 +12,7 @@ import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Zone; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.maintenance.RetiredExpirer; +import com.yahoo.vespa.hosted.provision.maintenance.TestMetric; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import org.junit.Ignore; import org.junit.Test; @@ -140,8 +141,13 @@ public class MultigroupProvisioningTest { Collections.singletonMap(application1, new MockDeployer.ApplicationContext(application1, cluster(), Capacity.from(new ClusterResources(8, 1, large), false, true)))); - new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, tester.clock(), Duration.ofDays(30), - Duration.ofHours(12)).run(); + new RetiredExpirer(tester.nodeRepository(), + tester.orchestrator(), + deployer, + new TestMetric(), + tester.clock(), + Duration.ofDays(30), + Duration.ofHours(12)).run(); assertEquals(8, tester.getNodes(application1, Node.State.inactive).resources(small).size()); deploy(application1, 8, 8, large, tester); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java index 8420bdeacfe..98133898cf6 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java @@ -8,6 +8,7 @@ import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.maintenance.RetiredExpirer; +import com.yahoo.vespa.hosted.provision.maintenance.TestMetric; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import org.junit.Before; @@ -94,8 +95,13 @@ public class NodeTypeProvisioningTest { tester.clock(), Collections.singletonMap( application, new MockDeployer.ApplicationContext(application, clusterSpec, capacity))); - RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, - tester.clock(), Duration.ofDays(30), Duration.ofMinutes(10)); + RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), + tester.orchestrator(), + deployer, + new TestMetric(), + tester.clock(), + Duration.ofDays(30), + Duration.ofMinutes(10)); { // Deploy List<HostSpec> hosts = deployProxies(application, tester); @@ -161,6 +167,7 @@ public class NodeTypeProvisioningTest { RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, + new TestMetric(), tester.clock(), Duration.ofDays(30), Duration.ofMinutes(10)); |