From 58e2a7fc08676d784b226f988c6a7e5af71345d1 Mon Sep 17 00:00:00 2001 From: johnny Date: Thu, 23 Dec 2021 15:43:55 +0800 Subject: [PATCH] add format for google cloud platform --- .../io/quarkiverse/loggingjson/Config.java | 68 ++++++++++++++++++- .../loggingjson/LoggingJsonRecorder.java | 16 +++++ .../gcp/GcpEpochSecondJsonProvider.java | 39 +++++++++++ .../gcp/GcpLogLevelJsonProvider.java | 50 ++++++++++++++ .../GcpMessageWithExceptionJsonProvider.java | 40 +++++++++++ .../providers/gcp/GcpNanoJsonProvider.java | 39 +++++++++++ .../providers/gcp/GcpSpanIdJsonProvider.java | 39 +++++++++++ .../providers/gcp/GcpTraceIdJsonProvider.java | 54 +++++++++++++++ .../GcpEpochSecondJsonProviderTest.java | 32 +++++++++ .../GcpLogLevelJsonProviderTest.java | 31 +++++++++ ...pMessageWithExceptionJsonProviderTest.java | 37 ++++++++++ .../providers/GcpNanoJsonProviderTest.java | 32 +++++++++ .../providers/GcpSpanIdJsonProviderTest.java | 37 ++++++++++ .../providers/GcpTraceIdJsonProviderTest.java | 38 +++++++++++ ...GcpEpochSecondJsonProviderJacksonTest.java | 11 +++ .../GcpLogLevelJsonProviderJacksonTest.java | 11 +++ ...eWithExceptionJsonProviderJacksonTest.java | 11 +++ .../GcpNanoJsonProviderJacksonTest.java | 10 +++ .../GcpSpanIdJsonProviderJacksonTest.java | 11 +++ .../GcpTraceIdJsonProviderJacksonTest.java | 11 +++ 20 files changed, 616 insertions(+), 1 deletion(-) create mode 100644 runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpEpochSecondJsonProvider.java create mode 100644 runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpLogLevelJsonProvider.java create mode 100644 runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpMessageWithExceptionJsonProvider.java create mode 100644 runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpNanoJsonProvider.java create mode 100644 runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpSpanIdJsonProvider.java create mode 100644 runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpTraceIdJsonProvider.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpEpochSecondJsonProviderTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpLogLevelJsonProviderTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpMessageWithExceptionJsonProviderTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpNanoJsonProviderTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpSpanIdJsonProviderTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpTraceIdJsonProviderTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpEpochSecondJsonProviderJacksonTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpLogLevelJsonProviderJacksonTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpMessageWithExceptionJsonProviderJacksonTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpNanoJsonProviderJacksonTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpSpanIdJsonProviderJacksonTest.java create mode 100644 runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpTraceIdJsonProviderJacksonTest.java diff --git a/runtime/src/main/java/io/quarkiverse/loggingjson/Config.java b/runtime/src/main/java/io/quarkiverse/loggingjson/Config.java index ef77447..b129cbb 100644 --- a/runtime/src/main/java/io/quarkiverse/loggingjson/Config.java +++ b/runtime/src/main/java/io/quarkiverse/loggingjson/Config.java @@ -130,6 +130,28 @@ public static class FieldsConfig { */ @ConfigItem public FieldConfig errorMessage; + /** + * Options for gcpSpanId. + */ + @ConfigItem + public GcpSpanIdConfig gcpSpanId; + /** + * Options for gcpTraceId. + */ + @ConfigItem + public GcpTraceIdConfig gcpTraceId; + + /** + * Options for epochSecond. + */ + @ConfigItem + public FieldConfig epochSecond; + /** + * Options for nanoSecond. + */ + @ConfigItem + public FieldConfig nanoSecond; + } @ConfigGroup @@ -146,6 +168,49 @@ public static class FieldConfig { public Optional enabled; } + @ConfigGroup + public static class GcpSpanIdConfig { + /** + * Used to change the json key for the field. + */ + @ConfigItem + public Optional fieldName; + /** + * Enable or disable the field. + */ + @ConfigItem + public Optional enabled; + /** + * key to lookup from mdc. + */ + @ConfigItem + public Optional mdcKey; + } + + @ConfigGroup + public static class GcpTraceIdConfig { + /** + * Used to change the json key for the field. + */ + @ConfigItem + public Optional fieldName; + /** + * Enable or disable the field. + */ + @ConfigItem + public Optional enabled; + /** + * Will write the values at the top level of the JSON log object. + */ + @ConfigItem + public Optional projectId; + /** + * key to lookup from mdc. + */ + @ConfigItem + public Optional mdcKey; + } + @ConfigGroup public static class MDCConfig { /** @@ -242,6 +307,7 @@ public enum AdditionalFieldType { public enum LogFormat { DEFAULT, - ECS + ECS, + GCP } } diff --git a/runtime/src/main/java/io/quarkiverse/loggingjson/LoggingJsonRecorder.java b/runtime/src/main/java/io/quarkiverse/loggingjson/LoggingJsonRecorder.java index bc7610c..3d77f57 100644 --- a/runtime/src/main/java/io/quarkiverse/loggingjson/LoggingJsonRecorder.java +++ b/runtime/src/main/java/io/quarkiverse/loggingjson/LoggingJsonRecorder.java @@ -12,6 +12,7 @@ import io.quarkiverse.loggingjson.jackson.JacksonJsonFactory; import io.quarkiverse.loggingjson.jsonb.JsonbJsonFactory; import io.quarkiverse.loggingjson.providers.*; +import io.quarkiverse.loggingjson.providers.gcp.*; import io.quarkus.arc.Arc; import io.quarkus.arc.InjectableInstance; import io.quarkus.runtime.RuntimeValue; @@ -30,6 +31,8 @@ public RuntimeValue> initializeJsonLogging(Config config, bo if (config.logFormat == Config.LogFormat.ECS) { providers = ecsFormat(config); + } else if (config.logFormat == Config.LogFormat.GCP) { + providers = gcpFormat(config); } else { providers = defaultFormat(config); } @@ -87,6 +90,19 @@ private List defaultFormat(Config config) { return providers; } + private List gcpFormat(Config config) { + List providers = new ArrayList<>(); + providers.add(new GcpEpochSecondJsonProvider(config.fields.epochSecond)); + providers.add(new GcpNanoJsonProvider(config.fields.nanoSecond)); + providers.add(new LoggerNameJsonProvider(config.fields.loggerName, "logger")); + providers.add(new GcpLogLevelJsonProvider(config.fields.level)); + providers.add(new ThreadNameJsonProvider(config.fields.threadName, "thread")); + providers.add(new GcpMessageWithExceptionJsonProvider(config.fields.message)); + providers.add(new GcpSpanIdJsonProvider(config.fields.gcpSpanId)); + providers.add(new GcpTraceIdJsonProvider(config.fields.gcpTraceId)); + return providers; + } + private List ecsFormat(Config config) { List providers = new ArrayList<>(); providers.add(new TimestampJsonProvider(config.fields.timestamp, "@timestamp")); diff --git a/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpEpochSecondJsonProvider.java b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpEpochSecondJsonProvider.java new file mode 100644 index 0000000..3360cf6 --- /dev/null +++ b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpEpochSecondJsonProvider.java @@ -0,0 +1,39 @@ +package io.quarkiverse.loggingjson.providers.gcp; + +import java.io.IOException; +import java.time.Instant; + +import org.jboss.logmanager.ExtLogRecord; + +import io.quarkiverse.loggingjson.*; + +public class GcpEpochSecondJsonProvider implements JsonProvider, Enabled { + + private final Config.FieldConfig config; + private final String fieldName; + + /** + * The JSON field name for the seconds of the timestamp. + */ + public static final String TIMESTAMP_SECONDS_ATTRIBUTE = "timestampSeconds"; + + public GcpEpochSecondJsonProvider(Config.FieldConfig config) { + this(config, TIMESTAMP_SECONDS_ATTRIBUTE); + } + + public GcpEpochSecondJsonProvider(Config.FieldConfig config, String defaultName) { + this.config = config; + this.fieldName = config.fieldName.orElse(defaultName); + } + + @Override + public boolean isEnabled() { + return config.enabled.orElse(true); + } + + @Override + public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException { + Instant time = Instant.ofEpochMilli(event.getMillis()); + JsonWritingUtils.writeNumberField(generator, fieldName, time.getEpochSecond()); + } +} diff --git a/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpLogLevelJsonProvider.java b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpLogLevelJsonProvider.java new file mode 100644 index 0000000..1616aae --- /dev/null +++ b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpLogLevelJsonProvider.java @@ -0,0 +1,50 @@ +package io.quarkiverse.loggingjson.providers.gcp; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.jboss.logmanager.ExtLogRecord; +import org.jboss.logmanager.Level; + +import io.quarkiverse.loggingjson.*; + +public class GcpLogLevelJsonProvider implements JsonProvider, Enabled { + /** + * The JSON field name for the log level (severity). + */ + public static final String SEVERITY_ATTRIBUTE = "severity"; + private static final Map logbackToSeverityMap; + private final String fieldName; + + static { + logbackToSeverityMap = new HashMap<>(); + logbackToSeverityMap.put(Level.TRACE, "DEBUG"); + logbackToSeverityMap.put(Level.DEBUG, "DEBUG"); + logbackToSeverityMap.put(Level.INFO, "INFO"); + logbackToSeverityMap.put(Level.WARN, "WARNING"); + logbackToSeverityMap.put(Level.ERROR, "ERROR"); + } + + private final Config.FieldConfig config; + + public GcpLogLevelJsonProvider(Config.FieldConfig config) { + this(config, SEVERITY_ATTRIBUTE); + } + + public GcpLogLevelJsonProvider(Config.FieldConfig config, String defaultName) { + this.config = config; + this.fieldName = config.fieldName.orElse(defaultName); + } + + @Override + public boolean isEnabled() { + return config.enabled.orElse(true); + } + + @Override + public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException { + JsonWritingUtils.writeStringField(generator, fieldName, + logbackToSeverityMap.getOrDefault(event.getLevel(), "DEFAULT")); + } +} diff --git a/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpMessageWithExceptionJsonProvider.java b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpMessageWithExceptionJsonProvider.java new file mode 100644 index 0000000..f786519 --- /dev/null +++ b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpMessageWithExceptionJsonProvider.java @@ -0,0 +1,40 @@ +package io.quarkiverse.loggingjson.providers.gcp; + +import java.io.IOException; +import java.io.PrintWriter; + +import org.jboss.logmanager.ExtFormatter; +import org.jboss.logmanager.ExtLogRecord; + +import io.quarkiverse.loggingjson.*; + +public class GcpMessageWithExceptionJsonProvider extends ExtFormatter implements JsonProvider, Enabled { + private final String fieldName; + private final Config.FieldConfig config; + + public GcpMessageWithExceptionJsonProvider(Config.FieldConfig config) { + this.config = config; + this.fieldName = config.fieldName.orElse("message"); + } + + @Override + public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException { + StringBuilderWriter message = new StringBuilderWriter(); + message.write(formatMessage(event)); + if (event.getThrown() != null) { + message.write("\n"); + event.getThrown().printStackTrace(new PrintWriter(message)); + } + JsonWritingUtils.writeStringField(generator, fieldName, message.toString()); + } + + @Override + public String format(ExtLogRecord record) { + return null; + } + + @Override + public boolean isEnabled() { + return config.enabled.orElse(true); + } +} diff --git a/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpNanoJsonProvider.java b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpNanoJsonProvider.java new file mode 100644 index 0000000..860031f --- /dev/null +++ b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpNanoJsonProvider.java @@ -0,0 +1,39 @@ +package io.quarkiverse.loggingjson.providers.gcp; + +import java.io.IOException; +import java.time.Instant; + +import org.jboss.logmanager.ExtLogRecord; + +import io.quarkiverse.loggingjson.*; + +public class GcpNanoJsonProvider implements JsonProvider, Enabled { + + private final Config.FieldConfig config; + + /** + * The JSON field name for the seconds of the timestamp. + */ + public static final String TIMESTAMP_NANOS_ATTRIBUTE = "timestampNanos"; + private final String fieldName; + + public GcpNanoJsonProvider(Config.FieldConfig config) { + this(config, TIMESTAMP_NANOS_ATTRIBUTE); + } + + public GcpNanoJsonProvider(Config.FieldConfig config, String defaultName) { + this.config = config; + this.fieldName = config.fieldName.orElse(defaultName); + } + + @Override + public boolean isEnabled() { + return config.enabled.orElse(true); + } + + @Override + public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException { + Instant time = Instant.ofEpochMilli(event.getMillis()); + JsonWritingUtils.writeNumberField(generator, fieldName, time.getNano()); + } +} diff --git a/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpSpanIdJsonProvider.java b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpSpanIdJsonProvider.java new file mode 100644 index 0000000..82bd0d9 --- /dev/null +++ b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpSpanIdJsonProvider.java @@ -0,0 +1,39 @@ +package io.quarkiverse.loggingjson.providers.gcp; + +import java.io.IOException; + +import org.jboss.logmanager.ExtLogRecord; + +import io.quarkiverse.loggingjson.*; + +public class GcpSpanIdJsonProvider implements JsonProvider, Enabled { + public static final String SPAN_ID_ATTRIBUTE = "logging.googleapis.com/spanId"; + private final Config.GcpSpanIdConfig config; + private final String fieldName; + private final String mdcKey; + + public GcpSpanIdJsonProvider(Config.GcpSpanIdConfig config) { + this(config, SPAN_ID_ATTRIBUTE, "x-b3-spanid"); + } + + public GcpSpanIdJsonProvider(Config.GcpSpanIdConfig config, String defaultName, String defaultMdcKey) { + this.config = config; + this.fieldName = config.fieldName.orElse(defaultName); + this.mdcKey = config.mdcKey.orElse(defaultMdcKey); + } + + @Override + public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException { + + String spanId = event.getMdc(mdcKey); + if (spanId != null) { + JsonWritingUtils.writeStringField(generator, fieldName, spanId); + } + } + + @Override + public boolean isEnabled() { + return config.enabled.orElse(true); + } + +} diff --git a/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpTraceIdJsonProvider.java b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpTraceIdJsonProvider.java new file mode 100644 index 0000000..8f491ca --- /dev/null +++ b/runtime/src/main/java/io/quarkiverse/loggingjson/providers/gcp/GcpTraceIdJsonProvider.java @@ -0,0 +1,54 @@ +package io.quarkiverse.loggingjson.providers.gcp; + +import java.io.IOException; + +import org.jboss.logmanager.ExtLogRecord; + +import io.quarkiverse.loggingjson.*; + +public class GcpTraceIdJsonProvider implements JsonProvider, Enabled { + public static final String TRACE_ID_ATTRIBUTE = "logging.googleapis.com/trace"; + private final Config.GcpTraceIdConfig config; + private final String projectId; + private final String mdcKey; + private final String fieldName; + + public GcpTraceIdJsonProvider(Config.GcpTraceIdConfig config) { + this(config, TRACE_ID_ATTRIBUTE, "default", "x-b3-traceid"); + } + + public GcpTraceIdJsonProvider(Config.GcpTraceIdConfig config, String defaultName, String defaultProjectId, + String defaultMdcKey) { + this.config = config; + this.fieldName = config.fieldName.orElse(defaultName); + this.mdcKey = config.mdcKey.orElse(defaultMdcKey); + this.projectId = config.projectId.orElse(defaultProjectId); + } + + protected String formatTraceId(final String traceId) { + // Trace IDs are either 64-bit or 128-bit, which is 16-digit hex, or 32-digit hex. + // If traceId is 64-bit (16-digit hex), then we need to prepend 0's to make a 32-digit hex. + if (traceId != null && traceId.length() == 16) { + return "0000000000000000" + traceId; + } + return traceId; + } + + String composeFullTraceName(String traceId) { + return "projects/" + projectId + "/traces/" + traceId; + } + + @Override + public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException { + String traceId = event.getMdc(mdcKey); + if (traceId != null) { + JsonWritingUtils.writeStringField(generator, fieldName, composeFullTraceName(formatTraceId(traceId))); + } + } + + @Override + public boolean isEnabled() { + return config.enabled.orElse(true); + } + +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpEpochSecondJsonProviderTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpEpochSecondJsonProviderTest.java new file mode 100644 index 0000000..0688601 --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpEpochSecondJsonProviderTest.java @@ -0,0 +1,32 @@ +package io.quarkiverse.loggingjson.providers; + +import java.time.Instant; +import java.util.Optional; +import java.util.logging.Level; + +import org.jboss.logmanager.ExtLogRecord; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.JsonNode; + +import io.quarkiverse.loggingjson.Config; +import io.quarkiverse.loggingjson.providers.gcp.GcpEpochSecondJsonProvider; + +public class GcpEpochSecondJsonProviderTest extends JsonProviderBaseTest { + @Override + protected Type type() { + return Type.JSONB; + } + + @Test + void testDefaultConfig() throws Exception { + final Config.FieldConfig config = new Config.FieldConfig(); + config.fieldName = Optional.empty(); + final GcpEpochSecondJsonProvider timestampJsonProvider = new GcpEpochSecondJsonProvider(config); + ExtLogRecord event = new ExtLogRecord(Level.ALL, "", ""); + final JsonNode result = getResultAsJsonNode(timestampJsonProvider, event); + long timestamp = result.findValue(GcpEpochSecondJsonProvider.TIMESTAMP_SECONDS_ATTRIBUTE).asLong(); + Assertions.assertEquals(timestamp, Instant.ofEpochMilli(event.getMillis()).getEpochSecond()); + } +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpLogLevelJsonProviderTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpLogLevelJsonProviderTest.java new file mode 100644 index 0000000..cc28d2f --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpLogLevelJsonProviderTest.java @@ -0,0 +1,31 @@ +package io.quarkiverse.loggingjson.providers; + +import java.util.Optional; +import java.util.logging.Level; + +import org.jboss.logmanager.ExtLogRecord; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.JsonNode; + +import io.quarkiverse.loggingjson.Config; +import io.quarkiverse.loggingjson.providers.gcp.GcpLogLevelJsonProvider; + +public class GcpLogLevelJsonProviderTest extends JsonProviderBaseTest { + @Override + protected Type type() { + return Type.JSONB; + } + + @Test + void testDefaultConfig() throws Exception { + final Config.FieldConfig config = new Config.FieldConfig(); + config.fieldName = Optional.empty(); + final GcpLogLevelJsonProvider provider = new GcpLogLevelJsonProvider(config); + ExtLogRecord event = new ExtLogRecord(Level.ALL, "", ""); + final JsonNode result = getResultAsJsonNode(provider, event); + String level = result.findValue(GcpLogLevelJsonProvider.SEVERITY_ATTRIBUTE).asText(); + Assertions.assertEquals(level, "DEFAULT"); + } +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpMessageWithExceptionJsonProviderTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpMessageWithExceptionJsonProviderTest.java new file mode 100644 index 0000000..56d05bf --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpMessageWithExceptionJsonProviderTest.java @@ -0,0 +1,37 @@ +package io.quarkiverse.loggingjson.providers; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Optional; +import java.util.logging.Level; + +import org.jboss.logmanager.ExtLogRecord; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.JsonNode; + +import io.quarkiverse.loggingjson.Config; +import io.quarkiverse.loggingjson.providers.gcp.GcpMessageWithExceptionJsonProvider; + +public class GcpMessageWithExceptionJsonProviderTest extends JsonProviderBaseTest { + @Override + protected Type type() { + return Type.JSONB; + } + + @Test + void testDefaultConfig() throws Exception { + final Config.FieldConfig config = new Config.FieldConfig(); + config.fieldName = Optional.empty(); + final GcpMessageWithExceptionJsonProvider provider = new GcpMessageWithExceptionJsonProvider(config); + final RuntimeException t = new RuntimeException("Testing stackTrace"); + final ExtLogRecord event = new ExtLogRecord(Level.ALL, "", ""); + event.setThrown(t); + final JsonNode result = getResultAsJsonNode(provider, event); + String message = result.findValue("message").asText(); + final StringWriter out = new StringWriter(); + t.printStackTrace(new PrintWriter(out)); + Assertions.assertTrue(message.indexOf(t.toString()) > 0); + } +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpNanoJsonProviderTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpNanoJsonProviderTest.java new file mode 100644 index 0000000..bb8af96 --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpNanoJsonProviderTest.java @@ -0,0 +1,32 @@ +package io.quarkiverse.loggingjson.providers; + +import java.time.Instant; +import java.util.Optional; +import java.util.logging.Level; + +import org.jboss.logmanager.ExtLogRecord; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.JsonNode; + +import io.quarkiverse.loggingjson.Config; +import io.quarkiverse.loggingjson.providers.gcp.GcpNanoJsonProvider; + +public class GcpNanoJsonProviderTest extends JsonProviderBaseTest { + @Override + protected Type type() { + return Type.JSONB; + } + + @Test + void testDefaultConfig() throws Exception { + final Config.FieldConfig config = new Config.FieldConfig(); + config.fieldName = Optional.empty(); + final GcpNanoJsonProvider timestampJsonProvider = new GcpNanoJsonProvider(config); + ExtLogRecord event = new ExtLogRecord(Level.ALL, "", ""); + final JsonNode result = getResultAsJsonNode(timestampJsonProvider, event); + long timestamp = result.findValue(GcpNanoJsonProvider.TIMESTAMP_NANOS_ATTRIBUTE).asLong(); + Assertions.assertEquals(timestamp, Instant.ofEpochMilli(event.getMillis()).getNano()); + } +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpSpanIdJsonProviderTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpSpanIdJsonProviderTest.java new file mode 100644 index 0000000..bbac560 --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpSpanIdJsonProviderTest.java @@ -0,0 +1,37 @@ +package io.quarkiverse.loggingjson.providers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.logging.Level; + +import org.jboss.logmanager.ExtLogRecord; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.JsonNode; + +import io.quarkiverse.loggingjson.Config; +import io.quarkiverse.loggingjson.providers.gcp.GcpSpanIdJsonProvider; + +public class GcpSpanIdJsonProviderTest extends JsonProviderBaseTest { + @Override + protected Type type() { + return Type.JSONB; + } + + @Test + void testDefaultConfig() throws Exception { + final Config.GcpSpanIdConfig config = new Config.GcpSpanIdConfig(); + config.fieldName = Optional.empty(); + config.mdcKey = Optional.empty(); + final GcpSpanIdJsonProvider provider = new GcpSpanIdJsonProvider(config); + ExtLogRecord event = new ExtLogRecord(Level.ALL, "", ""); + Map mdc = new HashMap(); + mdc.put("x-b3-spanid", "261dcf2aa53fd2b8"); + event.setMdc(mdc); + final JsonNode result = getResultAsJsonNode(provider, event); + String spanId = result.findValue(GcpSpanIdJsonProvider.SPAN_ID_ATTRIBUTE).asText(); + Assertions.assertEquals(spanId, "261dcf2aa53fd2b8"); + } +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpTraceIdJsonProviderTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpTraceIdJsonProviderTest.java new file mode 100644 index 0000000..fb576c5 --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/GcpTraceIdJsonProviderTest.java @@ -0,0 +1,38 @@ +package io.quarkiverse.loggingjson.providers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.logging.Level; + +import org.jboss.logmanager.ExtLogRecord; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.JsonNode; + +import io.quarkiverse.loggingjson.Config; +import io.quarkiverse.loggingjson.providers.gcp.GcpTraceIdJsonProvider; + +public class GcpTraceIdJsonProviderTest extends JsonProviderBaseTest { + @Override + protected Type type() { + return Type.JSONB; + } + + @Test + void testDefaultConfig() throws Exception { + final Config.GcpTraceIdConfig config = new Config.GcpTraceIdConfig(); + config.fieldName = Optional.empty(); + config.mdcKey = Optional.empty(); + config.projectId = Optional.empty(); + final GcpTraceIdJsonProvider provider = new GcpTraceIdJsonProvider(config); + ExtLogRecord event = new ExtLogRecord(Level.ALL, "", ""); + Map mdc = new HashMap(); + mdc.put("x-b3-traceid", "71c24209290d12caa3a2743bf050bdcc"); + event.setMdc(mdc); + final JsonNode result = getResultAsJsonNode(provider, event); + String traceId = result.findValue(GcpTraceIdJsonProvider.TRACE_ID_ATTRIBUTE).asText(); + Assertions.assertEquals(traceId, "projects/default/traces/71c24209290d12caa3a2743bf050bdcc"); + } +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpEpochSecondJsonProviderJacksonTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpEpochSecondJsonProviderJacksonTest.java new file mode 100644 index 0000000..4eed6ca --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpEpochSecondJsonProviderJacksonTest.java @@ -0,0 +1,11 @@ +package io.quarkiverse.loggingjson.providers.jackson; + +import io.quarkiverse.loggingjson.providers.GcpEpochSecondJsonProviderTest; + +public class GcpEpochSecondJsonProviderJacksonTest extends GcpEpochSecondJsonProviderTest { + @Override + protected Type type() { + return Type.JACKSON; + } + +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpLogLevelJsonProviderJacksonTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpLogLevelJsonProviderJacksonTest.java new file mode 100644 index 0000000..58e58d1 --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpLogLevelJsonProviderJacksonTest.java @@ -0,0 +1,11 @@ +package io.quarkiverse.loggingjson.providers.jackson; + +import io.quarkiverse.loggingjson.providers.GcpLogLevelJsonProviderTest; + +public class GcpLogLevelJsonProviderJacksonTest extends GcpLogLevelJsonProviderTest { + @Override + protected Type type() { + return Type.JACKSON; + } + +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpMessageWithExceptionJsonProviderJacksonTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpMessageWithExceptionJsonProviderJacksonTest.java new file mode 100644 index 0000000..fd0efda --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpMessageWithExceptionJsonProviderJacksonTest.java @@ -0,0 +1,11 @@ +package io.quarkiverse.loggingjson.providers.jackson; + +import io.quarkiverse.loggingjson.providers.GcpMessageWithExceptionJsonProviderTest; + +public class GcpMessageWithExceptionJsonProviderJacksonTest extends GcpMessageWithExceptionJsonProviderTest { + @Override + protected Type type() { + return Type.JACKSON; + } + +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpNanoJsonProviderJacksonTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpNanoJsonProviderJacksonTest.java new file mode 100644 index 0000000..33865ee --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpNanoJsonProviderJacksonTest.java @@ -0,0 +1,10 @@ +package io.quarkiverse.loggingjson.providers.jackson; + +import io.quarkiverse.loggingjson.providers.GcpNanoJsonProviderTest; + +public class GcpNanoJsonProviderJacksonTest extends GcpNanoJsonProviderTest { + @Override + protected Type type() { + return Type.JACKSON; + } +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpSpanIdJsonProviderJacksonTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpSpanIdJsonProviderJacksonTest.java new file mode 100644 index 0000000..4ef19e1 --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpSpanIdJsonProviderJacksonTest.java @@ -0,0 +1,11 @@ +package io.quarkiverse.loggingjson.providers.jackson; + +import io.quarkiverse.loggingjson.providers.GcpSpanIdJsonProviderTest; + +public class GcpSpanIdJsonProviderJacksonTest extends GcpSpanIdJsonProviderTest { + @Override + protected Type type() { + return Type.JACKSON; + } + +} diff --git a/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpTraceIdJsonProviderJacksonTest.java b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpTraceIdJsonProviderJacksonTest.java new file mode 100644 index 0000000..6f53762 --- /dev/null +++ b/runtime/src/test/java/io/quarkiverse/loggingjson/providers/jackson/GcpTraceIdJsonProviderJacksonTest.java @@ -0,0 +1,11 @@ +package io.quarkiverse.loggingjson.providers.jackson; + +import io.quarkiverse.loggingjson.providers.GcpTraceIdJsonProviderTest; + +public class GcpTraceIdJsonProviderJacksonTest extends GcpTraceIdJsonProviderTest { + @Override + protected Type type() { + return Type.JACKSON; + } + +}