aboutsummaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/container
diff options
context:
space:
mode:
Diffstat (limited to 'container-core/src/main/java/com/yahoo/container')
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/LogReader.java17
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/state/StateHandler.java47
-rw-r--r--container-core/src/main/java/com/yahoo/container/logging/AccessLogEntry.java6
-rw-r--r--container-core/src/main/java/com/yahoo/container/logging/RequestLogEntry.java11
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;
}