Skip to content

dump metaserver logs #78

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 49 additions & 1 deletion app/src/main/scala/hstream/server/KafkaBroker.scala
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,8 @@ class KafkaBroker(
s"""docker run -d --network host --name $metaServerContainerName -v $storeConfig:$storeConfig:ro
$image hstream-meta-server --host 127.0.0.1 --port $metaServerPort
--backend $storeConfig
--log-level trace
--log-flush-immediately
""".stripMargin.linesIterator.mkString(" ").trim
info(s"=> Start meta server by: $metaServerCmd")
Utils.runCommand(metaServerCmd)
Expand Down Expand Up @@ -317,6 +319,9 @@ class KafkaBroker(
s"docker run --rm --network host zookeeper:3.6 zkCli.sh -server 127.0.0.1:$metastorePort deleteall /hstream".!
// === spec 2: hornbill
} else if (spec == 2) {
// Dump meta server logs
info("=> dump meta server logs...")
dumpMetaContainerLogs()
// Remove meta server container
val metaServerContainerName = config.testingConfig
.getOrElse(
Expand Down Expand Up @@ -370,7 +375,9 @@ class KafkaBroker(
val containerLogsDir = config.testingConfig
.getOrElse("container_logs_dir", throw new IllegalArgumentException("container.logs_dir is required"))
.asInstanceOf[Path]
Files.createDirectories(containerLogsDir)
if (!Files.exists(containerLogsDir)) {
Files.createDirectories(containerLogsDir)
}

// FIXME: use "docker logs" may cause incomplete logs (? need to investigate)
//
Expand Down Expand Up @@ -406,4 +413,45 @@ class KafkaBroker(
}
}

private def dumpMetaContainerLogs() = {
val metaServerContainerName = config.testingConfig
.getOrElse(
"metaserver_container_name",
throw new IllegalArgumentException("metaserver_container_name is required")
)
.asInstanceOf[String]
val containerLogsDir = config.testingConfig
.getOrElse("container_logs_dir", throw new IllegalArgumentException("container.logs_dir is required"))
.asInstanceOf[Path]
if (!Files.exists(containerLogsDir)) {
Files.createDirectories(containerLogsDir)
}
val fileName = Paths.get(s"$containerLogsDir/$metaServerContainerName.log")
if (!Files.exists(fileName)) {
Files.createFile(fileName)
}
val writer = Files.newBufferedWriter(fileName, StandardOpenOption.APPEND)
val processLogger = ProcessLogger(
stdout => writer.write(stdout + "\n"),
stderr => writer.write(stderr + "\n")
)
try {
val cmd = Seq("docker", "logs", metaServerContainerName)
val code = Process(cmd).!(processLogger)
if (code != 0) {
error(s"Failed to dump logs to $fileName, exit code: $code")
} else {
// add a separator line to separate logs from different runs
writer.write("\n=================================================\n\n")
info(s"Dump logs to $fileName")
}
} catch {
case e: Exception =>
error(s"Failed to dump logs to $fileName, error: $e")
} finally {
writer.flush()
writer.close()
}
}

}