diff options
Diffstat (limited to 'container-core/src/main/java/com/yahoo/container')
4 files changed, 38 insertions, 43 deletions
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 2890cbfb5ab..9f270acce5f 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 @@ -29,6 +29,7 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Optional; +import java.util.PriorityQueue; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -43,13 +44,13 @@ import static java.nio.charset.StandardCharsets.UTF_8; * @author jonmv */ class LogReader { + static final Pattern logArchivePathPattern = Pattern.compile("(\\d{4})/(\\d{2})/(\\d{2})/(\\d{2})-\\d+(\\.gz|\\.zst)?"); static final Pattern vespaLogPathPattern = Pattern.compile("vespa\\.log(?:-(\\d{4})-(\\d{2})-(\\d{2})\\.(\\d{2})-(\\d{2})-(\\d{2})(?:\\.gz|\\.zst)?)?"); private final Path logDirectory; private final Pattern logFilePattern; - LogReader(String logDirectory, String logFilePattern) { this(Paths.get(Defaults.getDefaults().underVespaHome(logDirectory)), Pattern.compile(logFilePattern)); } @@ -73,10 +74,18 @@ class LogReader { Iterator<LineWithTimestamp> lines = Iterators.mergeSorted(logLineIterators, Comparator.comparingDouble(LineWithTimestamp::timestamp)); + PriorityQueue<LineWithTimestamp> heap = new PriorityQueue<>(Comparator.comparingDouble(LineWithTimestamp::timestamp)); while (lines.hasNext()) { + heap.offer(lines.next()); + if (heap.size() > 1000) { + if (linesWritten++ >= maxLines) return; + writer.write(heap.poll().line); + writer.newLine(); + } + } + while ( ! heap.isEmpty()) { if (linesWritten++ >= maxLines) return; - String line = lines.next().line(); - writer.write(line); + writer.write(heap.poll().line); writer.newLine(); } } @@ -170,7 +179,7 @@ class LogReader { if (parts.length != 7) continue; - if (hostname.map(host -> !host.equals(parts[1])).orElse(false)) + if (hostname.map(host -> ! host.equals(parts[1])).orElse(false)) continue; double timestamp = Double.parseDouble(parts[0]); diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/state/StateHandler.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/StateHandler.java index cfd2244bd70..25fe775082d 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/state/StateHandler.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/StateHandler.java @@ -102,22 +102,14 @@ public class StateHandler extends AbstractRequestHandler { private ByteBuffer buildContent(URI requestUri) { String suffix = resolvePath(requestUri); - switch (suffix) { - case "": - return ByteBuffer.wrap(apiLinks(requestUri)); - case CONFIG_GENERATION_PATH: - return ByteBuffer.wrap(config); - case HISTOGRAMS_PATH: - return ByteBuffer.wrap(buildHistogramsOutput()); - case HEALTH_PATH: - case METRICS_PATH: - return ByteBuffer.wrap(buildMetricOutput(suffix)); - case VERSION_PATH: - return ByteBuffer.wrap(buildVersionOutput()); - default: - // XXX should possibly do something else here - return ByteBuffer.wrap(buildMetricOutput(suffix)); - } + return switch (suffix) { + case "" -> ByteBuffer.wrap(apiLinks(requestUri)); + case CONFIG_GENERATION_PATH -> ByteBuffer.wrap(config); + case HISTOGRAMS_PATH -> ByteBuffer.wrap(buildHistogramsOutput()); + case HEALTH_PATH, METRICS_PATH -> ByteBuffer.wrap(buildMetricOutput(suffix)); + case VERSION_PATH -> ByteBuffer.wrap(buildVersionOutput()); + default -> ByteBuffer.wrap(buildMetricOutput(suffix)); // XXX should possibly do something else here + }; } private byte[] apiLinks(URI requestUri) { @@ -228,13 +220,11 @@ public class StateHandler extends AbstractRequestHandler { for (Tuple tuple : collapseMetrics(metricSnapshot, consumer)) { ObjectNode jsonTuple = jsonMapper.createObjectNode(); jsonTuple.put("name", tuple.key); - if (tuple.val instanceof CountMetric) { - CountMetric count = (CountMetric)tuple.val; + if (tuple.val instanceof CountMetric count) { jsonTuple.set("values", jsonMapper.createObjectNode() .put("count", count.getCount()) .put("rate", sanitizeDouble(count.getCount() * 1000.0) / periodInMillis)); - } else if (tuple.val instanceof GaugeMetric) { - GaugeMetric gauge = (GaugeMetric) tuple.val; + } else if (tuple.val instanceof GaugeMetric gauge) { ObjectNode valueFields = jsonMapper.createObjectNode(); valueFields.put("average", sanitizeDouble(gauge.getAverage())) .put("sum", sanitizeDouble(gauge.getSum())) @@ -274,15 +264,11 @@ public class StateHandler extends AbstractRequestHandler { } private static List<Tuple> collapseMetrics(MetricSnapshot snapshot, String consumer) { - switch (consumer) { - case HEALTH_PATH: - return collapseHealthMetrics(snapshot); - case "all": // deprecated name - case METRICS_PATH: - return flattenAllMetrics(snapshot); - default: - throw new IllegalArgumentException("Unknown consumer '" + consumer + "'."); - } + return switch (consumer) { + case HEALTH_PATH -> collapseHealthMetrics(snapshot); + case "all", METRICS_PATH -> flattenAllMetrics(snapshot); // TODO: Remove "all" on Vespa 9 + default -> throw new IllegalArgumentException("Unknown consumer '" + consumer + "'."); + }; } private static List<Tuple> collapseHealthMetrics(MetricSnapshot snapshot) { @@ -291,8 +277,7 @@ public class StateHandler extends AbstractRequestHandler { for (Map.Entry<MetricDimensions, MetricSet> entry : snapshot) { MetricSet metricSet = entry.getValue(); MetricValue val = metricSet.get("serverTotalSuccessfulResponseLatency"); - if (val instanceof GaugeMetric) { - GaugeMetric gauge = (GaugeMetric)val; + if (val instanceof GaugeMetric gauge) { latencySeconds.add(GaugeMetric.newInstance(gauge.getLast() / 1000, gauge.getMax() / 1000, gauge.getMin() / 1000, diff --git a/container-core/src/main/java/com/yahoo/container/logging/AccessLogEntry.java b/container-core/src/main/java/com/yahoo/container/logging/AccessLogEntry.java index c469c90f6ab..2639239d23f 100644 --- a/container-core/src/main/java/com/yahoo/container/logging/AccessLogEntry.java +++ b/container-core/src/main/java/com/yahoo/container/logging/AccessLogEntry.java @@ -65,16 +65,14 @@ public class AccessLogEntry { return null; } - final Map<String, List<String>> newMapWithImmutableValues = mapValues( + Map<String, List<String>> newMapWithImmutableValues = mapValues( keyValues.entrySet(), valueList -> Collections.unmodifiableList(new ArrayList<>(valueList))); return Collections.unmodifiableMap(newMapWithImmutableValues); } } - private static <K, V1, V2> Map<K, V2> mapValues( - final Set<Map.Entry<K, V1>> entrySet, - final Function<V1, V2> valueConverter) { + private static <K, V1, V2> Map<K, V2> mapValues(Set<Map.Entry<K, V1>> entrySet, Function<V1, V2> valueConverter) { return entrySet.stream() .collect(toMap( entry -> entry.getKey(), diff --git a/container-core/src/main/java/com/yahoo/container/logging/RequestLogEntry.java b/container-core/src/main/java/com/yahoo/container/logging/RequestLogEntry.java index 23804613f4e..b4692a43890 100644 --- a/container-core/src/main/java/com/yahoo/container/logging/RequestLogEntry.java +++ b/container-core/src/main/java/com/yahoo/container/logging/RequestLogEntry.java @@ -14,6 +14,9 @@ import java.util.Map; import java.util.Optional; import java.util.OptionalInt; import java.util.OptionalLong; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; import static java.util.Objects.requireNonNull; @@ -47,7 +50,7 @@ public class RequestLogEntry { private final Principal sslPrincipal; private final HitCounts hitCounts; private final TraceNode traceNode; - private final Map<String, Collection<String>> extraAttributes; + private final SortedMap<String, Collection<String>> extraAttributes; private RequestLogEntry(Builder builder) { this.connectionId = builder.connectionId; @@ -99,7 +102,7 @@ public class RequestLogEntry { public Optional<Principal> sslPrincipal() { return Optional.ofNullable(sslPrincipal); } public Optional<HitCounts> hitCounts() { return Optional.ofNullable(hitCounts); } public Optional<TraceNode> traceNode() { return Optional.ofNullable(traceNode); } - public Collection<String> extraAttributeKeys() { return Collections.unmodifiableCollection(extraAttributes.keySet()); } + public SortedSet<String> extraAttributeKeys() { return Collections.unmodifiableSortedSet((SortedSet<String>)extraAttributes.keySet()); } public Collection<String> extraAttributeValues(String key) { return Collections.unmodifiableCollection(extraAttributes.get(key)); } private static OptionalInt optionalInt(int value) { @@ -112,8 +115,8 @@ public class RequestLogEntry { return OptionalLong.of(value); } - private static Map<String, Collection<String>> copyExtraAttributes(Map<String, Collection<String>> extraAttributes) { - Map<String, Collection<String>> copy = new HashMap<>(); + private static SortedMap<String, Collection<String>> copyExtraAttributes(Map<String, Collection<String>> extraAttributes) { + SortedMap<String, Collection<String>> copy = new TreeMap<>(); extraAttributes.forEach((key, value) -> copy.put(key, new ArrayList<>(value))); return copy; } |