aboutsummaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2021-04-13 17:03:46 +0200
committergjoranv <gv@verizonmedia.com>2021-04-13 17:03:46 +0200
commit3f46e126abf3da75ae561ff9f5070b977b3004e3 (patch)
tree581403a84038d1299edf14d5ed54aeae0541d5cc /container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java
parent94611f2c72d033a15b251b59781ff7dddfef63fe (diff)
Add java source from simplemetrics.
Diffstat (limited to 'container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java')
-rw-r--r--container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java71
1 files changed, 71 insertions, 0 deletions
diff --git a/container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java b/container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java
new file mode 100644
index 00000000000..7168eb49676
--- /dev/null
+++ b/container-core/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java
@@ -0,0 +1,71 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.metrics.simple;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.yahoo.concurrent.ThreadLocalDirectory;
+import com.yahoo.metrics.ManagerConfig;
+
+/**
+ * Worker thread to collect the data stored in worker threads and build
+ * snapshots for external consumption. Using the correct executor gives the
+ * necessary guarantees for this being invoked from only a single thread.
+ *
+ * @author Steinar Knutsen
+ */
+class MetricAggregator implements Runnable {
+
+ private final ThreadLocalDirectory<Bucket, Sample> metricsCollection;
+ private final AtomicReference<Bucket> currentSnapshot;
+ private int generation = 0;
+ private final Bucket[] buffer;
+ private long fromMillis;
+ private final DimensionCache dimensions;
+
+ MetricAggregator(ThreadLocalDirectory<Bucket, Sample> metricsCollection, AtomicReference<Bucket> currentSnapshot,
+ ManagerConfig settings) {
+ if (settings.reportPeriodSeconds() < 10) {
+ throw new IllegalArgumentException("Do not use this metrics implementation" +
+ " if report periods of less than 10 seconds is desired.");
+ }
+ buffer = new Bucket[settings.reportPeriodSeconds()];
+ dimensions = new DimensionCache(settings.pointsToKeepPerMetric());
+ fromMillis = System.currentTimeMillis();
+ this.metricsCollection = metricsCollection;
+ this.currentSnapshot = currentSnapshot;
+ }
+
+ @Override
+ public void run() {
+ Bucket toDelete = updateBuffer();
+ createSnapshot(toDelete);
+ }
+
+ private void createSnapshot(Bucket toDelete) {
+ Bucket toPresent = new Bucket();
+ for (Bucket b : buffer) {
+ if (b == null) {
+ continue;
+ }
+ toPresent.merge(b);
+ }
+ dimensions.updateDimensionPersistence(toDelete, toPresent);
+ currentSnapshot.set(toPresent);
+ }
+
+ private Bucket updateBuffer() {
+ List<Bucket> buckets = metricsCollection.fetch();
+ long toMillis = System.currentTimeMillis();
+ int bucketIndex = generation++ % buffer.length;
+ Bucket bucketToDelete = buffer[bucketIndex];
+ Bucket latest = new Bucket(fromMillis, toMillis);
+ for (Bucket b : buckets) {
+ latest.merge(b, true);
+ }
+ buffer[bucketIndex] = latest;
+ this.fromMillis = toMillis;
+ return bucketToDelete;
+ }
+
+}