Add toString implementation to various log SDK components (#4979)
This commit is contained in:
parent
44975c2853
commit
c2947bf046
|
@ -80,12 +80,14 @@ public final class OpenTelemetrySdk implements OpenTelemetry {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
// TODO(anuraaga): Add logs / propagators
|
// TODO(anuraaga): Add propagators
|
||||||
return "OpenTelemetrySdk{"
|
return "OpenTelemetrySdk{"
|
||||||
+ "tracerProvider="
|
+ "tracerProvider="
|
||||||
+ tracerProvider.unobfuscate()
|
+ tracerProvider.unobfuscate()
|
||||||
+ ", meterProvider="
|
+ ", meterProvider="
|
||||||
+ meterProvider.unobfuscate()
|
+ meterProvider.unobfuscate()
|
||||||
|
+ ", loggerProvider="
|
||||||
|
+ loggerProvider
|
||||||
+ "}";
|
+ "}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@ import io.opentelemetry.context.propagation.ContextPropagators;
|
||||||
import io.opentelemetry.context.propagation.TextMapPropagator;
|
import io.opentelemetry.context.propagation.TextMapPropagator;
|
||||||
import io.opentelemetry.sdk.common.Clock;
|
import io.opentelemetry.sdk.common.Clock;
|
||||||
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
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.Aggregation;
|
||||||
import io.opentelemetry.sdk.metrics.InstrumentSelector;
|
import io.opentelemetry.sdk.metrics.InstrumentSelector;
|
||||||
import io.opentelemetry.sdk.metrics.InstrumentType;
|
import io.opentelemetry.sdk.metrics.InstrumentType;
|
||||||
|
@ -322,6 +324,8 @@ class OpenTelemetrySdkTest {
|
||||||
when(spanExporter.toString()).thenReturn("MockSpanExporter{}");
|
when(spanExporter.toString()).thenReturn("MockSpanExporter{}");
|
||||||
when(metricExporter.getDefaultAggregation(any())).thenCallRealMethod();
|
when(metricExporter.getDefaultAggregation(any())).thenCallRealMethod();
|
||||||
when(metricExporter.toString()).thenReturn("MockMetricExporter{}");
|
when(metricExporter.toString()).thenReturn("MockMetricExporter{}");
|
||||||
|
LogRecordExporter logRecordExporter = mock(LogRecordExporter.class);
|
||||||
|
when(logRecordExporter.toString()).thenReturn("MockLogRecordExporter{}");
|
||||||
Resource resource =
|
Resource resource =
|
||||||
Resource.builder().put(AttributeKey.stringKey("service.name"), "otel-test").build();
|
Resource.builder().put(AttributeKey.stringKey("service.name"), "otel-test").build();
|
||||||
OpenTelemetrySdk sdk =
|
OpenTelemetrySdk sdk =
|
||||||
|
@ -341,6 +345,13 @@ class OpenTelemetrySdkTest {
|
||||||
InstrumentSelector.builder().setName("instrument").build(),
|
InstrumentSelector.builder().setName("instrument").build(),
|
||||||
View.builder().setName("new-instrument").build())
|
View.builder().setName("new-instrument").build())
|
||||||
.build())
|
.build())
|
||||||
|
.setLoggerProvider(
|
||||||
|
SdkLoggerProvider.builder()
|
||||||
|
.setResource(resource)
|
||||||
|
.addLogRecordProcessor(
|
||||||
|
SimpleLogRecordProcessor.create(
|
||||||
|
LogRecordExporter.composite(logRecordExporter, logRecordExporter)))
|
||||||
|
.build())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
assertThat(sdk.toString())
|
assertThat(sdk.toString())
|
||||||
|
@ -359,6 +370,12 @@ class OpenTelemetrySdkTest {
|
||||||
+ "resource=Resource{schemaUrl=null, attributes={service.name=\"otel-test\"}}, "
|
+ "resource=Resource{schemaUrl=null, attributes={service.name=\"otel-test\"}}, "
|
||||||
+ "metricReaders=[PeriodicMetricReader{exporter=MockMetricExporter{}, intervalNanos=60000000000}], "
|
+ "metricReaders=[PeriodicMetricReader{exporter=MockMetricExporter{}, intervalNanos=60000000000}], "
|
||||||
+ "views=[RegisteredView{instrumentSelector=InstrumentSelector{instrumentName=instrument}, view=View{name=new-instrument, aggregation=DefaultAggregation, attributesProcessor=NoopAttributesProcessor{}}}]"
|
+ "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{}]}}"
|
||||||
+ "}"
|
+ "}"
|
||||||
+ "}");
|
+ "}");
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,4 +117,18 @@ public final class SdkLoggerProvider implements LoggerProvider, Closeable {
|
||||||
public void close() {
|
public void close() {
|
||||||
shutdown().join(10, TimeUnit.SECONDS);
|
shutdown().join(10, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "SdkLoggerProvider{"
|
||||||
|
+ "clock="
|
||||||
|
+ sharedState.getClock()
|
||||||
|
+ ", resource="
|
||||||
|
+ sharedState.getResource()
|
||||||
|
+ ", logLimits="
|
||||||
|
+ sharedState.getLogLimits()
|
||||||
|
+ ", logRecordProcessor="
|
||||||
|
+ sharedState.getLogRecordProcessor()
|
||||||
|
+ '}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,6 +107,20 @@ public final class BatchLogRecordProcessor implements LogRecordProcessor {
|
||||||
return worker.batch;
|
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
|
// Worker is a thread that batches multiple logs and calls the registered LogRecordExporter to
|
||||||
// export
|
// export
|
||||||
// the data.
|
// the data.
|
||||||
|
|
|
@ -8,6 +8,7 @@ package io.opentelemetry.sdk.logs.export;
|
||||||
import io.opentelemetry.sdk.common.CompletableResultCode;
|
import io.opentelemetry.sdk.common.CompletableResultCode;
|
||||||
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
@ -24,6 +25,10 @@ final class MultiLogRecordExporter implements LogRecordExporter {
|
||||||
|
|
||||||
private final LogRecordExporter[] logRecordExporters;
|
private final LogRecordExporter[] logRecordExporters;
|
||||||
|
|
||||||
|
private MultiLogRecordExporter(LogRecordExporter[] logRecordExporters) {
|
||||||
|
this.logRecordExporters = logRecordExporters;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs and returns an instance of this class.
|
* Constructs and returns an instance of this class.
|
||||||
*
|
*
|
||||||
|
@ -93,7 +98,11 @@ final class MultiLogRecordExporter implements LogRecordExporter {
|
||||||
return CompletableResultCode.ofAll(results);
|
return CompletableResultCode.ofAll(results);
|
||||||
}
|
}
|
||||||
|
|
||||||
private MultiLogRecordExporter(LogRecordExporter[] logRecordExporters) {
|
@Override
|
||||||
this.logRecordExporters = logRecordExporters;
|
public String toString() {
|
||||||
|
return "MultiLogRecordExporter{"
|
||||||
|
+ "logRecordExporters="
|
||||||
|
+ Arrays.toString(logRecordExporters)
|
||||||
|
+ '}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,4 +104,9 @@ public final class SimpleLogRecordProcessor implements LogRecordProcessor {
|
||||||
public CompletableResultCode forceFlush() {
|
public CompletableResultCode forceFlush() {
|
||||||
return CompletableResultCode.ofAll(pendingExports);
|
return CompletableResultCode.ofAll(pendingExports);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "SimpleLogRecordProcessor{" + "logRecordExporter=" + logRecordExporter + '}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -346,4 +346,17 @@ class SdkLoggerProviderTest {
|
||||||
assertThat(seenLogs.size()).isEqualTo(1);
|
assertThat(seenLogs.size()).isEqualTo(1);
|
||||||
assertThat(seenLogs.get(0).toLogRecordData().getEpochNanos()).isEqualTo(now);
|
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"
|
||||||
|
+ "}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -420,6 +420,14 @@ class BatchLogRecordProcessorTest {
|
||||||
assertThat(result.isSuccess()).isFalse();
|
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 {
|
private static final class BlockingLogRecordExporter implements LogRecordExporter {
|
||||||
|
|
||||||
final Object monitor = new Object();
|
final Object monitor = new Object();
|
||||||
|
|
|
@ -136,4 +136,13 @@ class MultiLogRecordExporterTest {
|
||||||
verify(logRecordExporter1).shutdown();
|
verify(logRecordExporter1).shutdown();
|
||||||
verify(logRecordExporter2).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]}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,4 +119,11 @@ class SimpleLogRecordProcessorTest {
|
||||||
assertThat(shutdown.isSuccess()).isTrue();
|
assertThat(shutdown.isSuccess()).isTrue();
|
||||||
verify(logRecordExporter).shutdown();
|
verify(logRecordExporter).shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void toString_Valid() {
|
||||||
|
when(logRecordExporter.toString()).thenReturn("MockLogRecordExporter");
|
||||||
|
assertThat(logRecordProcessor.toString())
|
||||||
|
.isEqualTo("SimpleLogRecordProcessor{logRecordExporter=MockLogRecordExporter}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue