diff --git a/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdk.java b/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdk.java index 78263217384..79c264759d4 100644 --- a/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdk.java +++ b/sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdk.java @@ -80,12 +80,14 @@ public ContextPropagators getPropagators() { @Override public String toString() { - // TODO(anuraaga): Add logs / propagators + // TODO(anuraaga): Add propagators return "OpenTelemetrySdk{" + "tracerProvider=" + tracerProvider.unobfuscate() + ", meterProvider=" + meterProvider.unobfuscate() + + ", loggerProvider=" + + loggerProvider + "}"; } diff --git a/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java b/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java index a65080bb6c7..3a9228d9c8c 100644 --- a/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java +++ b/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java @@ -19,6 +19,8 @@ import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.common.Clock; import io.opentelemetry.sdk.logs.SdkLoggerProvider; +import io.opentelemetry.sdk.logs.export.LogRecordExporter; +import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; import io.opentelemetry.sdk.metrics.Aggregation; import io.opentelemetry.sdk.metrics.InstrumentSelector; import io.opentelemetry.sdk.metrics.InstrumentType; @@ -322,6 +324,8 @@ void stringRepresentation() { when(spanExporter.toString()).thenReturn("MockSpanExporter{}"); when(metricExporter.getDefaultAggregation(any())).thenCallRealMethod(); when(metricExporter.toString()).thenReturn("MockMetricExporter{}"); + LogRecordExporter logRecordExporter = mock(LogRecordExporter.class); + when(logRecordExporter.toString()).thenReturn("MockLogRecordExporter{}"); Resource resource = Resource.builder().put(AttributeKey.stringKey("service.name"), "otel-test").build(); OpenTelemetrySdk sdk = @@ -341,6 +345,13 @@ void stringRepresentation() { InstrumentSelector.builder().setName("instrument").build(), View.builder().setName("new-instrument").build()) .build()) + .setLoggerProvider( + SdkLoggerProvider.builder() + .setResource(resource) + .addLogRecordProcessor( + SimpleLogRecordProcessor.create( + LogRecordExporter.composite(logRecordExporter, logRecordExporter))) + .build()) .build(); assertThat(sdk.toString()) @@ -359,6 +370,12 @@ void stringRepresentation() { + "resource=Resource{schemaUrl=null, attributes={service.name=\"otel-test\"}}, " + "metricReaders=[PeriodicMetricReader{exporter=MockMetricExporter{}, intervalNanos=60000000000}], " + "views=[RegisteredView{instrumentSelector=InstrumentSelector{instrumentName=instrument}, view=View{name=new-instrument, aggregation=DefaultAggregation, attributesProcessor=NoopAttributesProcessor{}}}]" + + "}, " + + "loggerProvider=SdkLoggerProvider{" + + "clock=SystemClock{}, " + + "resource=Resource{schemaUrl=null, attributes={service.name=\"otel-test\"}}, " + + "logLimits=LogLimits{maxNumberOfAttributes=128, maxAttributeValueLength=2147483647}, " + + "logRecordProcessor=SimpleLogRecordProcessor{logRecordExporter=MultiLogRecordExporter{logRecordExporters=[MockLogRecordExporter{}, MockLogRecordExporter{}]}}" + "}" + "}"); } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLoggerProvider.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLoggerProvider.java index 478700742d6..d7b35c9ed86 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLoggerProvider.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLoggerProvider.java @@ -117,4 +117,18 @@ public CompletableResultCode shutdown() { public void close() { shutdown().join(10, TimeUnit.SECONDS); } + + @Override + public String toString() { + return "SdkLoggerProvider{" + + "clock=" + + sharedState.getClock() + + ", resource=" + + sharedState.getResource() + + ", logLimits=" + + sharedState.getLogLimits() + + ", logRecordProcessor=" + + sharedState.getLogRecordProcessor() + + '}'; + } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java index f327b3b4acc..01b5effc7fa 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessor.java @@ -107,6 +107,20 @@ ArrayList getBatch() { return worker.batch; } + @Override + public String toString() { + return "BatchLogRecordProcessor{" + + "logRecordExporter=" + + worker.logRecordExporter + + ", scheduleDelayNanos=" + + worker.scheduleDelayNanos + + ", maxExportBatchSize=" + + worker.maxExportBatchSize + + ", exporterTimeoutNanos=" + + worker.exporterTimeoutNanos + + '}'; + } + // Worker is a thread that batches multiple logs and calls the registered LogRecordExporter to // export // the data. diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporter.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporter.java index f7676d7580c..33d1a1b726a 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporter.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporter.java @@ -8,6 +8,7 @@ import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.logs.data.LogRecordData; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.logging.Level; @@ -24,6 +25,10 @@ final class MultiLogRecordExporter implements LogRecordExporter { private final LogRecordExporter[] logRecordExporters; + private MultiLogRecordExporter(LogRecordExporter[] logRecordExporters) { + this.logRecordExporters = logRecordExporters; + } + /** * Constructs and returns an instance of this class. * @@ -93,7 +98,11 @@ public CompletableResultCode shutdown() { return CompletableResultCode.ofAll(results); } - private MultiLogRecordExporter(LogRecordExporter[] logRecordExporters) { - this.logRecordExporters = logRecordExporters; + @Override + public String toString() { + return "MultiLogRecordExporter{" + + "logRecordExporters=" + + Arrays.toString(logRecordExporters) + + '}'; } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java index 3bb510718aa..bb891e28435 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessor.java @@ -104,4 +104,9 @@ public CompletableResultCode shutdown() { public CompletableResultCode forceFlush() { return CompletableResultCode.ofAll(pendingExports); } + + @Override + public String toString() { + return "SimpleLogRecordProcessor{" + "logRecordExporter=" + logRecordExporter + '}'; + } } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderTest.java index 7408fdfc8dc..b663d70de59 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderTest.java @@ -346,4 +346,17 @@ void canSetClock() { assertThat(seenLogs.size()).isEqualTo(1); assertThat(seenLogs.get(0).toLogRecordData().getEpochNanos()).isEqualTo(now); } + + @Test + void toString_Valid() { + when(logRecordProcessor.toString()).thenReturn("MockLogRecordProcessor"); + assertThat(sdkLoggerProvider.toString()) + .isEqualTo( + "SdkLoggerProvider{" + + "clock=SystemClock{}, " + + "resource=Resource{schemaUrl=null, attributes={service.name=\"unknown_service:java\", telemetry.sdk.language=\"java\", telemetry.sdk.name=\"opentelemetry\", telemetry.sdk.version=\"1.21.0-SNAPSHOT\"}}, " + + "logLimits=LogLimits{maxNumberOfAttributes=128, maxAttributeValueLength=2147483647}, " + + "logRecordProcessor=MockLogRecordProcessor" + + "}"); + } } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessorTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessorTest.java index 1039b7e34bc..cf20eead2d5 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessorTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/BatchLogRecordProcessorTest.java @@ -420,6 +420,14 @@ void shutdownPropagatesFailure() { assertThat(result.isSuccess()).isFalse(); } + @Test + void toString_Valid() { + when(mockLogRecordExporter.toString()).thenReturn("MockLogRecordExporter"); + assertThat(BatchLogRecordProcessor.builder(mockLogRecordExporter).build().toString()) + .isEqualTo( + "BatchLogRecordProcessor{logRecordExporter=MockLogRecordExporter, scheduleDelayNanos=200000000, maxExportBatchSize=512, exporterTimeoutNanos=30000000000}"); + } + private static final class BlockingLogRecordExporter implements LogRecordExporter { final Object monitor = new Object(); diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporterTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporterTest.java index 1f970d6bf40..2f781e4e68b 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporterTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/MultiLogRecordExporterTest.java @@ -136,4 +136,13 @@ void twoLogRecordExporter_FirstThrows() { verify(logRecordExporter1).shutdown(); verify(logRecordExporter2).shutdown(); } + + @Test + void toString_Valid() { + when(logRecordExporter1.toString()).thenReturn("LogRecordExporter1"); + when(logRecordExporter2.toString()).thenReturn("LogRecordExporter2"); + assertThat(LogRecordExporter.composite(logRecordExporter1, logRecordExporter2).toString()) + .isEqualTo( + "MultiLogRecordExporter{logRecordExporters=[LogRecordExporter1, LogRecordExporter2]}"); + } } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessorTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessorTest.java index 1550c68b3ef..bace5bdbaf6 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessorTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/SimpleLogRecordProcessorTest.java @@ -119,4 +119,11 @@ void shutdown() { assertThat(shutdown.isSuccess()).isTrue(); verify(logRecordExporter).shutdown(); } + + @Test + void toString_Valid() { + when(logRecordExporter.toString()).thenReturn("MockLogRecordExporter"); + assertThat(logRecordProcessor.toString()) + .isEqualTo("SimpleLogRecordProcessor{logRecordExporter=MockLogRecordExporter}"); + } }