diff options
author | Valerij Fredriksen <valerij92@gmail.com> | 2019-06-16 14:04:34 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-06-16 16:02:10 +0200 |
commit | 3100269646e934e6494f00a1bdb41e18a7f213e2 (patch) | |
tree | c96a242388270215dd45e158f56b48e02b35077e | |
parent | 061fc95492d6ef775fdcf24a8ea4c6b23fde83c6 (diff) |
Make docker-api metric receiver independent of simplemetrics
10 files changed, 91 insertions, 133 deletions
diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java index ce8a7df3166..707961fa3b3 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java @@ -26,8 +26,8 @@ import com.yahoo.log.LogLevel; import com.yahoo.vespa.hosted.dockerapi.exception.ContainerNotFoundException; import com.yahoo.vespa.hosted.dockerapi.exception.DockerException; import com.yahoo.vespa.hosted.dockerapi.exception.DockerExecTimeoutException; -import com.yahoo.vespa.hosted.dockerapi.metrics.CounterWrapper; -import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper; +import com.yahoo.vespa.hosted.dockerapi.metrics.Counter; +import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiver; import java.io.ByteArrayOutputStream; import java.time.Duration; @@ -55,14 +55,14 @@ public class DockerImpl implements Docker { private final DockerClient dockerClient; private final DockerImageGarbageCollector dockerImageGC; - private final CounterWrapper numberOfDockerApiFails; + private final Counter numberOfDockerApiFails; @Inject - public DockerImpl(MetricReceiverWrapper metricReceiverWrapper) { - this(createDockerClient(), metricReceiverWrapper); + public DockerImpl(MetricReceiver metricReceiver) { + this(createDockerClient(), metricReceiver); } - DockerImpl(DockerClient dockerClient, MetricReceiverWrapper metricReceiver) { + DockerImpl(DockerClient dockerClient, MetricReceiver metricReceiver) { this.dockerClient = dockerClient; this.dockerImageGC = new DockerImageGarbageCollector(this); diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Counter.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Counter.java new file mode 100644 index 00000000000..a4df3e83596 --- /dev/null +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Counter.java @@ -0,0 +1,28 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.dockerapi.metrics; + +/** + * @author freva + */ +public class Counter implements MetricValue { + private final Object lock = new Object(); + + private long value = 0; + + public void add() { + add(1L); + } + + public void add(long n) { + synchronized (lock) { + value += n; + } + } + + @Override + public Number getValue() { + synchronized (lock) { + return value; + } + } +} diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/CounterWrapper.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/CounterWrapper.java deleted file mode 100644 index 55c42271674..00000000000 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/CounterWrapper.java +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.dockerapi.metrics; - -import com.yahoo.metrics.simple.Counter; - -/** - * Forwards sample to {@link com.yahoo.metrics.simple.Counter} to be displayed in /state/v1/metrics, - * while also saving the value so it can be accessed programatically later. - * - * @author valerijf - */ -public class CounterWrapper implements MetricValue { - private final Object lock = new Object(); - - private final Counter counter; - private long value = 0; - - CounterWrapper(Counter counter) { - this.counter = counter; - } - - public void add() { - add(1L); - } - - public void add(long n) { - synchronized (lock) { - counter.add(n); - value += n; - } - } - - @Override - public Number getValue() { - synchronized (lock) { - return value; - } - } -} diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Dimensions.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Dimensions.java index ae4829d4b07..63b92e06505 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Dimensions.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Dimensions.java @@ -1,13 +1,11 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.dockerapi.metrics; import java.util.HashMap; import java.util.Map; /** - * Each metric reported to secret agent has dimensions. - * - * @author valerijf + * @author freva */ public class Dimensions { diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Gauge.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Gauge.java new file mode 100644 index 00000000000..b413475fc2b --- /dev/null +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Gauge.java @@ -0,0 +1,24 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.dockerapi.metrics; + +/** + * @author freva + */ +public class Gauge implements MetricValue { + private final Object lock = new Object(); + + private double value; + + public void sample(double x) { + synchronized (lock) { + this.value = x; + } + } + + @Override + public Number getValue() { + synchronized (lock) { + return value; + } + } +} diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/GaugeWrapper.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/GaugeWrapper.java deleted file mode 100644 index 02e1f15a94f..00000000000 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/GaugeWrapper.java +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.dockerapi.metrics; - -import com.yahoo.metrics.simple.Gauge; - -/** - * Forwards sample to {@link com.yahoo.metrics.simple.Gauge} to be displayed in /state/v1/metrics, - * while also saving the value so it can be accessed programatically later. - * - * @author valerijf - */ -public class GaugeWrapper implements MetricValue { - private final Object lock = new Object(); - - private final Gauge gauge; - private double value; - - GaugeWrapper(Gauge gauge) { - this.gauge = gauge; - } - - public void sample(double x) { - synchronized (lock) { - gauge.sample(x); - this.value = x; - } - } - - @Override - public Number getValue() { - synchronized (lock) { - return value; - } - } -} diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiverWrapper.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiver.java index d263d138314..234ccba3859 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiverWrapper.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiver.java @@ -2,8 +2,6 @@ package com.yahoo.vespa.hosted.dockerapi.metrics; import com.google.inject.Inject; -import com.yahoo.metrics.simple.MetricReceiver; -import com.yahoo.metrics.simple.Point; import java.util.ArrayList; import java.util.HashMap; @@ -14,30 +12,26 @@ import java.util.Optional; import java.util.stream.Collectors; /** - * Export metrics to both /state/v1/metrics and makes them available programmatically. - * Each metric belongs to a monitoring application + * Stores the latest metric for the given application, name, dimension triplet in memory * * @author freva */ -public class MetricReceiverWrapper { +public class MetricReceiver { // Application names used public static final String APPLICATION_HOST = "vespa.host"; public static final String APPLICATION_NODE = "vespa.node"; private final Object monitor = new Object(); private final Map<DimensionType, Map<String, ApplicationMetrics>> metrics = new HashMap<>(); - private final MetricReceiver metricReceiver; @Inject - public MetricReceiverWrapper(MetricReceiver metricReceiver) { - this.metricReceiver = metricReceiver; - } + public MetricReceiver() { } /** * Creates a counter metric under vespa.host application, with no dimensions and default dimension type * See {@link #declareCounter(String, String, Dimensions, DimensionType)} */ - public CounterWrapper declareCounter(String name) { + public Counter declareCounter(String name) { return declareCounter(name, Dimensions.NONE); } @@ -45,21 +39,16 @@ public class MetricReceiverWrapper { * Creates a counter metric under vespa.host application, with the given dimensions and default dimension type * See {@link #declareCounter(String, String, Dimensions, DimensionType)} */ - public CounterWrapper declareCounter(String name, Dimensions dimensions) { + public Counter declareCounter(String name, Dimensions dimensions) { return declareCounter(APPLICATION_HOST, name, dimensions, DimensionType.DEFAULT); } /** Creates a counter metric. This method is idempotent. */ - public CounterWrapper declareCounter(String application, String name, Dimensions dimensions, DimensionType type) { + public Counter declareCounter(String application, String name, Dimensions dimensions, DimensionType type) { synchronized (monitor) { - Map<Dimensions, Map<String, MetricValue>> metricsByDimensions = getOrCreateApplicationMetrics(application, type); - if (!metricsByDimensions.containsKey(dimensions)) metricsByDimensions.put(dimensions, new HashMap<>()); - if (!metricsByDimensions.get(dimensions).containsKey(name)) { - CounterWrapper counter = new CounterWrapper(metricReceiver.declareCounter(name, new Point(dimensions.dimensionsMap))); - metricsByDimensions.get(dimensions).put(name, counter); - } - - return (CounterWrapper) metricsByDimensions.get(dimensions).get(name); + return (Counter) getOrCreateApplicationMetrics(application, type) + .computeIfAbsent(dimensions, d -> new HashMap<>()) + .computeIfAbsent(name, n -> new Counter()); } } @@ -67,7 +56,7 @@ public class MetricReceiverWrapper { * Creates a gauge metric under vespa.host application, with no dimensions and default dimension type * See {@link #declareGauge(String, String, Dimensions, DimensionType)} */ - public GaugeWrapper declareGauge(String name) { + public Gauge declareGauge(String name) { return declareGauge(name, Dimensions.NONE); } @@ -75,22 +64,16 @@ public class MetricReceiverWrapper { * Creates a gauge metric under vespa.host application, with the given dimensions and default dimension type * See {@link #declareGauge(String, String, Dimensions, DimensionType)} */ - public GaugeWrapper declareGauge(String name, Dimensions dimensions) { + public Gauge declareGauge(String name, Dimensions dimensions) { return declareGauge(APPLICATION_HOST, name, dimensions, DimensionType.DEFAULT); } /** Creates a gauge metric. This method is idempotent */ - public GaugeWrapper declareGauge(String application, String name, Dimensions dimensions, DimensionType type) { + public Gauge declareGauge(String application, String name, Dimensions dimensions, DimensionType type) { synchronized (monitor) { - Map<Dimensions, Map<String, MetricValue>> metricsByDimensions = getOrCreateApplicationMetrics(application, type); - if (!metricsByDimensions.containsKey(dimensions)) - metricsByDimensions.put(dimensions, new HashMap<>()); - if (!metricsByDimensions.get(dimensions).containsKey(name)) { - GaugeWrapper gauge = new GaugeWrapper(metricReceiver.declareGauge(name, new Point(dimensions.dimensionsMap))); - metricsByDimensions.get(dimensions).put(name, gauge); - } - - return (GaugeWrapper) metricsByDimensions.get(dimensions).get(name); + return (Gauge) getOrCreateApplicationMetrics(application, type) + .computeIfAbsent(dimensions, d -> new HashMap<>()) + .computeIfAbsent(name, n -> new Gauge()); } } @@ -140,5 +123,6 @@ public class MetricReceiverWrapper { DEFAULT, /** Pretagged metrics will only get the dimensions explicitly set when creating the counter/gauge */ - PRETAGGED} + PRETAGGED + } } diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricValue.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricValue.java index 7bd4968747f..b20aa1b11ff 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricValue.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricValue.java @@ -1,8 +1,8 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.dockerapi.metrics; /** - * @author valerijf + * @author freva */ public interface MetricValue { Number getValue(); diff --git a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerImplTest.java b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerImplTest.java index df221302575..81aa5b05ad6 100644 --- a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerImplTest.java +++ b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerImplTest.java @@ -14,8 +14,7 @@ import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.core.command.ExecStartResultCallback; import com.yahoo.config.provision.DockerImage; -import com.yahoo.metrics.simple.MetricReceiver; -import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper; +import com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiver; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Matchers; @@ -37,7 +36,7 @@ import static org.mockito.Mockito.when; public class DockerImplTest { private final DockerClient dockerClient = mock(DockerClient.class); - private final MetricReceiverWrapper metricReceiver = new MetricReceiverWrapper(MetricReceiver.nullImplementation); + private final MetricReceiver metricReceiver = new MetricReceiver(); private final DockerImpl docker = new DockerImpl(dockerClient, metricReceiver); @Test diff --git a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiverWrapperTest.java b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiverTest.java index f9cbff98cde..40b7dfa6878 100644 --- a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiverWrapperTest.java +++ b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiverTest.java @@ -1,22 +1,21 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.dockerapi.metrics; -import com.yahoo.metrics.simple.MetricReceiver; import org.junit.Test; import java.util.Map; import java.util.stream.Collectors; -import static com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper.APPLICATION_HOST; -import static com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper.DimensionType.DEFAULT; +import static com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiver.APPLICATION_HOST; +import static com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiver.DimensionType.DEFAULT; import static org.junit.Assert.assertEquals; /** * @author freva */ -public class MetricReceiverWrapperTest { +public class MetricReceiverTest { private static final Dimensions hostDimension = new Dimensions.Builder().add("host", "abc.yahoo.com").build(); - private final MetricReceiverWrapper metricReceiver = new MetricReceiverWrapper(MetricReceiver.nullImplementation); + private final MetricReceiver metricReceiver = new MetricReceiver(); @Test public void testDefaultValue() { @@ -27,7 +26,7 @@ public class MetricReceiverWrapperTest { @Test public void testSimpleIncrementMetric() { - CounterWrapper counter = metricReceiver.declareCounter("a_counter.value", hostDimension); + Counter counter = metricReceiver.declareCounter("a_counter.value", hostDimension); counter.add(5); counter.add(8); @@ -39,7 +38,7 @@ public class MetricReceiverWrapperTest { @Test public void testSimpleGauge() { - GaugeWrapper gauge = metricReceiver.declareGauge("test.gauge", hostDimension); + Gauge gauge = metricReceiver.declareGauge("test.gauge", hostDimension); gauge.sample(42); gauge.sample(-342.23); @@ -51,12 +50,12 @@ public class MetricReceiverWrapperTest { @Test public void testRedeclaringSameGauge() { - GaugeWrapper gauge = metricReceiver.declareGauge("test.gauge", hostDimension); + Gauge gauge = metricReceiver.declareGauge("test.gauge", hostDimension); gauge.sample(42); // Same as hostDimension, but new instance. Dimensions newDimension = new Dimensions.Builder().add("host", "abc.yahoo.com").build(); - GaugeWrapper newGauge = metricReceiver.declareGauge("test.gauge", newDimension); + Gauge newGauge = metricReceiver.declareGauge("test.gauge", newDimension); newGauge.sample(56); assertEquals(getMetricsForDimension(hostDimension).get("test.gauge"), 56.); @@ -64,12 +63,12 @@ public class MetricReceiverWrapperTest { @Test public void testSameMetricNameButDifferentDimensions() { - GaugeWrapper gauge = metricReceiver.declareGauge("test.gauge", hostDimension); + Gauge gauge = metricReceiver.declareGauge("test.gauge", hostDimension); gauge.sample(42); // Not the same as hostDimension. Dimensions newDimension = new Dimensions.Builder().add("host", "abcd.yahoo.com").build(); - GaugeWrapper newGauge = metricReceiver.declareGauge("test.gauge", newDimension); + Gauge newGauge = metricReceiver.declareGauge("test.gauge", newDimension); newGauge.sample(56); assertEquals(getMetricsForDimension(hostDimension).get("test.gauge"), 42.); |