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/src/main | |
parent | cce1d7872328f95c32567da873b061d974b5c862 (diff) |
Reuse same coredump/host-life gatherers
Diffstat (limited to 'metrics-proxy/src/main')
4 files changed, 33 insertions, 125 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); + } + } + } |