diff options
author | Ola Aunrønning <olaa@verizonmedia.com> | 2019-10-25 12:14:54 +0200 |
---|---|---|
committer | Ola Aunrønning <olaa@verizonmedia.com> | 2019-10-25 12:20:41 +0200 |
commit | 57fc9b631319ab522971c9272ecc6c84a9045343 (patch) | |
tree | 80f4308c27ca36ecf4976925b115c31e58de78b2 /metrics-proxy | |
parent | cce1d7872328f95c32567da873b061d974b5c862 (diff) |
Reuse same coredump/host-life gatherers
Diffstat (limited to 'metrics-proxy')
7 files changed, 80 insertions, 201 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/CoredumpMetricGatherer.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/CoredumpMetricGatherer.java deleted file mode 100644 index 09f0bbe16a6..00000000000 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/CoredumpMetricGatherer.java +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package ai.vespa.metricsproxy.node; - -import ai.vespa.metricsproxy.metric.model.ConsumerId; -import ai.vespa.metricsproxy.metric.model.MetricsPacket; -import ai.vespa.metricsproxy.metric.model.ServiceId; -import com.yahoo.vespa.defaults.Defaults; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.nio.file.NoSuchFileException; -import java.nio.file.Path; -import java.time.Instant; -import java.util.Set; -import java.util.logging.Logger; - - -/** - * @author olaa - */ -public class CoredumpMetricGatherer { - - private static final Path COREDUMP_PATH = Path.of(Defaults.getDefaults().underVespaHome("var/crash/processing")); - - private static final Logger logger = Logger.getLogger(CoredumpMetricGatherer.class.getSimpleName()); - - - protected static MetricsPacket.Builder gatherCoredumpMetrics(FileWrapper fileWrapper) { - int coredumps = getNumberOfCoredumps(fileWrapper); - return new MetricsPacket.Builder(ServiceId.toServiceId("system-coredumps-processing")) - .timestamp(Instant.now().getEpochSecond()) - .statusCode(coredumps) - .statusMessage(coredumps == 0 ? "OK" : String.format("Found %d coredumps", coredumps)) - .addConsumers(Set.of(ConsumerId.toConsumerId("Vespa"))); - } - - private static int getNumberOfCoredumps(FileWrapper fileWrapper) { - try { - return (int) fileWrapper.walkTree(COREDUMP_PATH) - .filter(fileWrapper::isRegularFile) - .count(); - } catch (NoSuchFileException e) { - return 0; - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - -} diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/FileWrapper.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/FileWrapper.java deleted file mode 100644 index aa01802883e..00000000000 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/FileWrapper.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package ai.vespa.metricsproxy.node; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.time.Instant; -import java.util.List; -import java.util.stream.Stream; - -/** - * @author olaa - */ -public class FileWrapper { - - long getFileAgeInSeconds(Path path) throws IOException { - Instant lastModifiedTime = Files.getLastModifiedTime(path).toInstant(); - return Instant.now().getEpochSecond() - lastModifiedTime.getEpochSecond(); - } - - Stream<Path> walkTree(Path path) throws IOException { - return Files.walk(path); - } - - boolean isRegularFile(Path path) { - return Files.isRegularFile(path); - } -} diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/HostLifeGatherer.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/HostLifeGatherer.java deleted file mode 100644 index 8fdfc93022c..00000000000 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/HostLifeGatherer.java +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package ai.vespa.metricsproxy.node; - -import ai.vespa.metricsproxy.metric.model.ConsumerId; -import ai.vespa.metricsproxy.metric.model.MetricId; -import ai.vespa.metricsproxy.metric.model.MetricsPacket; -import ai.vespa.metricsproxy.metric.model.ServiceId; - -import java.io.IOException; -import java.nio.file.Path; -import java.time.Instant; -import java.util.Set; - - -/** - * @author olaa - */ -public class HostLifeGatherer { - - private static final Path UPTIME_PATH = Path.of("/proc"); - - protected static MetricsPacket.Builder gatherHostLifeMetrics(FileWrapper fileWrapper) { - long upTime; - int statusCode = 0; - String statusMessage = "OK"; - - try { - upTime = fileWrapper.getFileAgeInSeconds(UPTIME_PATH); - } catch (IOException e) { - upTime = 0; - statusCode = 1; - statusMessage = e.getMessage(); - } - - return new MetricsPacket.Builder(ServiceId.toServiceId("host_life")) - .timestamp(Instant.now().getEpochSecond()) - .statusMessage(statusMessage) - .statusCode(statusCode) - .putMetric(MetricId.toMetricId("uptime"), upTime) - .putMetric(MetricId.toMetricId("alive"), 1) - .addConsumers(Set.of(ConsumerId.toConsumerId("Vespa"))); - } - -} diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/NodeMetricGatherer.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/NodeMetricGatherer.java index cd71bb781fe..3cd9f526387 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/NodeMetricGatherer.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/NodeMetricGatherer.java @@ -4,17 +4,24 @@ package ai.vespa.metricsproxy.node; import ai.vespa.metricsproxy.core.MetricsManager; import ai.vespa.metricsproxy.metric.dimensions.ApplicationDimensions; import ai.vespa.metricsproxy.metric.dimensions.NodeDimensions; +import ai.vespa.metricsproxy.metric.model.MetricId; import ai.vespa.metricsproxy.metric.model.MetricsPacket; +import ai.vespa.metricsproxy.metric.model.ServiceId; import ai.vespa.metricsproxy.service.SystemPollerProvider; import ai.vespa.metricsproxy.service.VespaServices; import com.google.inject.Inject; +import com.yahoo.container.jdisc.state.CoredumpGatherer; +import com.yahoo.container.jdisc.state.FileWrapper; +import com.yahoo.container.jdisc.state.HostLifeGatherer; +import com.yahoo.yolean.Exceptions; +import org.json.JSONException; +import org.json.JSONObject; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; -import static ai.vespa.metricsproxy.node.CoredumpMetricGatherer.gatherCoredumpMetrics; -import static ai.vespa.metricsproxy.node.HostLifeGatherer.gatherHostLifeMetrics; import static ai.vespa.metricsproxy.node.ServiceHealthGatherer.gatherServiceHealthMetrics; /** @@ -45,11 +52,13 @@ public class NodeMetricGatherer { public List<MetricsPacket> gatherMetrics() { FileWrapper fileWrapper = new FileWrapper(); List<MetricsPacket.Builder> metricPacketBuilders = new ArrayList<>(); - metricPacketBuilders.add(gatherCoredumpMetrics(fileWrapper)); metricPacketBuilders.addAll(gatherServiceHealthMetrics(vespaServices)); + JSONObject coredumpPacket = CoredumpGatherer.gatherCoredumpMetrics(fileWrapper); + addObjectToBuilders(metricPacketBuilders, coredumpPacket); if (SystemPollerProvider.runningOnLinux()) { - metricPacketBuilders.add(gatherHostLifeMetrics(fileWrapper)); + JSONObject packet = HostLifeGatherer.getHostLifePacket(fileWrapper); + addObjectToBuilders(metricPacketBuilders, packet); } return metricPacketBuilders.stream() @@ -60,4 +69,24 @@ public class NodeMetricGatherer { ).collect(Collectors.toList()); } + protected static void addObjectToBuilders(List<MetricsPacket.Builder> builders, JSONObject object) { + try { + MetricsPacket.Builder builder = new MetricsPacket.Builder(ServiceId.toServiceId(object.getString("application"))); + builder.timestamp(object.getLong("timestamp")); + if (object.has("status_code")) builder.statusCode(object.getInt("status_code")); + if (object.has("status_msg")) builder.statusMessage(object.getString("status_msg")); + if (object.has("metrics")) { + JSONObject metrics = object.getJSONObject("metrics"); + Iterator<?> keys = metrics.keys(); + while(keys.hasNext()) { + String key = (String) keys.next(); + builder.putMetric(MetricId.toMetricId(key), metrics.getLong(key)); + } + } + builders.add(builder); + } catch (JSONException e) { + Exceptions.toMessageString(e); + } + } + } diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/CoredumpGathererTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/CoredumpGathererTest.java deleted file mode 100644 index e7a905be52e..00000000000 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/CoredumpGathererTest.java +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package ai.vespa.metricsproxy.node; - -import ai.vespa.metricsproxy.metric.model.MetricsPacket; -import org.junit.Test; - -import java.nio.file.Path; -import java.util.stream.Stream; - -import static org.junit.Assert.assertEquals; - -/** - * @author olaa - */ -public class CoredumpGathererTest { - - @Test - public void finds_one_coredump() { - MetricsPacket packet = CoredumpMetricGatherer.gatherCoredumpMetrics(new MockFileWrapper()).build(); - - assertEquals("system-coredumps-processing", packet.service.id); - assertEquals(1, packet.statusCode); - } - - static class MockFileWrapper extends FileWrapper { - - - @Override - Stream<Path> walkTree(Path path) { - return Stream.of(Path.of("dummy-path")); - } - - @Override - boolean isRegularFile(Path path) { - return true; - } - } - -} diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/HostLifeGathererTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/HostLifeGathererTest.java deleted file mode 100644 index 8317229b73a..00000000000 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/HostLifeGathererTest.java +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package ai.vespa.metricsproxy.node; - -import ai.vespa.metricsproxy.metric.model.MetricId; -import ai.vespa.metricsproxy.metric.model.MetricsPacket; -import org.junit.Test; - -import java.nio.file.Path; -import java.time.Instant; -import java.util.List; -import java.util.Map; - -import static org.junit.Assert.assertEquals; - -/** - * @author olaa - */ -public class HostLifeGathererTest { - - @Test - public void host_is_alive() { - MetricsPacket packet = HostLifeGatherer.gatherHostLifeMetrics(new MockFileWrapper()).build(); - - assertEquals("host_life", packet.service.id); - assertEquals(0, packet.statusCode); - assertEquals(123l, packet.metrics().get(MetricId.toMetricId("uptime"))); - assertEquals(1, packet.metrics().get(MetricId.toMetricId("alive"))); - - } - - static class MockFileWrapper extends FileWrapper { - @Override - long getFileAgeInSeconds(Path path) { - return 123; - } - } -} diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/NodeMetricGathererTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/NodeMetricGathererTest.java new file mode 100644 index 00000000000..316e67c13d5 --- /dev/null +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/NodeMetricGathererTest.java @@ -0,0 +1,47 @@ +package ai.vespa.metricsproxy.node; + +import ai.vespa.metricsproxy.metric.model.MetricId; +import ai.vespa.metricsproxy.metric.model.MetricsPacket; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +/** + * @author olaa + */ +public class NodeMetricGathererTest { + + @Test + public void testJSONObjectIsCorrectlyConvertedToMetricsPacket() throws JSONException { + List<MetricsPacket.Builder> builders = new ArrayList<>(); + JSONObject hostLifePacket = generateHostLifePacket(); + NodeMetricGatherer.addObjectToBuilders(builders, hostLifePacket); + MetricsPacket packet = builders.remove(0).build(); + + assertEquals("host_life", packet.service.id); + assertEquals(0, packet.statusCode); + assertEquals("OK", packet.statusMessage); + assertEquals(123, packet.timestamp); + assertEquals(12l, packet.metrics().get(MetricId.toMetricId("uptime"))); + assertEquals(1l, packet.metrics().get(MetricId.toMetricId("alive"))); + } + + private JSONObject generateHostLifePacket() throws JSONException { + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("status_code", 0); + jsonObject.put("status_msg", "OK"); + jsonObject.put("timestamp", 123); + jsonObject.put("application", "host_life"); + JSONObject metrics = new JSONObject(); + metrics.put("uptime", 12); + metrics.put("alive", 1); + jsonObject.put("metrics", metrics); + return jsonObject; + } +}
\ No newline at end of file |