diff options
13 files changed, 92 insertions, 67 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/state/SnapshotProvider.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/SnapshotProvider.java index b72ee43bd7c..b987f1d20d1 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/state/SnapshotProvider.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/SnapshotProvider.java @@ -10,6 +10,8 @@ import java.io.PrintStream; * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> */ public interface SnapshotProvider { - public MetricSnapshot latestSnapshot(); - public void histogram(PrintStream output); + + MetricSnapshot latestSnapshot(); + void histogram(PrintStream output); + } diff --git a/container-core/src/test/java/com/yahoo/container/jdisc/state/MetricSnapshotTest.java b/container-core/src/test/java/com/yahoo/container/jdisc/state/MetricSnapshotTest.java index fb48b4455b5..23f0ca41f53 100644 --- a/container-core/src/test/java/com/yahoo/container/jdisc/state/MetricSnapshotTest.java +++ b/container-core/src/test/java/com/yahoo/container/jdisc/state/MetricSnapshotTest.java @@ -20,7 +20,7 @@ public class MetricSnapshotTest { */ @Test public void emptyMetricSetNotAddedToClonedSnapshot() { - final StateMetricContext ctx = StateMetricContext.newInstance(null); + StateMetricContext ctx = StateMetricContext.newInstance(null); MetricSnapshot snapshot = new MetricSnapshot(); snapshot.add(ctx, "foo", 1234); MetricSnapshot newSnapshot = snapshot.createSnapshot(); @@ -33,30 +33,4 @@ public class MetricSnapshotTest { assertEquals(Collections.unmodifiableMap(new HashMap(0)), Collections.emptyMap()); } - @Test - public void testLookup() { - Map<Key, String> map = new HashMap<>(); - map.put(new Key(), "a"); - System.out.println("Lookup value after putting a: " + map.get(new Key())); - map.put(new Key(), "b"); - System.out.println("Map content after putting b: "); - for (Map.Entry<Key, String> entry : map.entrySet()) - System.out.println(" " + entry); - } - - public static class Key { - - @Override - public int hashCode() { - return 1; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return false; - } - - } - } diff --git a/simplemetrics/src/main/java/com/yahoo/metrics/simple/Bucket.java b/simplemetrics/src/main/java/com/yahoo/metrics/simple/Bucket.java index 78e217e9658..4ae284c4304 100644 --- a/simplemetrics/src/main/java/com/yahoo/metrics/simple/Bucket.java +++ b/simplemetrics/src/main/java/com/yahoo/metrics/simple/Bucket.java @@ -24,6 +24,10 @@ import edu.umd.cs.findbugs.annotations.NonNull; * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> */ public class Bucket { + + private static final Logger log = Logger.getLogger(Bucket.class.getName()); + private final Map<Identifier, UntypedMetric> values = LazyMap.newHashMap(); + boolean gotTimeStamps; long fromMillis; long toMillis; @@ -40,9 +44,6 @@ public class Bucket { this.toMillis = toMillis; } - private static final Logger log = Logger.getLogger(Bucket.class.getName()); - private final Map<Identifier, UntypedMetric> values = LazyMap.newHashMap(); - public Set<Map.Entry<Identifier, UntypedMetric>> entrySet() { return values.entrySet(); } @@ -51,14 +52,14 @@ public class Bucket { UntypedMetric value = get(x); Measurement m = x.getMeasurement(); switch (x.getMetricType()) { - case GAUGE: - value.put(m.getMagnitude()); - break; - case COUNTER: - value.add(m.getMagnitude()); - break; - default: - throw new IllegalArgumentException("Unsupported metric type: " + x.getMetricType()); + case GAUGE: + value.put(m.getMagnitude()); + break; + case COUNTER: + value.add(m.getMagnitude()); + break; + default: + throw new IllegalArgumentException("Unsupported metric type: " + x.getMetricType()); } } @@ -71,7 +72,7 @@ public class Bucket { } void merge(Bucket other, boolean otherIsNewer) { - final LazySet<String> malformedMetrics = LazySet.newHashSet(); + LazySet<String> malformedMetrics = LazySet.newHashSet(); for (Map.Entry<Identifier, UntypedMetric> entry : other.values.entrySet()) { String metricName = entry.getKey().getName(); try { @@ -166,10 +167,7 @@ public class Bucket { @Override public String toString() { - final int maxLen = 3; - StringBuilder builder = new StringBuilder(); - builder.append("Bucket [values=").append(values != null ? toString(values.entrySet(), maxLen) : null).append("]"); - return builder.toString(); + return "Bucket [values=" + (values != null ? toString(values.entrySet(), 3) : null) + "]"; } private String toString(Collection<?> collection, int maxLen) { @@ -199,4 +197,5 @@ public class Bucket { public long getToMillis() { return toMillis; } + } diff --git a/simplemetrics/src/main/java/com/yahoo/metrics/simple/DimensionCache.java b/simplemetrics/src/main/java/com/yahoo/metrics/simple/DimensionCache.java index c3537947d66..83d6d6142e0 100644 --- a/simplemetrics/src/main/java/com/yahoo/metrics/simple/DimensionCache.java +++ b/simplemetrics/src/main/java/com/yahoo/metrics/simple/DimensionCache.java @@ -10,12 +10,13 @@ import java.util.Map.Entry; import java.util.Set; /** - * Basically the persistence layer for metrics. Both CPU and memory hungry, but + * The persistence layer for metrics. Both CPU and memory hungry, but * it runs in its own little world. * * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> */ class DimensionCache { + private final Map<String, LinkedHashMap<Point, UntypedMetric>> persistentData = new HashMap<>(); private final int pointsToKeep; diff --git a/simplemetrics/src/main/java/com/yahoo/metrics/simple/Identifier.java b/simplemetrics/src/main/java/com/yahoo/metrics/simple/Identifier.java index 40c9c3e5d45..8d2ac23689b 100644 --- a/simplemetrics/src/main/java/com/yahoo/metrics/simple/Identifier.java +++ b/simplemetrics/src/main/java/com/yahoo/metrics/simple/Identifier.java @@ -6,9 +6,10 @@ package com.yahoo.metrics.simple; * Point and a metric name. Written to be robust against null input as the API * gives very little guidance. * - * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> + * @author Steinar Knutsen */ public class Identifier { + private final String name; private final Point location; @@ -28,15 +29,10 @@ public class Identifier { @Override public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + Identifier other = (Identifier) obj; if (location == null) { if (other.location != null) { @@ -69,4 +65,5 @@ public class Identifier { public Point getLocation() { return location; } + } diff --git a/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java b/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java index a388b1a1cc4..d5903eb5eef 100644 --- a/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java +++ b/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricAggregator.java @@ -10,11 +10,12 @@ 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 guarantuess for this being invoked from only a single thread. + * necessary guarantuees for this being invoked from only a single thread. * * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> */ class MetricAggregator implements Runnable { + private final ThreadLocalDirectory<Bucket, Sample> metricsCollection; private final AtomicReference<Bucket> currentSnapshot; private int generation = 0; diff --git a/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricManager.java b/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricManager.java index aef7067dc65..55fe257715d 100644 --- a/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricManager.java +++ b/simplemetrics/src/main/java/com/yahoo/metrics/simple/MetricManager.java @@ -20,6 +20,7 @@ import com.yahoo.log.LogLevel; * @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; diff --git a/simplemetrics/src/main/java/com/yahoo/metrics/simple/Point.java b/simplemetrics/src/main/java/com/yahoo/metrics/simple/Point.java index 61415f042bc..ef2ea24775c 100644 --- a/simplemetrics/src/main/java/com/yahoo/metrics/simple/Point.java +++ b/simplemetrics/src/main/java/com/yahoo/metrics/simple/Point.java @@ -17,6 +17,7 @@ import com.yahoo.jdisc.Metric.Context; */ @Beta public final class Point implements Context { + private final Value[] location; private final String[] dimensions; diff --git a/simplemetrics/src/main/java/com/yahoo/metrics/simple/UnitTestSetup.java b/simplemetrics/src/main/java/com/yahoo/metrics/simple/UnitTestSetup.java index 8ce3775d5e9..da9e981bf4a 100644 --- a/simplemetrics/src/main/java/com/yahoo/metrics/simple/UnitTestSetup.java +++ b/simplemetrics/src/main/java/com/yahoo/metrics/simple/UnitTestSetup.java @@ -12,6 +12,7 @@ import java.util.concurrent.TimeUnit; * @author ean */ public class UnitTestSetup { + MetricManager metricManager; MetricReceiver receiver; ObservableUpdater updater; diff --git a/simplemetrics/src/main/java/com/yahoo/metrics/simple/jdisc/SnapshotConverter.java b/simplemetrics/src/main/java/com/yahoo/metrics/simple/jdisc/SnapshotConverter.java index 45bdd142a60..83b84abaded 100644 --- a/simplemetrics/src/main/java/com/yahoo/metrics/simple/jdisc/SnapshotConverter.java +++ b/simplemetrics/src/main/java/com/yahoo/metrics/simple/jdisc/SnapshotConverter.java @@ -27,13 +27,6 @@ class SnapshotConverter { final Map<Point, Map<String, MetricValue>> perPointData = new HashMap<>(); private static final char[] DIGITS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - private Map<String, MetricValue> getMap(Point point) { - if (! perPointData.containsKey(point)) { - perPointData.put(point, new HashMap<>()); - } - return perPointData.get(point); - } - public SnapshotConverter(Bucket snapshot) { this.snapshot = snapshot; } @@ -65,7 +58,6 @@ class SnapshotConverter { } } - static MetricValue convert(UntypedMetric val) { if (val.isCounter()) { return CountMetric.newInstance(val.getCount()); @@ -80,7 +72,7 @@ class SnapshotConverter { } private static List<Tuple2<String, Double>> buildPercentileList(DoubleHistogram histogram) { - final List<Tuple2<String, Double>> prefixAndValues = new ArrayList<>(2); + List<Tuple2<String, Double>> prefixAndValues = new ArrayList<>(2); prefixAndValues.add(new Tuple2<>("95", histogram.getValueAtPercentile(95.0d))); prefixAndValues.add(new Tuple2<>("99", histogram.getValueAtPercentile(99.0d))); return prefixAndValues; @@ -101,6 +93,13 @@ class SnapshotConverter { data); } + private Map<String, MetricValue> getMap(Point point) { + if (! perPointData.containsKey(point)) { + perPointData.put(point, new HashMap<>()); + } + return perPointData.get(point); + } + void outputHistograms(PrintStream output) { boolean gotHistogram = false; for (Map.Entry<Identifier, UntypedMetric> entry : snapshot.entrySet()) { diff --git a/simplemetrics/src/test/java/com/yahoo/metrics/simple/DimensionsCacheTest.java b/simplemetrics/src/test/java/com/yahoo/metrics/simple/DimensionsCacheTest.java index 8c24baae560..c73493f7570 100644 --- a/simplemetrics/src/test/java/com/yahoo/metrics/simple/DimensionsCacheTest.java +++ b/simplemetrics/src/test/java/com/yahoo/metrics/simple/DimensionsCacheTest.java @@ -20,6 +20,7 @@ import com.yahoo.metrics.simple.UntypedMetric.AssumedType; * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> */ public class DimensionsCacheTest { + private static final int POINTS_TO_KEEP = 3; DimensionCache cache; @@ -52,7 +53,7 @@ public class DimensionsCacheTest { newestFound = true; } } - assertTrue("Did not keep newest measurement when padding points.", newestFound); + assertTrue("Kept newest measurement when padding points.", newestFound); } @Test diff --git a/simplemetrics/src/test/java/com/yahoo/metrics/simple/PointTest.java b/simplemetrics/src/test/java/com/yahoo/metrics/simple/PointTest.java new file mode 100644 index 00000000000..82f6c097dd8 --- /dev/null +++ b/simplemetrics/src/test/java/com/yahoo/metrics/simple/PointTest.java @@ -0,0 +1,23 @@ +package com.yahoo.metrics.simple; + +import org.junit.Test; + +import java.util.Collections; +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; + +/** + * @author bratseth + */ +public class PointTest { + + @Test + public void testPointEquality() { + Point a = new Point(Collections.emptyMap()); + Point b = new Point(new HashMap<>(0)); + assertEquals(a.hashCode(), b.hashCode()); + assertEquals(a, b); + } + +} diff --git a/simplemetrics/src/test/java/com/yahoo/metrics/simple/jdisc/SnapshotConverterTest.java b/simplemetrics/src/test/java/com/yahoo/metrics/simple/jdisc/SnapshotConverterTest.java new file mode 100644 index 00000000000..c5be6830fcb --- /dev/null +++ b/simplemetrics/src/test/java/com/yahoo/metrics/simple/jdisc/SnapshotConverterTest.java @@ -0,0 +1,25 @@ +package com.yahoo.metrics.simple.jdisc; + +import com.yahoo.container.jdisc.state.MetricDimensions; +import com.yahoo.metrics.simple.Point; +import org.junit.Test; + +import java.util.Collections; +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; + +/** + * @author bratseth + */ +public class SnapshotConverterTest { + + @Test + public void testConversion() { + MetricDimensions a = SnapshotConverter.convert(new Point(Collections.emptyMap())); + MetricDimensions b = SnapshotConverter.convert(new Point(new HashMap<>(0))); + assertEquals(a.hashCode(), b.hashCode()); + assertEquals(a, b); + } + +} |