summaryrefslogtreecommitdiffstats
path: root/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricManager.java')
-rw-r--r--simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricManager.java63
1 files changed, 63 insertions, 0 deletions
diff --git a/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricManager.java b/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricManager.java
new file mode 100644
index 00000000000..aef7067dc65
--- /dev/null
+++ b/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricManager.java
@@ -0,0 +1,63 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.metrics.simple;
+
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.logging.Logger;
+
+import com.yahoo.component.AbstractComponent;
+import com.yahoo.concurrent.ThreadLocalDirectory;
+import com.yahoo.concurrent.ThreadLocalDirectory.Updater;
+import com.yahoo.container.di.componentgraph.Provider;
+import com.yahoo.metrics.ManagerConfig;
+import com.yahoo.log.LogLevel;
+
+/**
+ * This is the coordinating class owning the executor and the top level objects
+ * for measured metrics.
+ *
+ * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a>
+ */
+public class MetricManager extends AbstractComponent implements Provider<MetricReceiver> {
+ private static Logger log = Logger.getLogger(MetricManager.class.getName());
+
+ private final ScheduledThreadPoolExecutor executor;
+ private final MetricReceiver receiver;
+ private ThreadLocalDirectory<Bucket, Sample> metricsCollection;
+
+ public MetricManager(ManagerConfig settings) {
+ this(settings, new MetricUpdater());
+ }
+
+ private MetricManager(ManagerConfig settings, Updater<Bucket, Sample> updater) {
+ log.log(LogLevel.CONFIG, "setting up simple metrics gathering." +
+ " reportPeriodSeconds=" + settings.reportPeriodSeconds() +
+ ", pointsToKeepPerMetric=" + settings.pointsToKeepPerMetric());
+ metricsCollection = new ThreadLocalDirectory<>(updater);
+ final AtomicReference<Bucket> currentSnapshot = new AtomicReference<>(null);
+ executor = new ScheduledThreadPoolExecutor(1);
+ // Fixed rate, not fixed delay, is it is not too important that each
+ // bucket has data for exactly one second, but one should strive for
+ // this.buffer to contain data for as close a period to the report
+ // interval as possible
+ executor.scheduleAtFixedRate(new MetricAggregator(metricsCollection, currentSnapshot, settings), 1, 1, TimeUnit.SECONDS);
+ receiver = new MetricReceiver(metricsCollection, currentSnapshot);
+ }
+
+ static MetricManager constructWithCustomUpdater(ManagerConfig settings, Updater<Bucket, Sample> updater) {
+ return new MetricManager(settings, updater);
+ }
+
+
+ @Override
+ public void deconstruct() {
+ executor.shutdown();
+ }
+
+ @Override
+ public MetricReceiver get() {
+ return receiver;
+ }
+
+}