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 /docker-api/src/main | |
parent | 061fc95492d6ef775fdcf24a8ea4c6b23fde83c6 (diff) |
Make docker-api metric receiver independent of simplemetrics
Diffstat (limited to 'docker-api/src/main')
-rw-r--r-- | docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java | 12 | ||||
-rw-r--r-- | docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Counter.java | 28 | ||||
-rw-r--r-- | docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/CounterWrapper.java | 39 | ||||
-rw-r--r-- | docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Dimensions.java | 6 | ||||
-rw-r--r-- | docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Gauge.java | 24 | ||||
-rw-r--r-- | docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/GaugeWrapper.java | 35 | ||||
-rw-r--r-- | docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiver.java (renamed from docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiverWrapper.java) | 50 | ||||
-rw-r--r-- | docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricValue.java | 4 |
8 files changed, 79 insertions, 119 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(); |