summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValerij Fredriksen <valerij92@gmail.com>2019-06-16 14:04:34 +0200
committerValerij Fredriksen <valerijf@verizonmedia.com>2019-06-16 16:02:10 +0200
commit3100269646e934e6494f00a1bdb41e18a7f213e2 (patch)
treec96a242388270215dd45e158f56b48e02b35077e
parent061fc95492d6ef775fdcf24a8ea4c6b23fde83c6 (diff)
Make docker-api metric receiver independent of simplemetrics
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java12
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Counter.java28
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/CounterWrapper.java39
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Dimensions.java6
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/Gauge.java24
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/metrics/GaugeWrapper.java35
-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.java4
-rw-r--r--docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/DockerImplTest.java5
-rw-r--r--docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiverTest.java (renamed from docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/metrics/MetricReceiverWrapperTest.java)21
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.);