perf: Reuse a single JsonProvider.
This speeds up the formatter significantly.
Before:
Benchmark Mode Cnt Score Error Units
FormatterBenchmark.massivelyStructuredLogRecord thrpt 10 6552.727 ± 2169.572 ops/s
FormatterBenchmark.simpleLogRecord thrpt 10 8126.699 ± 2259.912 ops/s
FormatterBenchmark.structuredLogRecord thrpt 10 5594.849 ± 1129.151 ops/s
After:
Benchmark Mode Cnt Score Error Units
FormatterBenchmark.massivelyStructuredLogRecord thrpt 10 137879.001 ± 30467.644 ops/s
FormatterBenchmark.simpleLogRecord thrpt 10 896085.217 ± 249890.421 ops/s
FormatterBenchmark.structuredLogRecord thrpt 10 553428.807 ± 194787.754 ops/s
Change-Id: If184327a4ff0de0d92b769493dbf6270ba3a8c8e
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
index 5655373..8517bde 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
@@ -5,9 +5,9 @@
package eu.mulk.quarkus.googlecloud.jsonlogging;
import io.smallrye.common.constraint.Nullable;
-import jakarta.json.Json;
import jakarta.json.JsonObject;
import jakarta.json.JsonObjectBuilder;
+import jakarta.json.spi.JsonProvider;
import java.time.Instant;
import java.util.List;
import java.util.Map;
@@ -74,8 +74,8 @@
this.function = function;
}
- JsonObject json() {
- var b = Json.createObjectBuilder();
+ JsonObject json(JsonProvider json) {
+ var b = json.createObjectBuilder();
if (file != null) {
b.add("file", file);
@@ -107,13 +107,13 @@
this(t.getEpochSecond(), t.getNano());
}
- JsonObject json() {
- return Json.createObjectBuilder().add("seconds", seconds).add("nanos", nanos).build();
+ JsonObject json(JsonProvider json) {
+ return json.createObjectBuilder().add("seconds", seconds).add("nanos", nanos).build();
}
}
- JsonObjectBuilder json() {
- var b = Json.createObjectBuilder();
+ JsonObjectBuilder json(JsonProvider json) {
+ var b = json.createObjectBuilder();
if (trace != null) {
b.add("logging.googleapis.com/trace", trace);
@@ -128,7 +128,7 @@
}
if (!labels.isEmpty()) {
- b.add("logging.googleapis.com/labels", jsonOfStringMap(labels));
+ b.add("logging.googleapis.com/labels", jsonOfStringMap(json, labels));
}
if (type != null) {
@@ -137,24 +137,25 @@
return b.add("message", message)
.add("severity", severity)
- .add("timestamp", timestamp.json())
- .add("logging.googleapis.com/sourceLocation", sourceLocation.json())
- .addAll(jsonOfStringMap(mappedDiagnosticContext))
- .addAll(jsonOfParameterMap(parameters));
+ .add("timestamp", timestamp.json(json))
+ .add("logging.googleapis.com/sourceLocation", sourceLocation.json(json))
+ .addAll(jsonOfStringMap(json, mappedDiagnosticContext))
+ .addAll(jsonOfParameterMap(json, parameters));
}
- private static JsonObjectBuilder jsonOfStringMap(Map<String, String> stringMap) {
+ private JsonObjectBuilder jsonOfStringMap(JsonProvider json, Map<String, String> stringMap) {
return stringMap.entrySet().stream()
.reduce(
- Json.createObjectBuilder(),
+ json.createObjectBuilder(),
(acc, x) -> acc.add(x.getKey(), x.getValue()),
JsonObjectBuilder::addAll);
}
- private static JsonObjectBuilder jsonOfParameterMap(List<StructuredParameter> parameters) {
+ private JsonObjectBuilder jsonOfParameterMap(
+ JsonProvider json, List<StructuredParameter> parameters) {
return parameters.stream()
.reduce(
- Json.createObjectBuilder(),
+ json.createObjectBuilder(),
(acc, p) -> acc.addAll(p.json()),
JsonObjectBuilder::addAll);
}