diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java index 0c00cca908e..67f32a6ab63 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporter.java @@ -29,7 +29,10 @@ public final class OtlpJsonLoggingLogRecordExporter implements LogRecordExporter /** Returns a new {@link OtlpJsonLoggingLogRecordExporter}. */ public static LogRecordExporter create() { OtlpStdoutLogRecordExporter delegate = - new OtlpStdoutLogRecordExporterBuilder(logger).setWrapperJsonObject(false).build(); + new OtlpStdoutLogRecordExporterBuilder(logger) + .setWrapperJsonObject(false) + .setPrettyPrint(true) + .build(); return new OtlpJsonLoggingLogRecordExporter(delegate); } diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java index b42ef4acab7..688c48a8abc 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporter.java @@ -42,7 +42,10 @@ public static MetricExporter create() { */ public static MetricExporter create(AggregationTemporality aggregationTemporality) { OtlpStdoutMetricExporter delegate = - new OtlpStdoutMetricExporterBuilder(logger).setWrapperJsonObject(false).build(); + new OtlpStdoutMetricExporterBuilder(logger) + .setWrapperJsonObject(false) + .setPrettyPrint(true) + .build(); return new OtlpJsonLoggingMetricExporter(delegate, aggregationTemporality); } diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java index 63901351326..247f4c70967 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporter.java @@ -27,7 +27,10 @@ public final class OtlpJsonLoggingSpanExporter implements SpanExporter { /** Returns a new {@link OtlpJsonLoggingSpanExporter}. */ public static SpanExporter create() { OtlpStdoutSpanExporter delegate = - new OtlpStdoutSpanExporterBuilder(logger).setWrapperJsonObject(false).build(); + new OtlpStdoutSpanExporterBuilder(logger) + .setWrapperJsonObject(false) + .setPrettyPrint(true) + .build(); return new OtlpJsonLoggingSpanExporter(delegate); } diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/logs/OtlpStdoutLogRecordExporterBuilder.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/logs/OtlpStdoutLogRecordExporterBuilder.java index 76e6adb20ad..eab4c747e16 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/logs/OtlpStdoutLogRecordExporterBuilder.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/logs/OtlpStdoutLogRecordExporterBuilder.java @@ -14,6 +14,7 @@ import io.opentelemetry.sdk.common.export.MemoryMode; import java.io.OutputStream; import java.util.logging.Logger; +import javax.annotation.Nullable; /** * Builder for {@link OtlpJsonLoggingLogRecordExporter}. @@ -26,13 +27,14 @@ public final class OtlpStdoutLogRecordExporterBuilder { private static final String TYPE = "log records"; private final Logger logger; - private JsonWriter jsonWriter; + @Nullable private OutputStream outputStream; + @Nullable private Logger outputLogger; private boolean wrapperJsonObject = true; private MemoryMode memoryMode = MemoryMode.IMMUTABLE_DATA; + private boolean prettyPrint; public OtlpStdoutLogRecordExporterBuilder(Logger logger) { this.logger = logger; - this.jsonWriter = new LoggerJsonWriter(logger, TYPE); } /** @@ -57,6 +59,12 @@ public OtlpStdoutLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) { return this; } + /** Sets the exporter to use pretty-printed JSON output. */ + public OtlpStdoutLogRecordExporterBuilder setPrettyPrint(boolean prettyPrint) { + this.prettyPrint = prettyPrint; + return this; + } + /** * Sets the exporter to use the specified output stream. * @@ -67,14 +75,16 @@ public OtlpStdoutLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) { */ public OtlpStdoutLogRecordExporterBuilder setOutput(OutputStream outputStream) { requireNonNull(outputStream, "outputStream"); - this.jsonWriter = new StreamJsonWriter(outputStream, TYPE); + this.outputStream = outputStream; + this.outputLogger = null; return this; } /** Sets the exporter to use the specified logger. */ public OtlpStdoutLogRecordExporterBuilder setOutput(Logger logger) { requireNonNull(logger, "logger"); - this.jsonWriter = new LoggerJsonWriter(logger, TYPE); + this.outputLogger = logger; + this.outputStream = null; return this; } @@ -88,6 +98,13 @@ public OtlpStdoutLogRecordExporter build() { throw new IllegalArgumentException( "Reusable data mode is not supported without wrapperJsonObject"); } + JsonWriter jsonWriter; + if (outputStream != null) { + jsonWriter = new StreamJsonWriter(outputStream, TYPE, prettyPrint); + } else { + Logger writerLogger = outputLogger != null ? outputLogger : this.logger; + jsonWriter = new LoggerJsonWriter(writerLogger, TYPE, prettyPrint); + } return new OtlpStdoutLogRecordExporter(logger, jsonWriter, wrapperJsonObject, memoryMode); } } diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/metrics/OtlpStdoutMetricExporterBuilder.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/metrics/OtlpStdoutMetricExporterBuilder.java index 945ffd778bd..963616a9c1f 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/metrics/OtlpStdoutMetricExporterBuilder.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/metrics/OtlpStdoutMetricExporterBuilder.java @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.io.OutputStream; import java.util.logging.Logger; +import javax.annotation.Nullable; /** * Builder for {@link OtlpJsonLoggingMetricExporter}. @@ -39,13 +40,14 @@ public final class OtlpStdoutMetricExporterBuilder { DefaultAggregationSelector.getDefault(); private final Logger logger; - private JsonWriter jsonWriter; + @Nullable private OutputStream outputStream; + @Nullable private Logger outputLogger; private boolean wrapperJsonObject = true; private MemoryMode memoryMode = MemoryMode.IMMUTABLE_DATA; + private boolean prettyPrint; public OtlpStdoutMetricExporterBuilder(Logger logger) { this.logger = logger; - this.jsonWriter = new LoggerJsonWriter(logger, TYPE); } /** @@ -70,6 +72,12 @@ public OtlpStdoutMetricExporterBuilder setMemoryMode(MemoryMode memoryMode) { return this; } + /** Sets the exporter to use pretty-printed JSON output. */ + public OtlpStdoutMetricExporterBuilder setPrettyPrint(boolean prettyPrint) { + this.prettyPrint = prettyPrint; + return this; + } + /** * Sets the exporter to use the specified output stream. * @@ -80,14 +88,16 @@ public OtlpStdoutMetricExporterBuilder setMemoryMode(MemoryMode memoryMode) { */ public OtlpStdoutMetricExporterBuilder setOutput(OutputStream outputStream) { requireNonNull(outputStream, "outputStream"); - this.jsonWriter = new StreamJsonWriter(outputStream, TYPE); + this.outputStream = outputStream; + this.outputLogger = null; return this; } /** Sets the exporter to use the specified logger. */ public OtlpStdoutMetricExporterBuilder setOutput(Logger logger) { requireNonNull(logger, "logger"); - this.jsonWriter = new LoggerJsonWriter(logger, TYPE); + this.outputLogger = logger; + this.outputStream = null; return this; } @@ -131,6 +141,13 @@ public OtlpStdoutMetricExporter build() { throw new IllegalArgumentException( "Reusable data mode is not supported without wrapperJsonObject"); } + JsonWriter jsonWriter; + if (outputStream != null) { + jsonWriter = new StreamJsonWriter(outputStream, TYPE, prettyPrint); + } else { + Logger writerLogger = outputLogger != null ? outputLogger : this.logger; + jsonWriter = new LoggerJsonWriter(writerLogger, TYPE, prettyPrint); + } return new OtlpStdoutMetricExporter( logger, jsonWriter, diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/traces/OtlpStdoutSpanExporterBuilder.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/traces/OtlpStdoutSpanExporterBuilder.java index 341f63c6e49..e3717375700 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/traces/OtlpStdoutSpanExporterBuilder.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/traces/OtlpStdoutSpanExporterBuilder.java @@ -14,6 +14,7 @@ import io.opentelemetry.sdk.common.export.MemoryMode; import java.io.OutputStream; import java.util.logging.Logger; +import javax.annotation.Nullable; /** * Builder for {@link OtlpJsonLoggingSpanExporter}. @@ -26,13 +27,14 @@ public final class OtlpStdoutSpanExporterBuilder { private static final String TYPE = "spans"; private final Logger logger; - private JsonWriter jsonWriter; + @Nullable private OutputStream outputStream; + @Nullable private Logger outputLogger; private boolean wrapperJsonObject = true; private MemoryMode memoryMode = MemoryMode.IMMUTABLE_DATA; + private boolean prettyPrint; public OtlpStdoutSpanExporterBuilder(Logger logger) { this.logger = logger; - this.jsonWriter = new LoggerJsonWriter(logger, TYPE); } /** @@ -57,6 +59,12 @@ public OtlpStdoutSpanExporterBuilder setMemoryMode(MemoryMode memoryMode) { return this; } + /** Sets the exporter to use pretty-printed JSON output. */ + public OtlpStdoutSpanExporterBuilder setPrettyPrint(boolean prettyPrint) { + this.prettyPrint = prettyPrint; + return this; + } + /** * Sets the exporter to use the specified output stream. * @@ -67,14 +75,16 @@ public OtlpStdoutSpanExporterBuilder setMemoryMode(MemoryMode memoryMode) { */ public OtlpStdoutSpanExporterBuilder setOutput(OutputStream outputStream) { requireNonNull(outputStream, "outputStream"); - this.jsonWriter = new StreamJsonWriter(outputStream, TYPE); + this.outputStream = outputStream; + this.outputLogger = null; return this; } /** Sets the exporter to use the specified logger. */ public OtlpStdoutSpanExporterBuilder setOutput(Logger logger) { requireNonNull(logger, "logger"); - this.jsonWriter = new LoggerJsonWriter(logger, TYPE); + this.outputLogger = logger; + this.outputStream = null; return this; } @@ -88,6 +98,13 @@ public OtlpStdoutSpanExporter build() { throw new IllegalArgumentException( "Reusable data mode is not supported without wrapperJsonObject"); } + JsonWriter jsonWriter; + if (outputStream != null) { + jsonWriter = new StreamJsonWriter(outputStream, TYPE, prettyPrint); + } else { + Logger writerLogger = outputLogger != null ? outputLogger : this.logger; + jsonWriter = new LoggerJsonWriter(writerLogger, TYPE, prettyPrint); + } return new OtlpStdoutSpanExporter(logger, jsonWriter, wrapperJsonObject, memoryMode); } } diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/writer/LoggerJsonWriter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/writer/LoggerJsonWriter.java index a95c5e0d2c1..0c1dbcc7732 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/writer/LoggerJsonWriter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/writer/LoggerJsonWriter.java @@ -23,16 +23,25 @@ public class LoggerJsonWriter implements JsonWriter { private final Logger logger; private final String type; + private final boolean prettyPrint; public LoggerJsonWriter(Logger logger, String type) { + this(logger, type, /* prettyPrint= */ false); + } + + public LoggerJsonWriter(Logger logger, String type, boolean prettyPrint) { this.logger = logger; this.type = type; + this.prettyPrint = prettyPrint; } @Override public CompletableResultCode write(Marshaler exportRequest) { SegmentedStringWriter sw = new SegmentedStringWriter(JSON_FACTORY._getBufferRecycler()); try (JsonGenerator gen = JsonUtil.create(sw)) { + if (prettyPrint) { + gen.useDefaultPrettyPrinter(); + } exportRequest.writeJsonToGenerator(gen); } catch (IOException e) { logger.log(Level.WARNING, "Unable to write OTLP JSON " + type, e); diff --git a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/writer/StreamJsonWriter.java b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/writer/StreamJsonWriter.java index 6c45ee0d696..9e941a6c501 100644 --- a/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/writer/StreamJsonWriter.java +++ b/exporters/logging-otlp/src/main/java/io/opentelemetry/exporter/logging/otlp/internal/writer/StreamJsonWriter.java @@ -29,19 +29,29 @@ public class StreamJsonWriter implements JsonWriter { private final String type; private final OutputStream outputStream; + private final boolean prettyPrint; public StreamJsonWriter(OutputStream originalStream, String type) { + this(originalStream, type, /* prettyPrint= */ false); + } + + public StreamJsonWriter(OutputStream originalStream, String type, boolean prettyPrint) { this.outputStream = originalStream; this.type = type; + this.prettyPrint = prettyPrint; } @Override public CompletableResultCode write(Marshaler exportRequest) { try { - exportRequest.writeJsonWithNewline( + JsonGenerator generator = JSON_FACTORY .createGenerator(outputStream) - .disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET)); + .disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET); + if (prettyPrint) { + generator.useDefaultPrettyPrinter(); + } + exportRequest.writeJsonWithNewline(generator); return CompletableResultCode.ofSuccess(); } catch (IOException e) { logger.log(Level.WARNING, "Unable to write OTLP JSON " + type, e); diff --git a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporterTest.java b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporterTest.java index 75677620dbb..837824ff463 100644 --- a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporterTest.java +++ b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogRecordExporterTest.java @@ -42,7 +42,7 @@ void log() throws Exception { String message = logs.getEvents().get(0).getMessage(); String expectedJson = testDataExporter.getExpectedJson(false); JSONAssert.assertEquals("Got \n" + message, expectedJson, message, /* strict= */ false); - assertThat(message).doesNotContain("\n"); + assertThat(message).contains("\n"); } @Test diff --git a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporterTest.java b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporterTest.java index ccbfdb26dce..2770bc06e13 100644 --- a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporterTest.java +++ b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingMetricExporterTest.java @@ -57,7 +57,7 @@ void log() throws Exception { String message = logs.getEvents().get(0).getMessage(); String expectedJson = testDataExporter.getExpectedJson(false); JSONAssert.assertEquals("Got \n" + message, expectedJson, message, /* strict= */ false); - assertThat(message).doesNotContain("\n"); + assertThat(message).contains("\n"); } @Test diff --git a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporterTest.java b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporterTest.java index ac3129f4a1c..7e88b39ccb2 100644 --- a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporterTest.java +++ b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingSpanExporterTest.java @@ -43,7 +43,7 @@ void log() throws Exception { String message = logs.getEvents().get(0).getMessage(); String expectedJson = testDataExporter.getExpectedJson(false); JSONAssert.assertEquals("Got \n" + message, expectedJson, message, /* strict= */ false); - assertThat(message).doesNotContain("\n"); + assertThat(message).contains("\n"); } @Test