summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2021-10-13 14:01:41 +0200
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2021-10-13 14:12:41 +0200
commit876c1982ac820db867d433fe1c2f450a9b1cf153 (patch)
tree020f8445f8c217df0ea5c115ba4419f9d3a103d0
parent74df86e04f42914589ff5b04404a30d118282479 (diff)
Add producer for Vespa log and pmap
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/ArtifactProducers.java6
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/PmapReporter.java23
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaLogDumper.java47
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/ArtifactProducersTest.java8
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaServiceDumperImplTest.java6
5 files changed, 82 insertions, 8 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/ArtifactProducers.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/ArtifactProducers.java
index 1dc288f4e75..4218df662da 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/ArtifactProducers.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/ArtifactProducers.java
@@ -47,13 +47,15 @@ class ArtifactProducers {
new JvmDumper.HeapDump(),
new JvmDumper.Jmap(),
new JvmDumper.Jstat(),
- new JvmDumper.Jstack());
+ new JvmDumper.Jstack(),
+ new PmapReporter(),
+ new VespaLogDumper(sleeper));
var aliases =
Map.of(
"jvm-dump",
List.of(
JvmDumper.HeapDump.class, JvmDumper.Jmap.class, JvmDumper.Jstat.class,
- JvmDumper.Jstack.class)
+ JvmDumper.Jstack.class, VespaLogDumper.class)
);
return new ArtifactProducers(producers, aliases);
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/PmapReporter.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/PmapReporter.java
new file mode 100644
index 00000000000..659628d03a0
--- /dev/null
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/PmapReporter.java
@@ -0,0 +1,23 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.node.admin.maintenance.servicedump;
+
+import java.nio.file.Path;
+import java.util.List;
+
+import static com.yahoo.vespa.hosted.node.admin.maintenance.servicedump.Artifact.Classification.INTERNAL;
+
+/**
+ * @author bjorncs
+ */
+class PmapReporter implements ArtifactProducer {
+ @Override public String artifactName() { return "pmap"; }
+ @Override public String description() { return "Pmap report"; }
+
+ @Override
+ public List<Artifact> produceArtifacts(Context ctx) {
+ Path pmapReport = ctx.outputDirectoryInNode().resolve("pmap.txt");
+ List<String> cmd = List.of("bash", "-c", "pmap -x " + ctx.servicePid() + " > " + pmapReport);
+ ctx.executeCommandInNode(cmd, true);
+ return List.of(Artifact.newBuilder().classification(INTERNAL).fileInNode(pmapReport).build());
+ }
+}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaLogDumper.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaLogDumper.java
new file mode 100644
index 00000000000..d9a9bdb1c04
--- /dev/null
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaLogDumper.java
@@ -0,0 +1,47 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.node.admin.maintenance.servicedump;
+
+import com.yahoo.yolean.concurrent.Sleeper;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.time.Duration;
+import java.util.List;
+import java.util.logging.Logger;
+
+import static com.yahoo.vespa.hosted.node.admin.maintenance.servicedump.Artifact.Classification.CONFIDENTIAL;
+import static com.yahoo.yolean.Exceptions.uncheck;
+
+/**
+ * @author bjorncs
+ */
+class VespaLogDumper implements ArtifactProducer {
+
+ private static final Logger log = Logger.getLogger(VespaLogDumper.class.getName());
+
+ private final Sleeper sleeper;
+
+ VespaLogDumper(Sleeper sleeper) { this.sleeper = sleeper; }
+
+ @Override public String artifactName() { return "vespa-log"; }
+ @Override public String description() { return "Current Vespa logs"; }
+
+ @Override
+ public List<Artifact> produceArtifacts(Context ctx) {
+ if (ctx.options().sendProfilingSignal()) {
+ log.info("Sending SIGPROF to process to include vespa-malloc dump in Vespa log");
+ ctx.executeCommandInNode(List.of("kill", "-SIGPROF", Integer.toString(ctx.servicePid())), true);
+ sleeper.sleep(Duration.ofSeconds(3));
+ }
+ Path vespaLogFile = ctx.pathOnHostFromPathInNode(ctx.pathInNodeUnderVespaHome("logs/vespa/vespa.log"));
+ Path destination = ctx.pathOnHostFromPathInNode(ctx.outputDirectoryInNode());
+ if (Files.exists(vespaLogFile)) {
+ uncheck(() -> Files.copy(vespaLogFile, destination));
+ return List.of(
+ Artifact.newBuilder().classification(CONFIDENTIAL).fileOnHost(destination).compressOnUpload().build());
+ } else {
+ log.info("Log file '" + vespaLogFile + "' does not exist");
+ return List.of();
+ }
+ }
+}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/ArtifactProducersTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/ArtifactProducersTest.java
index cc14bd69523..289f51ca867 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/ArtifactProducersTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/ArtifactProducersTest.java
@@ -18,9 +18,11 @@ class ArtifactProducersTest {
IllegalArgumentException exception = assertThrows(
IllegalArgumentException.class, () -> instance.resolve(List.of("unknown-artifact")));
String expectedMsg =
- "Invalid artifact type 'unknown-artifact'. Valid types are ['jvm-heap-dump', 'jvm-jfr', 'jvm-jmap', " +
- "'jvm-jstack', 'jvm-jstat', 'perf-report'] and valid aliases are ['jvm-dump': ['jvm-heap-dump', " +
- "'jvm-jmap', 'jvm-jstack', 'jvm-jstat']]";
+ "Invalid artifact type 'unknown-artifact'. Valid types are " +
+ "['jvm-heap-dump', 'jvm-jfr', 'jvm-jmap', 'jvm-jstack', 'jvm-jstat', 'perf-report', 'pmap', " +
+ "'vespa-log'] " +
+ "and valid aliases are " +
+ "['jvm-dump': ['jvm-heap-dump', 'jvm-jmap', 'jvm-jstack', 'jvm-jstat', 'vespa-log']]";
assertEquals(expectedMsg, exception.getMessage());
}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaServiceDumperImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaServiceDumperImplTest.java
index 0635d4072c0..0853223d142 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaServiceDumperImplTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaServiceDumperImplTest.java
@@ -69,7 +69,7 @@ class VespaServiceDumperImplTest {
SyncClient syncClient = createSyncClientMock();
NodeRepoMock nodeRepository = new NodeRepoMock();
ManualClock clock = new ManualClock(Instant.ofEpochMilli(1600001000000L));
- NodeSpec nodeSpec = createNodeSpecWithDumpRequest(nodeRepository, List.of("perf-report"), new ServiceDumpReport.DumpOptions(true, 45.0));
+ NodeSpec nodeSpec = createNodeSpecWithDumpRequest(nodeRepository, List.of("perf-report"), new ServiceDumpReport.DumpOptions(true, 45.0, null));
VespaServiceDumper reporter = new VespaServiceDumperImpl(
ArtifactProducers.createDefault(Sleeper.NOOP), operations, syncClient, nodeRepository, clock);
@@ -111,7 +111,7 @@ class VespaServiceDumperImplTest {
NodeRepoMock nodeRepository = new NodeRepoMock();
ManualClock clock = new ManualClock(Instant.ofEpochMilli(1600001000000L));
NodeSpec nodeSpec = createNodeSpecWithDumpRequest(
- nodeRepository, List.of("jvm-jfr"), new ServiceDumpReport.DumpOptions(null, null));
+ nodeRepository, List.of("jvm-jfr"), new ServiceDumpReport.DumpOptions(null, null, null));
VespaServiceDumper reporter = new VespaServiceDumperImpl(
ArtifactProducers.createDefault(Sleeper.NOOP), operations, syncClient, nodeRepository, clock);
@@ -155,7 +155,7 @@ class VespaServiceDumperImplTest {
NodeRepoMock nodeRepository = new NodeRepoMock();
ManualClock clock = new ManualClock(Instant.ofEpochMilli(1600001000000L));
NodeSpec nodeSpec = createNodeSpecWithDumpRequest(nodeRepository, List.of("perf-report", "jvm-jfr"),
- new ServiceDumpReport.DumpOptions(true, 20.0));
+ new ServiceDumpReport.DumpOptions(true, 20.0, null));
VespaServiceDumper reporter = new VespaServiceDumperImpl(
ArtifactProducers.createDefault(Sleeper.NOOP), operations, syncClient, nodeRepository, clock);
NodeAgentContextImpl context = new NodeAgentContextImpl.Builder(nodeSpec)