diff options
Diffstat (limited to 'vespajlib/src/main/java/com/yahoo/concurrent')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/concurrent/maintenance/JobMetrics.java | 41 | ||||
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/concurrent/maintenance/Maintainer.java | 19 |
2 files changed, 54 insertions, 6 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/JobMetrics.java b/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/JobMetrics.java new file mode 100644 index 00000000000..4c05d46d782 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/JobMetrics.java @@ -0,0 +1,41 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.concurrent.maintenance; + +import java.time.Clock; +import java.time.Instant; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiConsumer; + +/** + * Tracks and forwards maintenance job metrics. + * + * @author mpolden + */ +public class JobMetrics { + + private final Clock clock; + private final BiConsumer<String, Instant> metricConsumer; + + private final Map<String, Instant> successfulRuns = new ConcurrentHashMap<>(); + + public JobMetrics(Clock clock, BiConsumer<String, Instant> metricConsumer) { + this.clock = Objects.requireNonNull(clock); + this.metricConsumer = metricConsumer; + } + + /** Record successful run of given job */ + public void recordSuccessOf(String job) { + successfulRuns.put(job, clock.instant()); + } + + /** Forward metrics for given job to metric consumer */ + public void forward(String job) { + Instant lastSuccess = successfulRuns.get(job); + if (lastSuccess != null) { + metricConsumer.accept(job, lastSuccess); + } + } + +} diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/Maintainer.java b/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/Maintainer.java index 9c40e5ec54f..0385c27536d 100644 --- a/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/Maintainer.java +++ b/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/Maintainer.java @@ -26,17 +26,19 @@ public abstract class Maintainer implements Runnable, AutoCloseable { private final String name; private final JobControl jobControl; + private final JobMetrics jobMetrics; private final Duration interval; private final ScheduledExecutorService service; - public Maintainer(String name, Duration interval, Instant startedAt, JobControl jobControl, List<String> clusterHostnames) { - this(name, interval, staggeredDelay(interval, startedAt, HostName.getLocalhost(), clusterHostnames), jobControl); + public Maintainer(String name, Duration interval, Instant startedAt, JobControl jobControl, JobMetrics jobMetrics, List<String> clusterHostnames) { + this(name, interval, staggeredDelay(interval, startedAt, HostName.getLocalhost(), clusterHostnames), jobControl, jobMetrics); } - public Maintainer(String name, Duration interval, Duration initialDelay, JobControl jobControl) { + public Maintainer(String name, Duration interval, Duration initialDelay, JobControl jobControl, JobMetrics jobMetrics) { this.name = name; this.interval = requireInterval(interval); this.jobControl = Objects.requireNonNull(jobControl); + this.jobMetrics = Objects.requireNonNull(jobMetrics); service = new ScheduledThreadPoolExecutor(1, r -> new Thread(r, name() + "-worker")); service.scheduleAtFixedRate(this, initialDelay.toMillis(), interval.toMillis(), TimeUnit.MILLISECONDS); jobControl.started(name(), this); @@ -72,8 +74,8 @@ public abstract class Maintainer implements Runnable, AutoCloseable { @Override public final String toString() { return name(); } - /** Called once each time this maintenance job should run */ - protected abstract void maintain(); + /** Called once each time this maintenance job should run. Returns whether the maintenance run was succesful */ + protected abstract boolean maintain(); /** Returns the interval at which this job is set to run */ protected Duration interval() { return interval; } @@ -82,7 +84,12 @@ public abstract class Maintainer implements Runnable, AutoCloseable { @SuppressWarnings("unused") public final void lockAndMaintain() { try (var lock = jobControl.lockJob(name())) { - maintain(); + try { + if (maintain()) jobMetrics.recordSuccessOf(name()); + } finally { + // Always forward metrics + jobMetrics.forward(name()); + } } } |