Add toString implementation to various log SDK components (#4979)

This commit is contained in:
jack-berg 2022-11-26 09:10:35 -06:00 committed by GitHub
parent 44975c2853
commit c2947bf046
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 101 additions and 3 deletions

View File

@ -80,12 +80,14 @@ public final class OpenTelemetrySdk implements OpenTelemetry {
@Override
public String toString() {
// TODO(anuraaga): Add logs / propagators
// TODO(anuraaga): Add propagators
return "OpenTelemetrySdk{"
+ "tracerProvider="
+ tracerProvider.unobfuscate()
+ ", meterProvider="
+ meterProvider.unobfuscate()
+ ", loggerProvider="
+ loggerProvider
+ "}";
}

View File

@ -19,6 +19,8 @@ import io.opentelemetry.context.propagation.ContextPropagators;
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 @@ class OpenTelemetrySdkTest {
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 @@ class OpenTelemetrySdkTest {
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 @@ class OpenTelemetrySdkTest {
+ "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{}]}}"
+ "}"
+ "}");
}

View File

@ -117,4 +117,18 @@ public final class SdkLoggerProvider implements LoggerProvider, Closeable {
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()
+ '}';
}
}

View File

@ -107,6 +107,20 @@ public final class BatchLogRecordProcessor implements LogRecordProcessor {
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.

View File

@ -8,6 +8,7 @@ package io.opentelemetry.sdk.logs.export;
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 @@ final class MultiLogRecordExporter implements LogRecordExporter {
return CompletableResultCode.ofAll(results);
}
private MultiLogRecordExporter(LogRecordExporter[] logRecordExporters) {
this.logRecordExporters = logRecordExporters;
@Override
public String toString() {
return "MultiLogRecordExporter{"
+ "logRecordExporters="
+ Arrays.toString(logRecordExporters)
+ '}';
}
}

View File

@ -104,4 +104,9 @@ public final class SimpleLogRecordProcessor implements LogRecordProcessor {
public CompletableResultCode forceFlush() {
return CompletableResultCode.ofAll(pendingExports);
}
@Override
public String toString() {
return "SimpleLogRecordProcessor{" + "logRecordExporter=" + logRecordExporter + '}';
}
}

View File

@ -346,4 +346,17 @@ class SdkLoggerProviderTest {
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"
+ "}");
}
}

View File

@ -420,6 +420,14 @@ class BatchLogRecordProcessorTest {
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();

View File

@ -136,4 +136,13 @@ class MultiLogRecordExporterTest {
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]}");
}
}

View File

@ -119,4 +119,11 @@ class SimpleLogRecordProcessorTest {
assertThat(shutdown.isSuccess()).isTrue();
verify(logRecordExporter).shutdown();
}
@Test
void toString_Valid() {
when(logRecordExporter.toString()).thenReturn("MockLogRecordExporter");
assertThat(logRecordProcessor.toString())
.isEqualTo("SimpleLogRecordProcessor{logRecordExporter=MockLogRecordExporter}");
}
}