summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/state/CoredumpGatherer.java12
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/state/FileWrapper.java (renamed from metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/FileWrapper.java)3
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/state/HostLifeGatherer.java9
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/state/MetricGatherer.java5
-rw-r--r--container-core/src/test/java/com/yahoo/container/jdisc/state/CoredumpGathererTest.java (renamed from metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/CoredumpGathererTest.java)16
-rw-r--r--container-core/src/test/java/com/yahoo/container/jdisc/state/HostLifeGathererTest.java38
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/CoredumpMetricGatherer.java49
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/HostLifeGatherer.java44
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/NodeMetricGatherer.java37
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/HostLifeGathererTest.java37
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/NodeMetricGathererTest.java47
11 files changed, 141 insertions, 156 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/state/CoredumpGatherer.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/CoredumpGatherer.java
index 915cced842b..b0175c49f63 100644
--- a/container-core/src/main/java/com/yahoo/container/jdisc/state/CoredumpGatherer.java
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/CoredumpGatherer.java
@@ -20,13 +20,13 @@ public class CoredumpGatherer {
private static final Path COREDUMP_PATH = Path.of(Defaults.getDefaults().underVespaHome("var/crash/processing"));
- protected static JSONObject gatherCoredumpMetrics() {
- int coredumps = getNumberOfCoredumps();
+ public static JSONObject gatherCoredumpMetrics(FileWrapper fileWrapper) {
+ int coredumps = getNumberOfCoredumps(fileWrapper);
JSONObject packet = new JSONObject();
try {
packet.put("status_code", coredumps == 0 ? 0 : 1);
- packet.put("status_msg", coredumps == 0 ? "OK" : String.format("Found %d coredumps", coredumps));
+ packet.put("status_msg", coredumps == 0 ? "OK" : String.format("Found %d coredump(s)", coredumps));
packet.put("timestamp", Instant.now().getEpochSecond());
packet.put("application", "system-coredumps-processing");
@@ -34,10 +34,10 @@ public class CoredumpGatherer {
return packet;
}
- private static int getNumberOfCoredumps() {
+ private static int getNumberOfCoredumps(FileWrapper fileWrapper) {
try {
- return (int) Files.walk(COREDUMP_PATH)
- .filter(Files::isRegularFile)
+ return (int) fileWrapper.walkTree(COREDUMP_PATH)
+ .filter(fileWrapper::isRegularFile)
.count();
} catch (NoSuchFileException e) {
return 0;
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/FileWrapper.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/FileWrapper.java
index aa01802883e..6e22e02eb5b 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/node/FileWrapper.java
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/FileWrapper.java
@@ -1,11 +1,10 @@
// 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;
+package com.yahoo.container.jdisc.state;
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;
/**
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/state/HostLifeGatherer.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/HostLifeGatherer.java
index 91d1c468d8a..080a5a8dc32 100644
--- a/container-core/src/main/java/com/yahoo/container/jdisc/state/HostLifeGatherer.java
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/HostLifeGatherer.java
@@ -1,14 +1,11 @@
// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.container.jdisc.state;
-import com.yahoo.vespa.defaults.Defaults;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
-import java.nio.file.Files;
import java.nio.file.Path;
-import java.time.Duration;
import java.time.Instant;
/**
@@ -16,15 +13,15 @@ import java.time.Instant;
*/
public class HostLifeGatherer {
- private static final Path UPTIME_PATH = Path.of(Defaults.getDefaults().underVespaHome("/proc"));
+ private static final Path UPTIME_PATH = Path.of("/proc");
- protected static JSONObject getHostLifePacket() {
+ public static JSONObject getHostLifePacket(FileWrapper fileWrapper) {
long upTime;
int statusCode = 0;
String statusMessage = "OK";
try {
- upTime = Files.getLastModifiedTime(UPTIME_PATH).toInstant().getEpochSecond();
+ upTime = fileWrapper.getFileAgeInSeconds(UPTIME_PATH);
} catch (IOException e) {
upTime = 0;
statusCode = 1;
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricGatherer.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricGatherer.java
index 97fba188593..061ce7138ad 100644
--- a/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricGatherer.java
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricGatherer.java
@@ -13,10 +13,11 @@ import java.util.List;
public class MetricGatherer {
static List<JSONObject> getAdditionalMetrics() {
+ FileWrapper fileWrapper = new FileWrapper();
List<JSONObject> packetList = new ArrayList<>();
- packetList.add(CoredumpGatherer.gatherCoredumpMetrics());
+ packetList.add(CoredumpGatherer.gatherCoredumpMetrics(fileWrapper));
if (System.getProperty("os.name").contains("nux"))
- packetList.add(HostLifeGatherer.getHostLifePacket());
+ packetList.add(HostLifeGatherer.getHostLifePacket(fileWrapper));
return packetList;
}
}
diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/CoredumpGathererTest.java b/container-core/src/test/java/com/yahoo/container/jdisc/state/CoredumpGathererTest.java
index e7a905be52e..c1f7d790fa5 100644
--- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/CoredumpGathererTest.java
+++ b/container-core/src/test/java/com/yahoo/container/jdisc/state/CoredumpGathererTest.java
@@ -1,7 +1,8 @@
// 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;
+package com.yahoo.container.jdisc.state;
-import ai.vespa.metricsproxy.metric.model.MetricsPacket;
+import org.json.JSONException;
+import org.json.JSONObject;
import org.junit.Test;
import java.nio.file.Path;
@@ -9,17 +10,20 @@ 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();
+ public void finds_one_coredump() throws JSONException {
+ JSONObject packet = CoredumpGatherer.gatherCoredumpMetrics(new MockFileWrapper());
+
+ assertEquals("system-coredumps-processing", packet.getString("application"));
+ assertEquals(1, packet.getInt("status_code"));
+ assertEquals("Found 1 coredump(s)", packet.getString("status_msg"));
- assertEquals("system-coredumps-processing", packet.service.id);
- assertEquals(1, packet.statusCode);
}
static class MockFileWrapper extends FileWrapper {
diff --git a/container-core/src/test/java/com/yahoo/container/jdisc/state/HostLifeGathererTest.java b/container-core/src/test/java/com/yahoo/container/jdisc/state/HostLifeGathererTest.java
new file mode 100644
index 00000000000..d025b9662d2
--- /dev/null
+++ b/container-core/src/test/java/com/yahoo/container/jdisc/state/HostLifeGathererTest.java
@@ -0,0 +1,38 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.container.jdisc.state;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.Test;
+
+import java.nio.file.Path;
+
+import static org.junit.Assert.assertEquals;
+
+
+/**
+ * @author olaa
+ */
+public class HostLifeGathererTest {
+
+ @Test
+ public void host_is_alive() throws JSONException {
+ JSONObject packet = HostLifeGatherer.getHostLifePacket(new MockFileWrapper());
+ JSONObject metrics = packet.getJSONObject("metrics");
+ assertEquals("host_life", packet.getString("application"));
+ assertEquals(0, packet.getInt("status_code"));
+ assertEquals("OK", packet.getString("status_msg"));
+
+ assertEquals(123l, metrics.getLong("uptime"));
+ assertEquals(1, metrics.getInt("alive"));
+
+ }
+
+ static class MockFileWrapper extends FileWrapper {
+
+ @Override
+ long getFileAgeInSeconds(Path path) {
+ return 123;
+ }
+ }
+}
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/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/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