From efb808cff3a51f8eba15fb6bc43e8b53ae17143c Mon Sep 17 00:00:00 2001 From: Valerij Fredriksen Date: Thu, 22 Sep 2022 09:50:13 +0200 Subject: Revert "Revert "Make it possible to limit number of log lines returned" (#24168)" This reverts commit d058fe597d6ba98f27c146cf725752aab1405772. --- .../main/java/com/yahoo/container/handler/LogHandler.java | 12 +++--------- .../main/java/com/yahoo/container/handler/LogReader.java | 15 ++++----------- 2 files changed, 7 insertions(+), 20 deletions(-) (limited to 'container-core/src/main/java/com') diff --git a/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java b/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java index d151eb6862d..72a399744f3 100644 --- a/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java +++ b/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java @@ -4,21 +4,15 @@ package com.yahoo.container.handler; import com.yahoo.component.annotation.Inject; import com.yahoo.container.core.LogHandlerConfig; import com.yahoo.container.jdisc.AsyncHttpResponse; -import com.yahoo.container.jdisc.ContentChannelOutputStream; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.ThreadedHttpRequestHandler; import com.yahoo.jdisc.handler.CompletionHandler; import com.yahoo.jdisc.handler.ContentChannel; -import java.io.IOException; -import java.io.InterruptedIOException; import java.io.OutputStream; -import java.nio.ByteBuffer; import java.time.Instant; import java.util.Optional; import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; public class LogHandler extends ThreadedHttpRequestHandler { @@ -42,6 +36,8 @@ public class LogHandler extends ThreadedHttpRequestHandler { .map(Long::valueOf).map(Instant::ofEpochMilli).orElse(Instant.MIN); Instant to = Optional.ofNullable(request.getProperty("to")) .map(Long::valueOf).map(Instant::ofEpochMilli).orElse(Instant.MAX); + long maxLines = Optional.ofNullable(request.getProperty("maxLines")) + .map(Long::valueOf).orElse(100_000L); Optional hostname = Optional.ofNullable(request.getProperty("hostname")); return new AsyncHttpResponse(200) { @@ -50,7 +46,7 @@ public class LogHandler extends ThreadedHttpRequestHandler { @Override public void render(OutputStream output, ContentChannel networkChannel, CompletionHandler handler) { try (output) { - logReader.writeLogs(output, from, to, hostname); + logReader.writeLogs(output, from, to, maxLines, hostname); } catch (Throwable t) { log.log(Level.WARNING, "Failed reading logs from " + from + " to " + to, t); @@ -62,6 +58,4 @@ public class LogHandler extends ThreadedHttpRequestHandler { }; } - - } diff --git a/container-core/src/main/java/com/yahoo/container/handler/LogReader.java b/container-core/src/main/java/com/yahoo/container/handler/LogReader.java index 93881b52eb6..dae4b940307 100644 --- a/container-core/src/main/java/com/yahoo/container/handler/LogReader.java +++ b/container-core/src/main/java/com/yahoo/container/handler/LogReader.java @@ -59,9 +59,10 @@ class LogReader { this.logFilePattern = logFilePattern; } - void writeLogs(OutputStream out, Instant from, Instant to, Optional hostname) { + void writeLogs(OutputStream out, Instant from, Instant to, long maxLines, Optional hostname) { double fromSeconds = from.getEpochSecond() + from.getNano() / 1e9; double toSeconds = to.getEpochSecond() + to.getNano() / 1e9; + long linesWritten = 0; BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); for (List logs : getMatchingFiles(from, to)) { List logLineIterators = new ArrayList<>(); @@ -73,6 +74,7 @@ class LogReader { Iterator lines = Iterators.mergeSorted(logLineIterators, Comparator.comparingDouble(LineWithTimestamp::timestamp)); while (lines.hasNext()) { + if (linesWritten++ >= maxLines) return; String line = lines.next().line(); writer.write(line); writer.newLine(); @@ -187,16 +189,7 @@ class LogReader { } - private static class LineWithTimestamp { - final String line; - final double timestamp; - LineWithTimestamp(String line, double timestamp) { - this.line = line; - this.timestamp = timestamp; - } - String line() { return line; } - double timestamp() { return timestamp; } - } + private record LineWithTimestamp(String line, double timestamp) { } /** Returns log files which may have relevant entries, grouped and sorted by {@link #extractTimestamp(Path)} — the first and last group must be filtered. */ private List> getMatchingFiles(Instant from, Instant to) { -- cgit v1.2.3