Rename LogExporter to LogRecordExporter (#4773)

This commit is contained in:
jack-berg 2022-09-26 09:57:30 -05:00 committed by GitHub
parent f7317c6e8d
commit 9b17be3114
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
54 changed files with 708 additions and 603 deletions

View File

@ -1,7 +1,9 @@
import com.google.auto.value.AutoValue
import japicmp.model.JApiChangeStatus
import japicmp.model.JApiClass
import japicmp.model.JApiCompatibility
import japicmp.model.JApiCompatibilityChange
import japicmp.model.JApiConstructor
import japicmp.model.JApiMethod
import me.champeau.gradle.japicmp.JapicmpTask
import me.champeau.gradle.japicmp.report.Severity
@ -38,7 +40,7 @@ class AllowDefaultMethodRule : AbstractRecordingSeenMembers() {
if (isAbstractMethodOnAutoValue(member, change)) {
continue
}
if (isLogEmitterProvider(member)) {
if (isLogRename(member)) {
continue
}
if (!change.isSourceCompatible) {
@ -64,13 +66,29 @@ class AllowDefaultMethodRule : AbstractRecordingSeenMembers() {
}
/**
* Check if the change is related to LogEmitterProvider name change to LoggerProvider.
* Check if the change is related to log related renames.
*/
// TODO(jack-berg): remove after 1.19.0.
fun isLogEmitterProvider(member: JApiCompatibility): Boolean {
fun isLogRename(member: JApiCompatibility): Boolean {
try {
return member is JApiMethod &&
member.oldMethod.get().methodInfo.name.matches("(getSdk|set|add)LogEmitterProvider(.*)".toRegex())
if (member is JApiMethod) {
val longName = member.oldMethod.get().longName
return longName.matches(".*OpenTelemetrySdk\\.getSdkLogEmitterProvider.*".toRegex()) ||
longName.matches(".*OpenTelemetrySdkBuilder\\.setLogEmitterProvider.*".toRegex()) ||
longName.matches(".*AutoConfigurationCustomizer\\.addLogExporterCustomizer.*".toRegex()) ||
longName.matches(".*AutoConfigurationCustomizer\\.addLogEmitterProviderCustomizer.*".toRegex()) ||
longName.matches(".*ConfigurableLogExporterProvider.*".toRegex()) ||
longName.matches(".*SystemOutLogExporter.*".toRegex()) ||
longName.matches(".*OtlpJsonLoggingLogExporter.*".toRegex())
} else if (member is JApiClass) {
val fqcn = member.fullyQualifiedName
return fqcn.matches(".*SystemOutLogExporter".toRegex()) ||
fqcn.matches(".*ConfigurableLogExporterProvider".toRegex()) ||
fqcn.matches(".*OtlpJsonLoggingLogExporter".toRegex())
} else if (member is JApiConstructor) {
return member.oldConstructor.get().longName.matches(".*SystemOutLogExporter.*".toRegex())
}
return false
} catch (e: IllegalStateException) {
return false
}

View File

@ -1,2 +1,15 @@
Comparing source compatibility of against
No changes.
---! REMOVED CLASS: PUBLIC(-) FINAL(-) io.opentelemetry.exporter.logging.otlp.OtlpJsonLoggingLogExporter (not serializable)
--- CLASS FILE FORMAT VERSION: n.a. <- 52.0
---! REMOVED SUPERCLASS: java.lang.Object
---! REMOVED METHOD: PUBLIC(-) STATIC(-) io.opentelemetry.sdk.logs.export.LogExporter create()
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.common.CompletableResultCode export(java.util.Collection)
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.common.CompletableResultCode flush()
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.common.CompletableResultCode shutdown()
+++ NEW CLASS: PUBLIC(+) FINAL(+) io.opentelemetry.exporter.logging.otlp.OtlpJsonLoggingLogRecordExporter (not serializable)
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
+++ NEW SUPERCLASS: java.lang.Object
+++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.logs.export.LogRecordExporter create()
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.common.CompletableResultCode export(java.util.Collection)
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.common.CompletableResultCode flush()
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.common.CompletableResultCode shutdown()

View File

@ -1,2 +1,17 @@
Comparing source compatibility of against
No changes.
---! REMOVED CLASS: PUBLIC(-) io.opentelemetry.exporter.logging.SystemOutLogExporter (not serializable)
--- CLASS FILE FORMAT VERSION: n.a. <- 52.0
---! REMOVED SUPERCLASS: java.lang.Object
---! REMOVED CONSTRUCTOR: PUBLIC(-) SystemOutLogExporter()
--- REMOVED ANNOTATION: java.lang.Deprecated
---! REMOVED METHOD: PUBLIC(-) STATIC(-) io.opentelemetry.exporter.logging.SystemOutLogExporter create()
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.common.CompletableResultCode export(java.util.Collection)
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.common.CompletableResultCode flush()
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.common.CompletableResultCode shutdown()
+++ NEW CLASS: PUBLIC(+) io.opentelemetry.exporter.logging.SystemOutLogRecordExporter (not serializable)
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
+++ NEW SUPERCLASS: java.lang.Object
+++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.exporter.logging.SystemOutLogRecordExporter create()
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.common.CompletableResultCode export(java.util.Collection)
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.common.CompletableResultCode flush()
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.common.CompletableResultCode shutdown()

View File

@ -2,4 +2,16 @@ Comparing source compatibility of against
***! MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer addLogEmitterProviderCustomizer(java.util.function.BiFunction)
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer addLogExporterCustomizer(java.util.function.BiFunction)
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer addLoggerProviderCustomizer(java.util.function.BiFunction)
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer addLogRecordExporterCustomizer(java.util.function.BiFunction)
---! REMOVED INTERFACE: PUBLIC(-) ABSTRACT(-) io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogExporterProvider (not serializable)
--- CLASS FILE FORMAT VERSION: n.a. <- 52.0
---! REMOVED SUPERCLASS: java.lang.Object
---! REMOVED METHOD: PUBLIC(-) ABSTRACT(-) io.opentelemetry.sdk.logs.export.LogExporter createExporter(io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties)
---! REMOVED METHOD: PUBLIC(-) ABSTRACT(-) java.lang.String getName()
+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogRecordExporterProvider (not serializable)
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
+++ NEW SUPERCLASS: java.lang.Object
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.logs.export.LogRecordExporter createExporter(io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties)
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String getName()

View File

@ -12,26 +12,27 @@ import com.fasterxml.jackson.core.io.SegmentedStringWriter;
import io.opentelemetry.exporter.internal.otlp.logs.ResourceLogsMarshaler;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import java.io.IOException;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A {@link LogExporter} which writes {@linkplain LogData logs} to a {@link Logger} in OTLP JSON
* format. Each log line will include a single {@code ResourceLogs}.
* A {@link LogRecordExporter} which writes {@linkplain LogData logs} to a {@link Logger} in OTLP
* JSON format. Each log line will include a single {@code ResourceLogs}.
*/
public final class OtlpJsonLoggingLogExporter implements LogExporter {
public final class OtlpJsonLoggingLogRecordExporter implements LogRecordExporter {
private static final Logger logger = Logger.getLogger(OtlpJsonLoggingLogExporter.class.getName());
private static final Logger logger =
Logger.getLogger(OtlpJsonLoggingLogRecordExporter.class.getName());
/** Returns a new {@link OtlpJsonLoggingLogExporter}. */
public static LogExporter create() {
return new OtlpJsonLoggingLogExporter();
/** Returns a new {@link OtlpJsonLoggingLogRecordExporter}. */
public static LogRecordExporter create() {
return new OtlpJsonLoggingLogRecordExporter();
}
private OtlpJsonLoggingLogExporter() {}
private OtlpJsonLoggingLogRecordExporter() {}
@Override
public CompletableResultCode export(Collection<LogData> logs) {

View File

@ -19,7 +19,7 @@ import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.util.Arrays;
@ -30,8 +30,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import org.skyscreamer.jsonassert.JSONAssert;
import org.slf4j.event.Level;
@SuppressLogger(OtlpJsonLoggingLogExporter.class)
class OtlpJsonLoggingLogExporterTest {
@SuppressLogger(OtlpJsonLoggingLogRecordExporter.class)
class OtlpJsonLoggingLogRecordExporterTest {
private static final Resource RESOURCE =
Resource.create(Attributes.builder().put("key", "value").build());
@ -76,13 +76,13 @@ class OtlpJsonLoggingLogExporterTest {
.build();
@RegisterExtension
LogCapturer logs = LogCapturer.create().captureForType(OtlpJsonLoggingLogExporter.class);
LogCapturer logs = LogCapturer.create().captureForType(OtlpJsonLoggingLogRecordExporter.class);
LogExporter exporter;
LogRecordExporter exporter;
@BeforeEach
void setUp() {
exporter = OtlpJsonLoggingLogExporter.create();
exporter = OtlpJsonLoggingLogRecordExporter.create();
}
@Test

View File

@ -10,35 +10,29 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
/**
* A {@link LogExporter} implementation that outputs log records to standard out. The output is not
* intended to be comprehensive, but just usable for debugging.
* A {@link LogRecordExporter} implementation that outputs log records to standard out. The output
* is not intended to be comprehensive, but just usable for debugging.
*
* <p>Note: this doesn't use a {@code java.util.logging Logger}, as that could result in
* logging-loops if an OTel appender is configured for {@code java.util.logging}.
*/
@SuppressWarnings("SystemOut")
public class SystemOutLogExporter implements LogExporter {
public class SystemOutLogRecordExporter implements LogRecordExporter {
private static final DateTimeFormatter ISO_FORMAT = DateTimeFormatter.ISO_DATE_TIME;
/** Returns a new {@link SystemOutLogExporter}. */
public static SystemOutLogExporter create() {
return new SystemOutLogExporter();
/** Returns a new {@link SystemOutLogRecordExporter}. */
public static SystemOutLogRecordExporter create() {
return new SystemOutLogRecordExporter();
}
/**
* Class constructor.
*
* @deprecated Use {@link #create()}.
*/
@Deprecated
public SystemOutLogExporter() {}
private SystemOutLogRecordExporter() {}
@Override
public CompletableResultCode export(Collection<LogData> logs) {

View File

@ -26,11 +26,11 @@ import java.time.ZoneOffset;
import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Test;
class SystemOutLogExporterTest {
class SystemOutLogRecordExporterTest {
@Test
void returnCodes() {
SystemOutLogExporter exporter = SystemOutLogExporter.create();
SystemOutLogRecordExporter exporter = SystemOutLogRecordExporter.create();
CompletableResultCode resultCode =
exporter.export(singletonList(sampleLog(System.currentTimeMillis())));
assertThat(resultCode).isSameAs(CompletableResultCode.ofSuccess());
@ -43,7 +43,7 @@ class SystemOutLogExporterTest {
LocalDateTime.of(1970, Month.AUGUST, 7, 10, 0).toInstant(ZoneOffset.UTC).toEpochMilli();
LogData log = sampleLog(timestamp);
StringBuilder output = new StringBuilder();
SystemOutLogExporter.formatLog(output, log);
SystemOutLogRecordExporter.formatLog(output, log);
assertThat(output.toString())
.isEqualTo(
"1970-08-07T10:00:00Z ERROR3 'message' : 00000000000000010000000000000002 0000000000000003 "

View File

@ -9,26 +9,26 @@ import io.opentelemetry.exporter.internal.okhttp.OkHttpExporter;
import io.opentelemetry.exporter.internal.otlp.logs.LogsRequestMarshaler;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import java.util.Collection;
import javax.annotation.concurrent.ThreadSafe;
/** Exports logs using OTLP via HTTP, using OpenTelemetry's protobuf model. */
@ThreadSafe
public final class OtlpHttpLogExporter implements LogExporter {
public final class OtlpHttpLogRecordExporter implements LogRecordExporter {
private final OkHttpExporter<LogsRequestMarshaler> delegate;
OtlpHttpLogExporter(OkHttpExporter<LogsRequestMarshaler> delegate) {
OtlpHttpLogRecordExporter(OkHttpExporter<LogsRequestMarshaler> delegate) {
this.delegate = delegate;
}
/**
* Returns a new {@link OtlpHttpLogExporter} using the default values.
* Returns a new {@link OtlpHttpLogRecordExporter} using the default values.
*
* @return a new {@link OtlpHttpLogExporter} instance.
* @return a new {@link OtlpHttpLogRecordExporter} instance.
*/
public static OtlpHttpLogExporter getDefault() {
public static OtlpHttpLogRecordExporter getDefault() {
return builder().build();
}
@ -37,8 +37,8 @@ public final class OtlpHttpLogExporter implements LogExporter {
*
* @return a new builder instance for this exporter.
*/
public static OtlpHttpLogExporterBuilder builder() {
return new OtlpHttpLogExporterBuilder();
public static OtlpHttpLogRecordExporterBuilder builder() {
return new OtlpHttpLogRecordExporterBuilder();
}
/**

View File

@ -14,14 +14,14 @@ import io.opentelemetry.exporter.internal.otlp.logs.LogsRequestMarshaler;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
/** Builder utility for {@link OtlpHttpLogExporter}. */
public final class OtlpHttpLogExporterBuilder {
/** Builder utility for {@link OtlpHttpLogRecordExporter}. */
public final class OtlpHttpLogRecordExporterBuilder {
private static final String DEFAULT_ENDPOINT = "http://localhost:4318/v1/logs";
private final OkHttpExporterBuilder<LogsRequestMarshaler> delegate;
OtlpHttpLogExporterBuilder() {
OtlpHttpLogRecordExporterBuilder() {
delegate = new OkHttpExporterBuilder<>("otlp", "log", DEFAULT_ENDPOINT);
}
@ -29,7 +29,7 @@ public final class OtlpHttpLogExporterBuilder {
* Sets the maximum time to wait for the collector to process an exported batch of logs. If unset,
* defaults to {@value OkHttpExporterBuilder#DEFAULT_TIMEOUT_SECS}s.
*/
public OtlpHttpLogExporterBuilder setTimeout(long timeout, TimeUnit unit) {
public OtlpHttpLogRecordExporterBuilder setTimeout(long timeout, TimeUnit unit) {
requireNonNull(unit, "unit");
checkArgument(timeout >= 0, "timeout must be non-negative");
delegate.setTimeout(timeout, unit);
@ -40,7 +40,7 @@ public final class OtlpHttpLogExporterBuilder {
* Sets the maximum time to wait for the collector to process an exported batch of logs. If unset,
* defaults to {@value OkHttpExporterBuilder#DEFAULT_TIMEOUT_SECS}s.
*/
public OtlpHttpLogExporterBuilder setTimeout(Duration timeout) {
public OtlpHttpLogRecordExporterBuilder setTimeout(Duration timeout) {
requireNonNull(timeout, "timeout");
return setTimeout(timeout.toNanos(), TimeUnit.NANOSECONDS);
}
@ -49,7 +49,7 @@ public final class OtlpHttpLogExporterBuilder {
* Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT}. The
* endpoint must start with either http:// or https://, and include the full HTTP path.
*/
public OtlpHttpLogExporterBuilder setEndpoint(String endpoint) {
public OtlpHttpLogRecordExporterBuilder setEndpoint(String endpoint) {
requireNonNull(endpoint, "endpoint");
delegate.setEndpoint(endpoint);
return this;
@ -59,7 +59,7 @@ public final class OtlpHttpLogExporterBuilder {
* Sets the method used to compress payloads. If unset, compression is disabled. Currently
* supported compression methods include "gzip" and "none".
*/
public OtlpHttpLogExporterBuilder setCompression(String compressionMethod) {
public OtlpHttpLogRecordExporterBuilder setCompression(String compressionMethod) {
requireNonNull(compressionMethod, "compressionMethod");
checkArgument(
compressionMethod.equals("gzip") || compressionMethod.equals("none"),
@ -69,7 +69,7 @@ public final class OtlpHttpLogExporterBuilder {
}
/** Add header to requests. */
public OtlpHttpLogExporterBuilder addHeader(String key, String value) {
public OtlpHttpLogRecordExporterBuilder addHeader(String key, String value) {
delegate.addHeader(key, value);
return this;
}
@ -79,7 +79,7 @@ public final class OtlpHttpLogExporterBuilder {
* should contain an X.509 certificate collection in PEM format. If not set, TLS connections will
* use the system default trusted certificates.
*/
public OtlpHttpLogExporterBuilder setTrustedCertificates(byte[] trustedCertificatesPem) {
public OtlpHttpLogRecordExporterBuilder setTrustedCertificates(byte[] trustedCertificatesPem) {
delegate.setTrustedCertificates(trustedCertificatesPem);
return this;
}
@ -88,7 +88,8 @@ public final class OtlpHttpLogExporterBuilder {
* Sets ths client key and the certificate chain to use for verifying client when TLS is enabled.
* The key must be PKCS8, and both must be in PEM format.
*/
public OtlpHttpLogExporterBuilder setClientTls(byte[] privateKeyPem, byte[] certificatePem) {
public OtlpHttpLogRecordExporterBuilder setClientTls(
byte[] privateKeyPem, byte[] certificatePem) {
delegate.setClientTls(privateKeyPem, certificatePem);
return this;
}
@ -97,7 +98,7 @@ public final class OtlpHttpLogExporterBuilder {
* Sets the {@link MeterProvider} to use to collect metrics related to export. If not set, metrics
* will not be collected.
*/
public OtlpHttpLogExporterBuilder setMeterProvider(MeterProvider meterProvider) {
public OtlpHttpLogRecordExporterBuilder setMeterProvider(MeterProvider meterProvider) {
requireNonNull(meterProvider, "meterProvider");
delegate.setMeterProvider(meterProvider);
return this;
@ -108,7 +109,7 @@ public final class OtlpHttpLogExporterBuilder {
*
* @return a new exporter's instance
*/
public OtlpHttpLogExporter build() {
return new OtlpHttpLogExporter(delegate.build());
public OtlpHttpLogRecordExporter build() {
return new OtlpHttpLogRecordExporter(delegate.build());
}
}

View File

@ -9,24 +9,24 @@ import io.opentelemetry.exporter.internal.grpc.GrpcExporter;
import io.opentelemetry.exporter.internal.otlp.logs.LogsRequestMarshaler;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import java.util.Collection;
import javax.annotation.concurrent.ThreadSafe;
/** Exports logs using OTLP via gRPC, using OpenTelemetry's protobuf model. */
@ThreadSafe
public final class OtlpGrpcLogExporter implements LogExporter {
public final class OtlpGrpcLogRecordExporter implements LogRecordExporter {
private final GrpcExporter<LogsRequestMarshaler> delegate;
/**
* Returns a new {@link OtlpGrpcLogExporter} reading the configuration values from the environment
* and from system properties. System properties override values defined in the environment. If a
* configuration value is missing, it uses the default value.
* Returns a new {@link OtlpGrpcLogRecordExporter} reading the configuration values from the
* environment and from system properties. System properties override values defined in the
* environment. If a configuration value is missing, it uses the default value.
*
* @return a new {@link OtlpGrpcLogExporter} instance.
* @return a new {@link OtlpGrpcLogRecordExporter} instance.
*/
public static OtlpGrpcLogExporter getDefault() {
public static OtlpGrpcLogRecordExporter getDefault() {
return builder().build();
}
@ -35,11 +35,11 @@ public final class OtlpGrpcLogExporter implements LogExporter {
*
* @return a new builder instance for this exporter.
*/
public static OtlpGrpcLogExporterBuilder builder() {
return new OtlpGrpcLogExporterBuilder();
public static OtlpGrpcLogRecordExporterBuilder builder() {
return new OtlpGrpcLogRecordExporterBuilder();
}
OtlpGrpcLogExporter(GrpcExporter<LogsRequestMarshaler> delegate) {
OtlpGrpcLogRecordExporter(GrpcExporter<LogsRequestMarshaler> delegate) {
this.delegate = delegate;
}

View File

@ -17,8 +17,8 @@ import java.net.URI;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
/** Builder for {@link OtlpGrpcLogExporter}. */
public final class OtlpGrpcLogExporterBuilder {
/** Builder for {@link OtlpGrpcLogRecordExporter}. */
public final class OtlpGrpcLogRecordExporterBuilder {
private static final String GRPC_SERVICE_NAME =
"opentelemetry.proto.collector.logs.v1.LogsService";
@ -32,7 +32,7 @@ public final class OtlpGrpcLogExporterBuilder {
// Visible for testing
final GrpcExporterBuilder<LogsRequestMarshaler> delegate;
OtlpGrpcLogExporterBuilder() {
OtlpGrpcLogRecordExporterBuilder() {
delegate =
GrpcExporter.builder(
"otlp",
@ -53,7 +53,7 @@ public final class OtlpGrpcLogExporterBuilder {
* methods on this builder, please file an issue to let us know what it is.
*/
@Deprecated
public OtlpGrpcLogExporterBuilder setChannel(ManagedChannel channel) {
public OtlpGrpcLogRecordExporterBuilder setChannel(ManagedChannel channel) {
delegate.setChannel(channel);
return this;
}
@ -62,7 +62,7 @@ public final class OtlpGrpcLogExporterBuilder {
* Sets the maximum time to wait for the collector to process an exported batch of logs. If unset,
* defaults to {@value DEFAULT_TIMEOUT_SECS}s.
*/
public OtlpGrpcLogExporterBuilder setTimeout(long timeout, TimeUnit unit) {
public OtlpGrpcLogRecordExporterBuilder setTimeout(long timeout, TimeUnit unit) {
requireNonNull(unit, "unit");
checkArgument(timeout >= 0, "timeout must be non-negative");
delegate.setTimeout(timeout, unit);
@ -73,7 +73,7 @@ public final class OtlpGrpcLogExporterBuilder {
* Sets the maximum time to wait for the collector to process an exported batch of logs. If unset,
* defaults to {@value DEFAULT_TIMEOUT_SECS}s.
*/
public OtlpGrpcLogExporterBuilder setTimeout(Duration timeout) {
public OtlpGrpcLogRecordExporterBuilder setTimeout(Duration timeout) {
requireNonNull(timeout, "timeout");
delegate.setTimeout(timeout);
return this;
@ -83,7 +83,7 @@ public final class OtlpGrpcLogExporterBuilder {
* Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT_URL}. The
* endpoint must start with either http:// or https://.
*/
public OtlpGrpcLogExporterBuilder setEndpoint(String endpoint) {
public OtlpGrpcLogRecordExporterBuilder setEndpoint(String endpoint) {
requireNonNull(endpoint, "endpoint");
delegate.setEndpoint(endpoint);
return this;
@ -93,7 +93,7 @@ public final class OtlpGrpcLogExporterBuilder {
* Sets the method used to compress payloads. If unset, compression is disabled. Currently
* supported compression methods include "gzip" and "none".
*/
public OtlpGrpcLogExporterBuilder setCompression(String compressionMethod) {
public OtlpGrpcLogRecordExporterBuilder setCompression(String compressionMethod) {
requireNonNull(compressionMethod, "compressionMethod");
checkArgument(
compressionMethod.equals("gzip") || compressionMethod.equals("none"),
@ -107,7 +107,7 @@ public final class OtlpGrpcLogExporterBuilder {
* should contain an X.509 certificate collection in PEM format. If not set, TLS connections will
* use the system default trusted certificates.
*/
public OtlpGrpcLogExporterBuilder setTrustedCertificates(byte[] trustedCertificatesPem) {
public OtlpGrpcLogRecordExporterBuilder setTrustedCertificates(byte[] trustedCertificatesPem) {
delegate.setTrustedCertificates(trustedCertificatesPem);
return this;
}
@ -116,20 +116,21 @@ public final class OtlpGrpcLogExporterBuilder {
* Sets ths client key and the certificate chain to use for verifying client when TLS is enabled.
* The key must be PKCS8, and both must be in PEM format.
*/
public OtlpGrpcLogExporterBuilder setClientTls(byte[] privateKeyPem, byte[] certificatePem) {
public OtlpGrpcLogRecordExporterBuilder setClientTls(
byte[] privateKeyPem, byte[] certificatePem) {
delegate.setClientTls(privateKeyPem, certificatePem);
return this;
}
/**
* Add header to request. Optional. Applicable only if {@link
* OtlpGrpcLogExporterBuilder#setChannel(ManagedChannel)} is not used to set channel.
* OtlpGrpcLogRecordExporterBuilder#setChannel(ManagedChannel)} is not used to set channel.
*
* @param key header key
* @param value header value
* @return this builder's instance
*/
public OtlpGrpcLogExporterBuilder addHeader(String key, String value) {
public OtlpGrpcLogRecordExporterBuilder addHeader(String key, String value) {
delegate.addHeader(key, value);
return this;
}
@ -138,7 +139,7 @@ public final class OtlpGrpcLogExporterBuilder {
* Sets the {@link MeterProvider} to use to collect metrics related to export. If not set, metrics
* will not be collected.
*/
public OtlpGrpcLogExporterBuilder setMeterProvider(MeterProvider meterProvider) {
public OtlpGrpcLogRecordExporterBuilder setMeterProvider(MeterProvider meterProvider) {
requireNonNull(meterProvider, "meterProvider");
delegate.setMeterProvider(meterProvider);
return this;
@ -149,7 +150,7 @@ public final class OtlpGrpcLogExporterBuilder {
*
* @return a new exporter's instance
*/
public OtlpGrpcLogExporter build() {
return new OtlpGrpcLogExporter(delegate.build());
public OtlpGrpcLogRecordExporter build() {
return new OtlpGrpcLogRecordExporter(delegate.build());
}
}

View File

@ -58,7 +58,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import org.slf4j.event.Level;
import org.slf4j.event.LoggingEvent;
class OtlpHttpLogExporterTest {
class OtlpHttpLogRecordExporterTest {
private static final MediaType APPLICATION_PROTOBUF =
MediaType.create("application", "x-protobuf");
@ -91,12 +91,12 @@ class OtlpHttpLogExporterTest {
@RegisterExtension LogCapturer logs = LogCapturer.create().captureForType(OkHttpExporter.class);
private OtlpHttpLogExporterBuilder builder;
private OtlpHttpLogRecordExporterBuilder builder;
@BeforeEach
void setup() {
builder =
OtlpHttpLogExporter.builder()
OtlpHttpLogRecordExporter.builder()
.setEndpoint("http://" + canonicalHostName + ":" + server.httpPort() + "/v1/logs")
.addHeader("foo", "bar");
}
@ -104,49 +104,54 @@ class OtlpHttpLogExporterTest {
@Test
@SuppressWarnings("PreferJavaTimeOverload")
void validConfig() {
assertThatCode(() -> OtlpHttpLogExporter.builder().setTimeout(0, TimeUnit.MILLISECONDS))
assertThatCode(() -> OtlpHttpLogRecordExporter.builder().setTimeout(0, TimeUnit.MILLISECONDS))
.doesNotThrowAnyException();
assertThatCode(() -> OtlpHttpLogExporter.builder().setTimeout(Duration.ofMillis(0)))
assertThatCode(() -> OtlpHttpLogRecordExporter.builder().setTimeout(Duration.ofMillis(0)))
.doesNotThrowAnyException();
assertThatCode(() -> OtlpHttpLogExporter.builder().setTimeout(10, TimeUnit.MILLISECONDS))
assertThatCode(() -> OtlpHttpLogRecordExporter.builder().setTimeout(10, TimeUnit.MILLISECONDS))
.doesNotThrowAnyException();
assertThatCode(() -> OtlpHttpLogExporter.builder().setTimeout(Duration.ofMillis(10)))
assertThatCode(() -> OtlpHttpLogRecordExporter.builder().setTimeout(Duration.ofMillis(10)))
.doesNotThrowAnyException();
assertThatCode(
() ->
OtlpHttpLogExporter.builder().setEndpoint("http://" + canonicalHostName + ":4317"))
.doesNotThrowAnyException();
assertThatCode(
() -> OtlpHttpLogExporter.builder().setEndpoint("http://" + canonicalHostName + ""))
.doesNotThrowAnyException();
assertThatCode(
() -> OtlpHttpLogExporter.builder().setEndpoint("https://" + canonicalHostName + ""))
OtlpHttpLogRecordExporter.builder()
.setEndpoint("http://" + canonicalHostName + ":4317"))
.doesNotThrowAnyException();
assertThatCode(
() ->
OtlpHttpLogExporter.builder()
OtlpHttpLogRecordExporter.builder().setEndpoint("http://" + canonicalHostName + ""))
.doesNotThrowAnyException();
assertThatCode(
() ->
OtlpHttpLogRecordExporter.builder()
.setEndpoint("https://" + canonicalHostName + ""))
.doesNotThrowAnyException();
assertThatCode(
() ->
OtlpHttpLogRecordExporter.builder()
.setEndpoint("http://foo:bar@" + canonicalHostName + ""))
.doesNotThrowAnyException();
assertThatCode(() -> OtlpHttpLogExporter.builder().setCompression("gzip"))
assertThatCode(() -> OtlpHttpLogRecordExporter.builder().setCompression("gzip"))
.doesNotThrowAnyException();
assertThatCode(() -> OtlpHttpLogExporter.builder().setCompression("none"))
.doesNotThrowAnyException();
assertThatCode(
() -> OtlpHttpLogExporter.builder().addHeader("foo", "bar").addHeader("baz", "qux"))
assertThatCode(() -> OtlpHttpLogRecordExporter.builder().setCompression("none"))
.doesNotThrowAnyException();
assertThatCode(
() ->
OtlpHttpLogExporter.builder()
OtlpHttpLogRecordExporter.builder().addHeader("foo", "bar").addHeader("baz", "qux"))
.doesNotThrowAnyException();
assertThatCode(
() ->
OtlpHttpLogRecordExporter.builder()
.setTrustedCertificates("foobar".getBytes(StandardCharsets.UTF_8)))
.doesNotThrowAnyException();
assertThatCode(
() ->
OtlpHttpLogExporter.builder()
OtlpHttpLogRecordExporter.builder()
.setClientTls(
"foobar".getBytes(StandardCharsets.UTF_8),
"foobar".getBytes(StandardCharsets.UTF_8)))
@ -156,39 +161,43 @@ class OtlpHttpLogExporterTest {
@Test
@SuppressWarnings("PreferJavaTimeOverload")
void invalidConfig() {
assertThatThrownBy(() -> OtlpHttpLogExporter.builder().setTimeout(-1, TimeUnit.MILLISECONDS))
assertThatThrownBy(
() -> OtlpHttpLogRecordExporter.builder().setTimeout(-1, TimeUnit.MILLISECONDS))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("timeout must be non-negative");
assertThatThrownBy(() -> OtlpHttpLogExporter.builder().setTimeout(1, null))
assertThatThrownBy(() -> OtlpHttpLogRecordExporter.builder().setTimeout(1, null))
.isInstanceOf(NullPointerException.class)
.hasMessage("unit");
assertThatThrownBy(() -> OtlpHttpLogExporter.builder().setTimeout(null))
assertThatThrownBy(() -> OtlpHttpLogRecordExporter.builder().setTimeout(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("timeout");
assertThatThrownBy(() -> OtlpHttpLogExporter.builder().setEndpoint(null))
assertThatThrownBy(() -> OtlpHttpLogRecordExporter.builder().setEndpoint(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("endpoint");
assertThatThrownBy(
() -> OtlpHttpLogExporter.builder().setEndpoint("😺://" + canonicalHostName + ""))
() -> OtlpHttpLogRecordExporter.builder().setEndpoint("😺://" + canonicalHostName + ""))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Invalid endpoint, must be a URL: 😺://" + canonicalHostName + "");
assertThatThrownBy(() -> OtlpHttpLogExporter.builder().setEndpoint("" + canonicalHostName + ""))
assertThatThrownBy(
() -> OtlpHttpLogRecordExporter.builder().setEndpoint("" + canonicalHostName + ""))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage(
"Invalid endpoint, must start with http:// or https://: " + canonicalHostName + "");
assertThatThrownBy(
() -> OtlpHttpLogExporter.builder().setEndpoint("gopher://" + canonicalHostName + ""))
() ->
OtlpHttpLogRecordExporter.builder()
.setEndpoint("gopher://" + canonicalHostName + ""))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage(
"Invalid endpoint, must start with http:// or https://: gopher://"
+ canonicalHostName
+ "");
assertThatThrownBy(() -> OtlpHttpLogExporter.builder().setCompression(null))
assertThatThrownBy(() -> OtlpHttpLogRecordExporter.builder().setCompression(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("compressionMethod");
assertThatThrownBy(() -> OtlpHttpLogExporter.builder().setCompression("foo"))
assertThatThrownBy(() -> OtlpHttpLogRecordExporter.builder().setCompression("foo"))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage(
"Unsupported compression method. Supported compression methods include: gzip, none.");
@ -199,14 +208,14 @@ class OtlpHttpLogExporterTest {
assertThatCode(
() ->
RetryUtil.setRetryPolicyOnDelegate(
OtlpHttpLogExporter.builder(), RetryPolicy.getDefault()))
OtlpHttpLogRecordExporter.builder(), RetryPolicy.getDefault()))
.doesNotThrowAnyException();
}
@Test
void testExportUncompressed() {
server.enqueue(successResponse());
OtlpHttpLogExporter exporter = builder.build();
OtlpHttpLogRecordExporter exporter = builder.build();
ExportLogsServiceRequest payload = exportAndAssertResult(exporter, /* expectedResult= */ true);
RecordedRequest recorded = server.takeRequest();
@ -221,7 +230,7 @@ class OtlpHttpLogExporterTest {
@Test
void testExportTls() {
server.enqueue(successResponse());
OtlpHttpLogExporter exporter =
OtlpHttpLogRecordExporter exporter =
builder
.setEndpoint("https://" + canonicalHostName + ":" + server.httpsPort() + "/v1/logs")
.setTrustedCertificates(
@ -241,7 +250,7 @@ class OtlpHttpLogExporterTest {
@Test
void testExportGzipCompressed() {
server.enqueue(successResponse());
OtlpHttpLogExporter exporter = builder.setCompression("gzip").build();
OtlpHttpLogRecordExporter exporter = builder.setCompression("gzip").build();
ExportLogsServiceRequest payload = exportAndAssertResult(exporter, /* expectedResult= */ true);
AggregatedHttpRequest request = server.takeRequest().request();
@ -283,7 +292,7 @@ class OtlpHttpLogExporterTest {
buildResponse(
HttpStatus.INTERNAL_SERVER_ERROR,
Status.newBuilder().setMessage("Server error!").build()));
OtlpHttpLogExporter exporter = builder.build();
OtlpHttpLogRecordExporter exporter = builder.build();
exportAndAssertResult(exporter, /* expectedResult= */ false);
LoggingEvent log =
@ -297,7 +306,7 @@ class OtlpHttpLogExporterTest {
void testServerErrorParseError() {
server.enqueue(
HttpResponse.of(HttpStatus.INTERNAL_SERVER_ERROR, APPLICATION_PROTOBUF, "Server error!"));
OtlpHttpLogExporter exporter = builder.build();
OtlpHttpLogRecordExporter exporter = builder.build();
exportAndAssertResult(exporter, /* expectedResult= */ false);
LoggingEvent log =
@ -307,9 +316,9 @@ class OtlpHttpLogExporterTest {
}
private static ExportLogsServiceRequest exportAndAssertResult(
OtlpHttpLogExporter otlpHttpLogExporter, boolean expectedResult) {
OtlpHttpLogRecordExporter otlpHttpLogRecordExporter, boolean expectedResult) {
List<LogData> logs = Collections.singletonList(generateFakeLog());
CompletableResultCode resultCode = otlpHttpLogExporter.export(logs);
CompletableResultCode resultCode = otlpHttpLogRecordExporter.export(logs);
resultCode.join(10, TimeUnit.SECONDS);
assertThat(resultCode.isSuccess()).isEqualTo(expectedResult);
List<ResourceLogs> resourceLogs =

View File

@ -27,9 +27,10 @@ import java.time.Instant;
import java.util.List;
import org.junit.jupiter.api.Test;
class OtlpGrpcLogExporterTest extends AbstractGrpcTelemetryExporterTest<LogData, ResourceLogs> {
class OtlpGrpcLogRecordExporterTest
extends AbstractGrpcTelemetryExporterTest<LogData, ResourceLogs> {
OtlpGrpcLogExporterTest() {
OtlpGrpcLogRecordExporterTest() {
super("log", ResourceLogs.getDefaultInstance());
}
@ -38,20 +39,20 @@ class OtlpGrpcLogExporterTest extends AbstractGrpcTelemetryExporterTest<LogData,
assertThatCode(
() ->
RetryUtil.setRetryPolicyOnDelegate(
OtlpGrpcLogExporter.builder(), RetryPolicy.getDefault()))
OtlpGrpcLogRecordExporter.builder(), RetryPolicy.getDefault()))
.doesNotThrowAnyException();
}
@Test
void usingOkHttp() throws Exception {
try (Closeable exporter = OtlpGrpcLogExporter.builder().build()) {
try (Closeable exporter = OtlpGrpcLogRecordExporter.builder().build()) {
assertThat(exporter).extracting("delegate").isInstanceOf(OkHttpGrpcExporter.class);
}
}
@Override
protected TelemetryExporterBuilder<LogData> exporterBuilder() {
return TelemetryExporterBuilder.wrap(OtlpGrpcLogExporter.builder());
return TelemetryExporterBuilder.wrap(OtlpGrpcLogRecordExporter.builder());
}
@Override

View File

@ -29,10 +29,10 @@ import java.time.Instant;
import java.util.List;
import org.junit.jupiter.api.Test;
class OtlpGrpcNettyLogExporterTest
class OtlpGrpcNettyLogRecordExporterTest
extends AbstractGrpcTelemetryExporterTest<LogData, ResourceLogs> {
OtlpGrpcNettyLogExporterTest() {
OtlpGrpcNettyLogRecordExporterTest() {
super("log", ResourceLogs.getDefaultInstance());
}
@ -41,7 +41,7 @@ class OtlpGrpcNettyLogExporterTest
assertThatCode(
() ->
RetryUtil.setRetryPolicyOnDelegate(
OtlpGrpcLogExporter.builder(), RetryPolicy.getDefault()))
OtlpGrpcLogRecordExporter.builder(), RetryPolicy.getDefault()))
.doesNotThrowAnyException();
}
@ -49,7 +49,7 @@ class OtlpGrpcNettyLogExporterTest
@SuppressWarnings("deprecation") // testing deprecated feature
void usingGrpc() throws Exception {
try (Closeable exporter =
OtlpGrpcLogExporter.builder()
OtlpGrpcLogRecordExporter.builder()
.setChannel(InProcessChannelBuilder.forName("test").build())
.build()) {
assertThat(exporter).extracting("delegate").isInstanceOf(UpstreamGrpcExporter.class);
@ -59,7 +59,7 @@ class OtlpGrpcNettyLogExporterTest
@Override
protected TelemetryExporterBuilder<LogData> exporterBuilder() {
return ManagedChannelTelemetryExporterBuilder.wrap(
TelemetryExporterBuilder.wrap(OtlpGrpcLogExporter.builder()));
TelemetryExporterBuilder.wrap(OtlpGrpcLogRecordExporter.builder()));
}
@Override

View File

@ -26,10 +26,10 @@ import java.time.Instant;
import java.util.List;
import org.junit.jupiter.api.Test;
class OtlpGrpcNettyShadedLogExporterTest
class OtlpGrpcNettyShadedLogRecordExporterTest
extends AbstractGrpcTelemetryExporterTest<LogData, ResourceLogs> {
OtlpGrpcNettyShadedLogExporterTest() {
OtlpGrpcNettyShadedLogRecordExporterTest() {
super("log", ResourceLogs.getDefaultInstance());
}
@ -37,7 +37,7 @@ class OtlpGrpcNettyShadedLogExporterTest
@SuppressWarnings("deprecation") // testing deprecated feature
void usingGrpc() throws Exception {
try (Closeable exporter =
OtlpGrpcLogExporter.builder()
OtlpGrpcLogRecordExporter.builder()
.setChannel(InProcessChannelBuilder.forName("test").build())
.build()) {
assertThat(exporter).extracting("delegate").isInstanceOf(UpstreamGrpcExporter.class);
@ -47,7 +47,7 @@ class OtlpGrpcNettyShadedLogExporterTest
@Override
protected TelemetryExporterBuilder<LogData> exporterBuilder() {
return ManagedChannelTelemetryExporterBuilder.wrap(
TelemetryExporterBuilder.wrap(OtlpGrpcLogExporter.builder()));
TelemetryExporterBuilder.wrap(OtlpGrpcLogRecordExporter.builder()));
}
@Override

View File

@ -26,10 +26,10 @@ import java.time.Instant;
import java.util.List;
import org.junit.jupiter.api.Test;
class OtlpGrpcNettyOkHttpLogExporterTest
class OtlpGrpcNettyOkHttpLogRecordExporterTest
extends AbstractGrpcTelemetryExporterTest<LogData, ResourceLogs> {
OtlpGrpcNettyOkHttpLogExporterTest() {
OtlpGrpcNettyOkHttpLogRecordExporterTest() {
super("log", ResourceLogs.getDefaultInstance());
}
@ -37,7 +37,7 @@ class OtlpGrpcNettyOkHttpLogExporterTest
@SuppressWarnings("deprecation") // testing deprecated feature
void usingGrpc() throws Exception {
try (Closeable exporter =
OtlpGrpcLogExporter.builder()
OtlpGrpcLogRecordExporter.builder()
.setChannel(InProcessChannelBuilder.forName("test").build())
.build()) {
assertThat(exporter).extracting("delegate").isInstanceOf(UpstreamGrpcExporter.class);
@ -47,7 +47,7 @@ class OtlpGrpcNettyOkHttpLogExporterTest
@Override
protected TelemetryExporterBuilder<LogData> exporterBuilder() {
return ManagedChannelTelemetryExporterBuilder.wrap(
TelemetryExporterBuilder.wrap(OtlpGrpcLogExporter.builder()));
TelemetryExporterBuilder.wrap(OtlpGrpcLogRecordExporter.builder()));
}
@Override

View File

@ -8,15 +8,15 @@ package io.opentelemetry.exporter.otlp.testing.internal;
import io.grpc.ManagedChannel;
import io.opentelemetry.exporter.internal.retry.RetryPolicy;
import io.opentelemetry.exporter.internal.retry.RetryUtil;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporterBuilder;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder;
import io.opentelemetry.sdk.logs.data.LogData;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
final class GrpcLogExporterBuilderWrapper implements TelemetryExporterBuilder<LogData> {
private final OtlpGrpcLogExporterBuilder builder;
final class GrpcLogRecordExporterBuilderWrapper implements TelemetryExporterBuilder<LogData> {
private final OtlpGrpcLogRecordExporterBuilder builder;
GrpcLogExporterBuilderWrapper(OtlpGrpcLogExporterBuilder builder) {
GrpcLogRecordExporterBuilderWrapper(OtlpGrpcLogRecordExporterBuilder builder) {
this.builder = builder;
}

View File

@ -98,7 +98,7 @@ public final class ManagedChannelTelemetryExporterBuilder<T>
@Override
public TelemetryExporterBuilder<T> setRetryPolicy(RetryPolicy retryPolicy) {
String grpcServiceName;
if (delegate instanceof GrpcLogExporterBuilderWrapper) {
if (delegate instanceof GrpcLogRecordExporterBuilderWrapper) {
grpcServiceName = "opentelemetry.proto.collector.logs.v1.LogsService";
} else if (delegate instanceof GrpcMetricExporterBuilderWrapper) {
grpcServiceName = "opentelemetry.proto.collector.metrics.v1.MetricsService";

View File

@ -7,7 +7,7 @@ package io.opentelemetry.exporter.otlp.testing.internal;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.metrics.data.MetricData;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
import io.opentelemetry.sdk.trace.data.SpanData;
@ -46,8 +46,8 @@ public interface TelemetryExporter<T> {
};
}
/** Wraps a LogExporter. */
static TelemetryExporter<LogData> wrap(LogExporter exporter) {
/** Wraps a LogRecordExporter. */
static TelemetryExporter<LogData> wrap(LogRecordExporter exporter) {
return new TelemetryExporter<LogData>() {
@Override
public CompletableResultCode export(Collection<LogData> items) {

View File

@ -7,7 +7,7 @@ package io.opentelemetry.exporter.otlp.testing.internal;
import io.grpc.ManagedChannel;
import io.opentelemetry.exporter.internal.retry.RetryPolicy;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporterBuilder;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder;
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
import io.opentelemetry.sdk.logs.data.LogData;
@ -26,8 +26,8 @@ public interface TelemetryExporterBuilder<T> {
return new GrpcMetricExporterBuilderWrapper(builder);
}
static TelemetryExporterBuilder<LogData> wrap(OtlpGrpcLogExporterBuilder builder) {
return new GrpcLogExporterBuilderWrapper(builder);
static TelemetryExporterBuilder<LogData> wrap(OtlpGrpcLogRecordExporterBuilder builder) {
return new GrpcLogRecordExporterBuilderWrapper(builder);
}
TelemetryExporterBuilder<T> setEndpoint(String endpoint);

View File

@ -30,10 +30,10 @@ import io.opentelemetry.api.trace.TraceId;
import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogExporter;
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter;
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter;
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporter;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter;
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest;
@ -56,7 +56,7 @@ import io.opentelemetry.proto.trace.v1.ResourceSpans;
import io.opentelemetry.proto.trace.v1.ScopeSpans;
import io.opentelemetry.proto.trace.v1.Span.Link;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.logs.export.SimpleLogProcessor;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
@ -438,8 +438,8 @@ abstract class OtlpExporterIntegrationTest {
@ParameterizedTest
@ValueSource(strings = {"gzip", "none"})
void testOtlpGrpcLogExport(String compression) {
LogExporter otlpGrpcLogExporter =
OtlpGrpcLogExporter.builder()
LogRecordExporter otlpGrpcLogRecordExporter =
OtlpGrpcLogRecordExporter.builder()
.setEndpoint(
"http://"
+ collector.getHost()
@ -448,13 +448,13 @@ abstract class OtlpExporterIntegrationTest {
.setCompression(compression)
.build();
testLogExporter(otlpGrpcLogExporter);
testLogRecordExporter(otlpGrpcLogRecordExporter);
}
@Test
void testOtlpGrpcLogExport_mtls() throws Exception {
LogExporter exporter =
OtlpGrpcLogExporter.builder()
LogRecordExporter exporter =
OtlpGrpcLogRecordExporter.builder()
.setEndpoint(
"https://"
+ collector.getHost()
@ -464,14 +464,14 @@ abstract class OtlpExporterIntegrationTest {
.setTrustedCertificates(serverTls.certificate().getEncoded())
.build();
testLogExporter(exporter);
testLogRecordExporter(exporter);
}
@ParameterizedTest
@ValueSource(strings = {"gzip", "none"})
void testOtlpHttpLogExport(String compression) {
LogExporter otlpHttpLogExporter =
OtlpHttpLogExporter.builder()
LogRecordExporter otlpHttpLogRecordExporter =
OtlpHttpLogRecordExporter.builder()
.setEndpoint(
"http://"
+ collector.getHost()
@ -481,13 +481,13 @@ abstract class OtlpExporterIntegrationTest {
.setCompression(compression)
.build();
testLogExporter(otlpHttpLogExporter);
testLogRecordExporter(otlpHttpLogRecordExporter);
}
@Test
void testOtlpHttpLogExport_mtls() throws Exception {
LogExporter exporter =
OtlpHttpLogExporter.builder()
LogRecordExporter exporter =
OtlpHttpLogRecordExporter.builder()
.setEndpoint(
"https://"
+ collector.getHost()
@ -498,14 +498,14 @@ abstract class OtlpExporterIntegrationTest {
.setTrustedCertificates(serverTls.certificate().getEncoded())
.build();
testLogExporter(exporter);
testLogRecordExporter(exporter);
}
private static void testLogExporter(LogExporter logExporter) {
private static void testLogRecordExporter(LogRecordExporter logRecordExporter) {
SdkLoggerProvider loggerProvider =
SdkLoggerProvider.builder()
.setResource(RESOURCE)
.addLogProcessor(SimpleLogProcessor.create(logExporter))
.addLogProcessor(SimpleLogProcessor.create(logRecordExporter))
.build();
Logger logger = loggerProvider.get(OtlpExporterIntegrationTest.class.getName());

View File

@ -7,7 +7,7 @@ package io.opentelemetry.sdk.autoconfigure.spi;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
import io.opentelemetry.sdk.resources.Resource;
@ -149,14 +149,15 @@ public interface AutoConfigurationCustomizer {
}
/**
* Adds a {@link BiFunction} to invoke with the default autoconfigured {@link LogExporter} to
* allow customization. The return value of the {@link BiFunction} will replace the passed-in
* Adds a {@link BiFunction} to invoke with the default autoconfigured {@link LogRecordExporter}
* to allow customization. The return value of the {@link BiFunction} will replace the passed-in
* argument.
*
* <p>Multiple calls will execute the customizers in order.
*/
default AutoConfigurationCustomizer addLogExporterCustomizer(
BiFunction<? super LogExporter, ConfigProperties, ? extends LogExporter> exporterCustomizer) {
default AutoConfigurationCustomizer addLogRecordExporterCustomizer(
BiFunction<? super LogRecordExporter, ConfigProperties, ? extends LogRecordExporter>
exporterCustomizer) {
return this;
}
}

View File

@ -6,7 +6,7 @@
package io.opentelemetry.sdk.autoconfigure.spi.logs;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
/**
* A service provider interface (SPI) for providing additional exporters that can be used with the
@ -16,13 +16,13 @@ import io.opentelemetry.sdk.logs.export.LogExporter;
*
* @since 1.17.0
*/
public interface ConfigurableLogExporterProvider {
public interface ConfigurableLogRecordExporterProvider {
/**
* Returns a {@link LogExporter} that can be registered to OpenTelemetry by providing the property
* value specified by {@link #getName()}.
* Returns a {@link LogRecordExporter} that can be registered to OpenTelemetry by providing the
* property value specified by {@link #getName()}.
*/
LogExporter createExporter(ConfigProperties config);
LogRecordExporter createExporter(ConfigProperties config);
/**
* Returns the name of this exporter, which can be specified with the {@code otel.logs.exporter}

View File

@ -19,7 +19,7 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
@ -71,8 +71,8 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
private BiFunction<SdkLoggerProviderBuilder, ConfigProperties, SdkLoggerProviderBuilder>
loggerProviderCustomizer = (a, unused) -> a;
private BiFunction<? super LogExporter, ConfigProperties, ? extends LogExporter>
logExporterCustomizer = (a, unused) -> a;
private BiFunction<? super LogRecordExporter, ConfigProperties, ? extends LogRecordExporter>
logRecordExporterCustomizer = (a, unused) -> a;
private BiFunction<? super Resource, ConfigProperties, ? extends Resource> resourceCustomizer =
(a, unused) -> a;
@ -263,18 +263,19 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
}
/**
* Adds a {@link BiFunction} to invoke with the default autoconfigured {@link LogExporter} to
* allow customization. The return value of the {@link BiFunction} will replace the passed-in
* Adds a {@link BiFunction} to invoke with the default autoconfigured {@link LogRecordExporter}
* to allow customization. The return value of the {@link BiFunction} will replace the passed-in
* argument.
*
* <p>Multiple calls will execute the customizers in order.
*/
@Override
public AutoConfiguredOpenTelemetrySdkBuilder addLogExporterCustomizer(
BiFunction<? super LogExporter, ConfigProperties, ? extends LogExporter>
logExporterCustomizer) {
requireNonNull(logExporterCustomizer, "logExporterCustomizer");
this.logExporterCustomizer = mergeCustomizer(this.logExporterCustomizer, logExporterCustomizer);
public AutoConfiguredOpenTelemetrySdkBuilder addLogRecordExporterCustomizer(
BiFunction<? super LogRecordExporter, ConfigProperties, ? extends LogRecordExporter>
logRecordExporterCustomizer) {
requireNonNull(logRecordExporterCustomizer, "logRecordExporterCustomizer");
this.logRecordExporterCustomizer =
mergeCustomizer(this.logRecordExporterCustomizer, logRecordExporterCustomizer);
return this;
}
@ -356,7 +357,11 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
SdkLoggerProviderBuilder loggerProviderBuilder = SdkLoggerProvider.builder();
loggerProviderBuilder.setResource(resource);
LoggerProviderConfiguration.configureLoggerProvider(
loggerProviderBuilder, config, serviceClassLoader, meterProvider, logExporterCustomizer);
loggerProviderBuilder,
config,
serviceClassLoader,
meterProvider,
logRecordExporterCustomizer);
loggerProviderBuilder = loggerProviderCustomizer.apply(loggerProviderBuilder, config);
SdkLoggerProvider loggerProvider = loggerProviderBuilder.build();

View File

@ -11,15 +11,15 @@ import static io.opentelemetry.sdk.autoconfigure.OtlpConfigUtil.PROTOCOL_HTTP_PR
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.exporter.internal.retry.RetryUtil;
import io.opentelemetry.exporter.logging.SystemOutLogExporter;
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogExporter;
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogExporterBuilder;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporter;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporterBuilder;
import io.opentelemetry.exporter.logging.SystemOutLogRecordExporter;
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter;
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogExporterProvider;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogRecordExporterProvider;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@ -27,17 +27,17 @@ import java.util.Set;
import java.util.function.BiFunction;
import javax.annotation.Nullable;
class LogExporterConfiguration {
class LogRecordExporterConfiguration {
private static final String EXPORTER_NONE = "none";
// Visible for test
static Map<String, LogExporter> configureLogExporters(
static Map<String, LogRecordExporter> configureLogRecordExporters(
ConfigProperties config,
ClassLoader serviceClassLoader,
MeterProvider meterProvider,
BiFunction<? super LogExporter, ConfigProperties, ? extends LogExporter>
logExporterCustomizer) {
BiFunction<? super LogRecordExporter, ConfigProperties, ? extends LogRecordExporter>
logRecordExporterCustomizer) {
Set<String> exporterNames = DefaultConfigProperties.getSet(config, "otel.logs.exporter");
// Default to no exporter
@ -53,20 +53,22 @@ class LogExporterConfiguration {
return Collections.emptyMap();
}
NamedSpiManager<LogExporter> spiExportersManager =
NamedSpiManager<LogRecordExporter> spiExportersManager =
SpiUtil.loadConfigurable(
ConfigurableLogExporterProvider.class,
ConfigurableLogExporterProvider::getName,
ConfigurableLogExporterProvider::createExporter,
ConfigurableLogRecordExporterProvider.class,
ConfigurableLogRecordExporterProvider::getName,
ConfigurableLogRecordExporterProvider::createExporter,
config,
serviceClassLoader);
Map<String, LogExporter> exportersByName = new HashMap<>();
Map<String, LogRecordExporter> exportersByName = new HashMap<>();
for (String name : exporterNames) {
LogExporter logExporter = configureExporter(name, config, spiExportersManager, meterProvider);
if (logExporter != null) {
LogExporter customizedLogExporter = logExporterCustomizer.apply(logExporter, config);
exportersByName.put(name, customizedLogExporter);
LogRecordExporter logRecordExporter =
configureExporter(name, config, spiExportersManager, meterProvider);
if (logRecordExporter != null) {
LogRecordExporter customizedLogRecordExporter =
logRecordExporterCustomizer.apply(logRecordExporter, config);
exportersByName.put(name, customizedLogRecordExporter);
}
}
@ -75,22 +77,22 @@ class LogExporterConfiguration {
// Visible for testing
@Nullable
static LogExporter configureExporter(
static LogRecordExporter configureExporter(
String name,
ConfigProperties config,
NamedSpiManager<LogExporter> spiExportersManager,
NamedSpiManager<LogRecordExporter> spiExportersManager,
MeterProvider meterProvider) {
switch (name) {
case "otlp":
return configureOtlpLogs(config, meterProvider);
case "logging":
ClasspathUtil.checkClassExists(
"io.opentelemetry.exporter.logging.SystemOutLogExporter",
"io.opentelemetry.exporter.logging.SystemOutLogRecordExporter",
"Logging Log Exporter",
"opentelemetry-exporter-logging");
return SystemOutLogExporter.create();
return SystemOutLogRecordExporter.create();
default:
LogExporter spiExporter = spiExportersManager.getByName(name);
LogRecordExporter spiExporter = spiExportersManager.getByName(name);
if (spiExporter == null) {
throw new ConfigurationException("Unrecognized value for otel.logs.exporter: " + name);
}
@ -100,20 +102,20 @@ class LogExporterConfiguration {
// Visible for testing
@Nullable
static LogExporter configureOtlpLogs(ConfigProperties config, MeterProvider meterProvider) {
static LogRecordExporter configureOtlpLogs(ConfigProperties config, MeterProvider meterProvider) {
String protocol = OtlpConfigUtil.getOtlpProtocol(DATA_TYPE_LOGS, config);
if (protocol.equals(PROTOCOL_HTTP_PROTOBUF)) {
try {
ClasspathUtil.checkClassExists(
"io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogExporter",
"io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter",
"OTLP HTTP Log Exporter",
"opentelemetry-exporter-otlp-http-logs");
} catch (ConfigurationException e) {
// Squash this for now until logs are stable
return null;
}
OtlpHttpLogExporterBuilder builder = OtlpHttpLogExporter.builder();
OtlpHttpLogRecordExporterBuilder builder = OtlpHttpLogRecordExporter.builder();
OtlpConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_LOGS,
@ -132,14 +134,14 @@ class LogExporterConfiguration {
} else if (protocol.equals(PROTOCOL_GRPC)) {
try {
ClasspathUtil.checkClassExists(
"io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporter",
"io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter",
"OTLP gRPC Log Exporter",
"opentelemetry-exporter-otlp-logs");
} catch (ConfigurationException e) {
// Squash this for now until logs are stable
return null;
}
OtlpGrpcLogExporterBuilder builder = OtlpGrpcLogExporter.builder();
OtlpGrpcLogRecordExporterBuilder builder = OtlpGrpcLogRecordExporter.builder();
OtlpConfigUtil.configureOtlpExporterBuilder(
DATA_TYPE_LOGS,
@ -159,5 +161,5 @@ class LogExporterConfiguration {
}
}
private LogExporterConfiguration() {}
private LogRecordExporterConfiguration() {}
}

View File

@ -5,7 +5,7 @@
package io.opentelemetry.sdk.autoconfigure;
import static io.opentelemetry.sdk.autoconfigure.LogExporterConfiguration.configureLogExporters;
import static io.opentelemetry.sdk.autoconfigure.LogRecordExporterConfiguration.configureLogRecordExporters;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
@ -14,7 +14,7 @@ import io.opentelemetry.sdk.logs.LogLimitsBuilder;
import io.opentelemetry.sdk.logs.LogProcessor;
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
import io.opentelemetry.sdk.logs.export.BatchLogProcessor;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.logs.export.SimpleLogProcessor;
import java.util.ArrayList;
import java.util.HashMap;
@ -29,13 +29,14 @@ final class LoggerProviderConfiguration {
ConfigProperties config,
ClassLoader serviceClassLoader,
MeterProvider meterProvider,
BiFunction<? super LogExporter, ConfigProperties, ? extends LogExporter>
logExporterCustomizer) {
BiFunction<? super LogRecordExporter, ConfigProperties, ? extends LogRecordExporter>
logRecordExporterCustomizer) {
loggerProviderBuilder.setLogLimits(() -> configureLogLimits(config));
Map<String, LogExporter> exportersByName =
configureLogExporters(config, serviceClassLoader, meterProvider, logExporterCustomizer);
Map<String, LogRecordExporter> exportersByName =
configureLogRecordExporters(
config, serviceClassLoader, meterProvider, logRecordExporterCustomizer);
configureLogProcessors(exportersByName, meterProvider)
.forEach(loggerProviderBuilder::addLogProcessor);
@ -43,19 +44,22 @@ final class LoggerProviderConfiguration {
// Visible for testing
static List<LogProcessor> configureLogProcessors(
Map<String, LogExporter> exportersByName, MeterProvider meterProvider) {
Map<String, LogExporter> exportersByNameCopy = new HashMap<>(exportersByName);
Map<String, LogRecordExporter> exportersByName, MeterProvider meterProvider) {
Map<String, LogRecordExporter> exportersByNameCopy = new HashMap<>(exportersByName);
List<LogProcessor> logProcessors = new ArrayList<>();
LogExporter exporter = exportersByNameCopy.remove("logging");
LogRecordExporter exporter = exportersByNameCopy.remove("logging");
if (exporter != null) {
logProcessors.add(SimpleLogProcessor.create(exporter));
}
if (!exportersByNameCopy.isEmpty()) {
LogExporter compositeLogExporter = LogExporter.composite(exportersByNameCopy.values());
LogRecordExporter compositeLogRecordExporter =
LogRecordExporter.composite(exportersByNameCopy.values());
logProcessors.add(
BatchLogProcessor.builder(compositeLogExporter).setMeterProvider(meterProvider).build());
BatchLogProcessor.builder(compositeLogRecordExporter)
.setMeterProvider(meterProvider)
.build());
}
return logProcessors;

View File

@ -282,7 +282,7 @@ class AutoConfiguredOpenTelemetrySdkTest {
verify(logProcessor).forceFlush();
}
// TODO: add test for addLogExporterCustomizer once OTLP export is enabled by default
// TODO: add test for addLogRecordExporterCustomizer once OTLP export is enabled by default
@Test
void builder_setResultAsGlobalFalse() {

View File

@ -13,18 +13,18 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import org.junit.jupiter.api.Test;
class LogExporterConfigurationTest {
class LogRecordExporterConfigurationTest {
@Test
void configureLogExporters_duplicates() {
void configureLogRecordExporters_duplicates() {
ConfigProperties config =
DefaultConfigProperties.createForTest(ImmutableMap.of("otel.logs.exporter", "otlp,otlp"));
assertThatThrownBy(
() ->
LogExporterConfiguration.configureLogExporters(
LogRecordExporterConfiguration.configureLogRecordExporters(
config,
LogExporterConfiguration.class.getClassLoader(),
LogRecordExporterConfiguration.class.getClassLoader(),
MeterProvider.noop(),
(a, unused) -> a))
.isInstanceOf(ConfigurationException.class)
@ -32,15 +32,15 @@ class LogExporterConfigurationTest {
}
@Test
void configureLogExporters_unrecognized() {
void configureLogRecordExporters_unrecognized() {
ConfigProperties config =
DefaultConfigProperties.createForTest(ImmutableMap.of("otel.logs.exporter", "foo"));
assertThatThrownBy(
() ->
LogExporterConfiguration.configureLogExporters(
LogRecordExporterConfiguration.configureLogRecordExporters(
config,
LogExporterConfiguration.class.getClassLoader(),
LogRecordExporterConfiguration.class.getClassLoader(),
MeterProvider.noop(),
(a, unused) -> a))
.isInstanceOf(ConfigurationException.class)
@ -48,15 +48,15 @@ class LogExporterConfigurationTest {
}
@Test
void configureLogExporters_multipleWithNone() {
void configureLogRecordExporters_multipleWithNone() {
ConfigProperties config =
DefaultConfigProperties.createForTest(ImmutableMap.of("otel.logs.exporter", "otlp,none"));
assertThatThrownBy(
() ->
LogExporterConfiguration.configureLogExporters(
LogRecordExporterConfiguration.configureLogRecordExporters(
config,
LogExporterConfiguration.class.getClassLoader(),
LogRecordExporterConfiguration.class.getClassLoader(),
MeterProvider.noop(),
(a, unused) -> a))
.isInstanceOf(ConfigurationException.class)
@ -67,7 +67,7 @@ class LogExporterConfigurationTest {
void configureOtlpLogs_unsupportedProtocol() {
assertThatThrownBy(
() ->
LogExporterConfiguration.configureOtlpLogs(
LogRecordExporterConfiguration.configureOtlpLogs(
DefaultConfigProperties.createForTest(
ImmutableMap.of("otel.exporter.otlp.protocol", "foo")),
MeterProvider.noop()))

View File

@ -100,7 +100,7 @@ class NotOnClasspathTest {
void loggingLogs() {
assertThatThrownBy(
() ->
LogExporterConfiguration.configureExporter(
LogRecordExporterConfiguration.configureExporter(
"logging", EMPTY, NamedSpiManager.createEmpty(), MeterProvider.noop()))
.isInstanceOf(ConfigurationException.class)
.hasMessageContaining(
@ -171,7 +171,7 @@ class NotOnClasspathTest {
void otlpGrpcLogs() {
assertThatCode(
() ->
LogExporterConfiguration.configureExporter(
LogRecordExporterConfiguration.configureExporter(
"otlp", EMPTY, NamedSpiManager.createEmpty(), MeterProvider.noop()))
.doesNotThrowAnyException();
}
@ -183,7 +183,7 @@ class NotOnClasspathTest {
Collections.singletonMap("otel.exporter.otlp.protocol", "http/protobuf"));
assertThatCode(
() ->
LogExporterConfiguration.configureExporter(
LogRecordExporterConfiguration.configureExporter(
"otlp", config, NamedSpiManager.createEmpty(), MeterProvider.noop()))
.doesNotThrowAnyException();
}

View File

@ -12,24 +12,24 @@ import com.google.common.collect.ImmutableMap;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collections;
import java.util.Map;
import org.junit.jupiter.api.Test;
class ConfigurableLogExporterTest {
class ConfigurableLogRecordExporterTest {
@Test
void configureLogExporters_spiExporter() {
void configureLogRecordExporters_spiExporter() {
ConfigProperties config =
DefaultConfigProperties.createForTest(
ImmutableMap.of("test.option", "true", "otel.logs.exporter", "testExporter"));
Map<String, LogExporter> exportersByName =
LogExporterConfiguration.configureLogExporters(
Map<String, LogRecordExporter> exportersByName =
LogRecordExporterConfiguration.configureLogRecordExporters(
config,
LogExporterConfiguration.class.getClassLoader(),
LogRecordExporterConfiguration.class.getClassLoader(),
MeterProvider.noop(),
(a, unused) -> a);
@ -37,19 +37,19 @@ class ConfigurableLogExporterTest {
.hasSize(1)
.containsKey("testExporter")
.extracting(map -> map.get("testExporter"))
.isInstanceOf(TestConfigurableLogExporterProvider.TestLogExporter.class)
.isInstanceOf(TestConfigurableLogRecordExporterProvider.TestLogRecordExporter.class)
.extracting("config")
.isSameAs(config);
}
@Test
void configureLogExporters_emptyClassLoader() {
void configureLogRecordExporters_emptyClassLoader() {
ConfigProperties config =
DefaultConfigProperties.createForTest(
ImmutableMap.of("test.option", "true", "otel.logs.exporter", "testExporter"));
assertThatThrownBy(
() ->
LogExporterConfiguration.configureLogExporters(
LogRecordExporterConfiguration.configureLogRecordExporters(
config,
new URLClassLoader(new URL[0], null),
MeterProvider.noop(),
@ -62,7 +62,7 @@ class ConfigurableLogExporterTest {
void configureExporter_NotFound() {
assertThatThrownBy(
() ->
LogExporterConfiguration.configureExporter(
LogRecordExporterConfiguration.configureExporter(
"catExporter",
DefaultConfigProperties.createForTest(Collections.emptyMap()),
NamedSpiManager.createEmpty(),

View File

@ -10,16 +10,16 @@ import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import java.util.Collection;
import java.util.stream.Collectors;
public class LogExporterCustomizer implements AutoConfigurationCustomizerProvider {
public class LogRecordExporterCustomizer implements AutoConfigurationCustomizerProvider {
@Override
public void customize(AutoConfigurationCustomizer autoConfiguration) {
autoConfiguration.addLogExporterCustomizer(
autoConfiguration.addLogRecordExporterCustomizer(
(delegate, config) ->
new LogExporter() {
new LogRecordExporter() {
@Override
public CompletableResultCode export(Collection<LogData> logs) {
Collection<LogData> filtered =

View File

@ -9,12 +9,12 @@ import static org.assertj.core.api.Assertions.assertThat;
import com.google.common.collect.ImmutableMap;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.exporter.logging.SystemOutLogExporter;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporter;
import io.opentelemetry.exporter.logging.SystemOutLogRecordExporter;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
import io.opentelemetry.sdk.logs.export.BatchLogProcessor;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.logs.export.SimpleLogProcessor;
import java.util.Collections;
import java.util.Map;
@ -68,8 +68,8 @@ class LoggerProviderConfigurationTest {
@Test
void configureSpanProcessors_multipleExportersWithLogging() {
LogExporter loggingExporter = SystemOutLogExporter.create();
LogExporter otlpExporter = OtlpGrpcLogExporter.builder().build();
LogRecordExporter loggingExporter = SystemOutLogRecordExporter.create();
LogRecordExporter otlpExporter = OtlpGrpcLogRecordExporter.builder().build();
assertThat(
LoggerProviderConfiguration.configureLogProcessors(

View File

@ -6,17 +6,18 @@
package io.opentelemetry.sdk.autoconfigure;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogExporterProvider;
import io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogRecordExporterProvider;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import java.util.Collection;
public class TestConfigurableLogExporterProvider implements ConfigurableLogExporterProvider {
public class TestConfigurableLogRecordExporterProvider
implements ConfigurableLogRecordExporterProvider {
@Override
public LogExporter createExporter(ConfigProperties config) {
return new TestLogExporter(config);
public LogRecordExporter createExporter(ConfigProperties config) {
return new TestLogRecordExporter(config);
}
@Override
@ -24,10 +25,10 @@ public class TestConfigurableLogExporterProvider implements ConfigurableLogExpor
return "testExporter";
}
public static class TestLogExporter implements LogExporter {
public static class TestLogRecordExporter implements LogRecordExporter {
private final ConfigProperties config;
public TestLogExporter(ConfigProperties config) {
public TestLogRecordExporter(ConfigProperties config) {
this.config = config;
}

View File

@ -6,12 +6,13 @@
package io.opentelemetry.sdk.autoconfigure;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogExporterProvider;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogRecordExporterProvider;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
public class ThrowingConfigurableLogExporterProvider implements ConfigurableLogExporterProvider {
public class ThrowingConfigurableLogRecordExporterProvider
implements ConfigurableLogRecordExporterProvider {
@Override
public LogExporter createExporter(ConfigProperties config) {
public LogRecordExporter createExporter(ConfigProperties config) {
throw new IllegalStateException("always throws");
}

View File

@ -1,3 +1,3 @@
io.opentelemetry.sdk.autoconfigure.SpanExporterCustomizer
io.opentelemetry.sdk.autoconfigure.MetricCustomizer
io.opentelemetry.sdk.autoconfigure.LogExporterCustomizer
io.opentelemetry.sdk.autoconfigure.LogRecordExporterCustomizer

View File

@ -1,2 +0,0 @@
io.opentelemetry.sdk.autoconfigure.TestConfigurableLogExporterProvider
io.opentelemetry.sdk.autoconfigure.ThrowingConfigurableLogExporterProvider

View File

@ -0,0 +1,2 @@
io.opentelemetry.sdk.autoconfigure.TestConfigurableLogRecordExporterProvider
io.opentelemetry.sdk.autoconfigure.ThrowingConfigurableLogRecordExporterProvider

View File

@ -21,7 +21,7 @@ import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.metrics.InstrumentType;
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
import io.opentelemetry.sdk.metrics.data.MetricData;
@ -81,8 +81,8 @@ class OtlpGrpcConfigTest {
"otlp", properties, NamedSpiManager.createEmpty(), MeterProvider.noop());
MetricExporter metricExporter =
MetricExporterConfiguration.configureOtlpMetrics(properties);
LogExporter logExporter =
LogExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop())) {
LogRecordExporter logRecordExporter =
LogRecordExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop())) {
assertThat(spanExporter)
.extracting("delegate.client.callTimeoutMillis", INTEGER)
.isEqualTo(TimeUnit.SECONDS.toMillis(15));
@ -111,10 +111,11 @@ class OtlpGrpcConfigTest {
&& headers.contains("header-key", "header-value")
&& headers.contains("grpc-encoding", "gzip"));
assertThat(logExporter)
assertThat(logRecordExporter)
.extracting("delegate.client.callTimeoutMillis", INTEGER)
.isEqualTo(TimeUnit.SECONDS.toMillis(15));
assertThat(logExporter.export(LOG_DATA).join(15, TimeUnit.SECONDS).isSuccess()).isTrue();
assertThat(logRecordExporter.export(LOG_DATA).join(15, TimeUnit.SECONDS).isSuccess())
.isTrue();
assertThat(server.logRequests).hasSize(1);
assertThat(server.requestHeaders)
.anyMatch(
@ -205,7 +206,7 @@ class OtlpGrpcConfigTest {
}
@Test
public void configureLogExporter() {
public void configureLogRecordExporter() {
// Set values for general and signal specific properties. Signal specific should override
// general.
Map<String, String> props = new HashMap<>();
@ -220,14 +221,15 @@ class OtlpGrpcConfigTest {
props.put("otel.exporter.otlp.logs.headers", "header-key=header-value");
props.put("otel.exporter.otlp.logs.compression", "gzip");
props.put("otel.exporter.otlp.logs.timeout", "15s");
try (LogExporter logExporter =
LogExporterConfiguration.configureOtlpLogs(
try (LogRecordExporter logRecordExporter =
LogRecordExporterConfiguration.configureOtlpLogs(
DefaultConfigProperties.createForTest(props), MeterProvider.noop())) {
assertThat(logExporter)
assertThat(logRecordExporter)
.extracting("delegate.client.callTimeoutMillis", INTEGER)
.isEqualTo(TimeUnit.SECONDS.toMillis(15));
assertThat(logExporter.export(LOG_DATA).join(15, TimeUnit.SECONDS).isSuccess()).isTrue();
assertThat(logRecordExporter.export(LOG_DATA).join(15, TimeUnit.SECONDS).isSuccess())
.isTrue();
assertThat(server.logRequests).hasSize(1);
assertThat(server.requestHeaders)
.anyMatch(
@ -257,7 +259,8 @@ class OtlpGrpcConfigTest {
.hasMessageContaining("Invalid OTLP certificate/key path:");
assertThatThrownBy(
() -> LogExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
() ->
LogRecordExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
.isInstanceOf(ConfigurationException.class)
.hasMessageContaining("Invalid OTLP certificate/key path:");
}
@ -280,7 +283,8 @@ class OtlpGrpcConfigTest {
.hasMessageContaining("Client key provided but certification chain is missing");
assertThatThrownBy(
() -> LogExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
() ->
LogRecordExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
.isInstanceOf(ConfigurationException.class)
.hasMessageContaining("Client key provided but certification chain is missing");
}
@ -303,7 +307,8 @@ class OtlpGrpcConfigTest {
.hasMessageContaining("Client key chain provided but key is missing");
assertThatThrownBy(
() -> LogExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
() ->
LogRecordExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
.isInstanceOf(ConfigurationException.class)
.hasMessageContaining("Client key chain provided but key is missing");
}

View File

@ -20,7 +20,7 @@ import io.opentelemetry.exporter.internal.retry.RetryUtil;
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.metrics.data.MetricData;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
import io.opentelemetry.sdk.trace.data.SpanData;
@ -92,18 +92,18 @@ class OtlpGrpcRetryTest {
@Test
@SuppressLogger(OkHttpGrpcExporter.class)
void configureLogExporterRetryPolicy() {
void configureLogRecordExporterRetryPolicy() {
Map<String, String> props = new HashMap<>();
props.put("otel.exporter.otlp.logs.endpoint", "https://localhost:" + server.httpsPort());
props.put(
"otel.exporter.otlp.logs.certificate", certificate.certificateFile().getAbsolutePath());
props.put("otel.experimental.exporter.otlp.retry.enabled", "true");
try (LogExporter logExporter =
LogExporterConfiguration.configureOtlpLogs(
try (LogRecordExporter logRecordExporter =
LogRecordExporterConfiguration.configureOtlpLogs(
DefaultConfigProperties.createForTest(props), MeterProvider.noop())) {
testRetryableStatusCodes(() -> LOG_DATA, logExporter::export, server.logRequests::size);
testDefaultRetryPolicy(() -> LOG_DATA, logExporter::export, server.logRequests::size);
testRetryableStatusCodes(() -> LOG_DATA, logRecordExporter::export, server.logRequests::size);
testDefaultRetryPolicy(() -> LOG_DATA, logRecordExporter::export, server.logRequests::size);
}
}

View File

@ -19,7 +19,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.metrics.InstrumentType;
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
@ -67,8 +67,8 @@ class OtlpHttpConfigTest {
SpanExporterConfiguration.configureExporter(
"otlp", properties, NamedSpiManager.createEmpty(), MeterProvider.noop());
MetricExporter metricExporter = MetricExporterConfiguration.configureOtlpMetrics(properties);
LogExporter logExporter =
LogExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop());
LogRecordExporter logRecordExporter =
LogRecordExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop());
assertThat(spanExporter)
.extracting("delegate.client", as(InstanceOfAssertFactories.type(OkHttpClient.class)))
@ -106,12 +106,12 @@ class OtlpHttpConfigTest {
&& headers.contains("header-key", "header-value")
&& headers.contains("content-encoding", "gzip"));
assertThat(logExporter)
assertThat(logRecordExporter)
.extracting("delegate.client", as(InstanceOfAssertFactories.type(OkHttpClient.class)))
.extracting(OkHttpClient::callTimeoutMillis)
.isEqualTo((int) TimeUnit.SECONDS.toMillis(15));
assertThat(
logExporter
logRecordExporter
.export(Lists.newArrayList(generateFakeLog()))
.join(15, TimeUnit.SECONDS)
.isSuccess())
@ -219,7 +219,7 @@ class OtlpHttpConfigTest {
}
@Test
public void configureLogExporter() {
public void configureLogRecordExporter() {
// Set values for general and signal specific properties. Signal specific should override
// general.
Map<String, String> props = new HashMap<>();
@ -238,16 +238,16 @@ class OtlpHttpConfigTest {
props.put("otel.exporter.otlp.logs.headers", "header-key=header-value");
props.put("otel.exporter.otlp.logs.compression", "gzip");
props.put("otel.exporter.otlp.logs.timeout", "15s");
LogExporter logExporter =
LogExporterConfiguration.configureOtlpLogs(
LogRecordExporter logRecordExporter =
LogRecordExporterConfiguration.configureOtlpLogs(
DefaultConfigProperties.createForTest(props), MeterProvider.noop());
assertThat(logExporter)
assertThat(logRecordExporter)
.extracting("delegate.client", as(InstanceOfAssertFactories.type(OkHttpClient.class)))
.extracting(OkHttpClient::callTimeoutMillis)
.isEqualTo((int) TimeUnit.SECONDS.toMillis(15));
assertThat(
logExporter
logRecordExporter
.export(Lists.newArrayList(generateFakeLog()))
.join(15, TimeUnit.SECONDS)
.isSuccess())
@ -279,7 +279,8 @@ class OtlpHttpConfigTest {
.hasMessageContaining("Invalid OTLP certificate/key path:");
assertThatThrownBy(
() -> LogExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
() ->
LogRecordExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
.isInstanceOf(ConfigurationException.class)
.hasMessageContaining("Invalid OTLP certificate/key path:");
}
@ -303,7 +304,8 @@ class OtlpHttpConfigTest {
.hasMessageContaining("Client key provided but certification chain is missing");
assertThatThrownBy(
() -> LogExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
() ->
LogRecordExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
.isInstanceOf(ConfigurationException.class)
.hasMessageContaining("Client key provided but certification chain is missing");
}
@ -327,7 +329,8 @@ class OtlpHttpConfigTest {
.hasMessageContaining("Client key chain provided but key is missing");
assertThatThrownBy(
() -> LogExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
() ->
LogRecordExporterConfiguration.configureOtlpLogs(properties, MeterProvider.noop()))
.isInstanceOf(ConfigurationException.class)
.hasMessageContaining("Client key chain provided but key is missing");
}

View File

@ -21,7 +21,7 @@ import io.opentelemetry.exporter.internal.retry.RetryUtil;
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
import io.opentelemetry.sdk.metrics.data.MetricData;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
import io.opentelemetry.sdk.trace.data.SpanData;
@ -95,7 +95,7 @@ class OtlpHttpRetryTest {
@Test
@SuppressLogger(OkHttpGrpcExporter.class)
void configureLogExporterRetryPolicy() {
void configureLogRecordExporterRetryPolicy() {
Map<String, String> props = new HashMap<>();
props.put("otel.exporter.otlp.logs.protocol", "http/protobuf");
props.put(
@ -104,12 +104,12 @@ class OtlpHttpRetryTest {
"otel.exporter.otlp.logs.certificate",
server.selfSignedCertificate.certificate().getPath());
props.put("otel.experimental.exporter.otlp.retry.enabled", "true");
try (LogExporter logExporter =
LogExporterConfiguration.configureOtlpLogs(
try (LogRecordExporter logRecordExporter =
LogRecordExporterConfiguration.configureOtlpLogs(
DefaultConfigProperties.createForTest(props), MeterProvider.noop())) {
testRetryableStatusCodes(() -> LOG_DATA, logExporter::export, server.logRequests::size);
testDefaultRetryPolicy(() -> LOG_DATA, logExporter::export, server.logRequests::size);
testRetryableStatusCodes(() -> LOG_DATA, logRecordExporter::export, server.logRequests::size);
testDefaultRetryPolicy(() -> LOG_DATA, logRecordExporter::export, server.logRequests::size);
}
}

View File

@ -52,16 +52,16 @@ public final class BatchLogProcessor implements LogProcessor {
/**
* Returns a new Builder for {@link BatchLogProcessor}.
*
* @param logExporter the {@link LogExporter} to which the Logs are pushed
* @param logRecordExporter the {@link LogRecordExporter} to which the Logs are pushed
* @return a new {@link BatchLogProcessorBuilder}.
* @throws NullPointerException if the {@code logExporter} is {@code null}.
* @throws NullPointerException if the {@code logRecordExporter} is {@code null}.
*/
public static BatchLogProcessorBuilder builder(LogExporter logExporter) {
return new BatchLogProcessorBuilder(logExporter);
public static BatchLogProcessorBuilder builder(LogRecordExporter logRecordExporter) {
return new BatchLogProcessorBuilder(logRecordExporter);
}
BatchLogProcessor(
LogExporter logExporter,
LogRecordExporter logRecordExporter,
MeterProvider meterProvider,
long scheduleDelayNanos,
int maxQueueSize,
@ -69,7 +69,7 @@ public final class BatchLogProcessor implements LogProcessor {
long exporterTimeoutNanos) {
this.worker =
new Worker(
logExporter,
logRecordExporter,
meterProvider,
scheduleDelayNanos,
maxExportBatchSize,
@ -105,7 +105,8 @@ public final class BatchLogProcessor implements LogProcessor {
return worker.batch;
}
// Worker is a thread that batches multiple logs and calls the registered LogExporter to export
// Worker is a thread that batches multiple logs and calls the registered LogRecordExporter to
// export
// the data.
private static final class Worker implements Runnable {
@ -115,7 +116,7 @@ public final class BatchLogProcessor implements LogProcessor {
private final Attributes droppedAttrs;
private final Attributes exportedAttrs;
private final LogExporter logExporter;
private final LogRecordExporter logRecordExporter;
private final long scheduleDelayNanos;
private final int maxExportBatchSize;
private final long exporterTimeoutNanos;
@ -136,13 +137,13 @@ public final class BatchLogProcessor implements LogProcessor {
private final ArrayList<LogData> batch;
private Worker(
LogExporter logExporter,
LogRecordExporter logRecordExporter,
MeterProvider meterProvider,
long scheduleDelayNanos,
int maxExportBatchSize,
long exporterTimeoutNanos,
Queue<ReadWriteLogRecord> queue) {
this.logExporter = logExporter;
this.logRecordExporter = logRecordExporter;
this.scheduleDelayNanos = scheduleDelayNanos;
this.maxExportBatchSize = maxExportBatchSize;
this.exporterTimeoutNanos = exporterTimeoutNanos;
@ -254,7 +255,7 @@ public final class BatchLogProcessor implements LogProcessor {
flushResult.whenComplete(
() -> {
continueWork = false;
CompletableResultCode shutdownResult = logExporter.shutdown();
CompletableResultCode shutdownResult = logRecordExporter.shutdown();
shutdownResult.whenComplete(
() -> {
if (!flushResult.isSuccess() || !shutdownResult.isSuccess()) {
@ -287,7 +288,8 @@ public final class BatchLogProcessor implements LogProcessor {
}
try {
CompletableResultCode result = logExporter.export(Collections.unmodifiableList(batch));
CompletableResultCode result =
logRecordExporter.export(Collections.unmodifiableList(batch));
result.join(exporterTimeoutNanos, TimeUnit.NANOSECONDS);
if (result.isSuccess()) {
processedLogsCounter.add(batch.size(), exportedAttrs);

View File

@ -24,15 +24,15 @@ public final class BatchLogProcessorBuilder {
// Visible for testing
static final int DEFAULT_EXPORT_TIMEOUT_MILLIS = 30_000;
private final LogExporter logExporter;
private final LogRecordExporter logRecordExporter;
private long scheduleDelayNanos = TimeUnit.MILLISECONDS.toNanos(DEFAULT_SCHEDULE_DELAY_MILLIS);
private int maxQueueSize = DEFAULT_MAX_QUEUE_SIZE;
private int maxExportBatchSize = DEFAULT_MAX_EXPORT_BATCH_SIZE;
private long exporterTimeoutNanos = TimeUnit.MILLISECONDS.toNanos(DEFAULT_EXPORT_TIMEOUT_MILLIS);
private MeterProvider meterProvider = MeterProvider.noop();
BatchLogProcessorBuilder(LogExporter logExporter) {
this.logExporter = requireNonNull(logExporter, "logExporter");
BatchLogProcessorBuilder(LogRecordExporter logRecordExporter) {
this.logRecordExporter = requireNonNull(logRecordExporter, "logRecordExporter");
}
/**
@ -139,13 +139,13 @@ public final class BatchLogProcessorBuilder {
/**
* Returns a new {@link BatchLogProcessor} that batches, then forwards them to the given {@code
* logExporter}.
* logRecordExporter}.
*
* @return a new {@link BatchLogProcessor}.
*/
public BatchLogProcessor build() {
return new BatchLogProcessor(
logExporter,
logRecordExporter,
meterProvider,
scheduleDelayNanos,
maxQueueSize,

View File

@ -14,20 +14,22 @@ import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
/** A {@link LogExporter} implementation that can be used to test OpenTelemetry integration. */
public final class InMemoryLogExporter implements LogExporter {
/**
* A {@link LogRecordExporter} implementation that can be used to test OpenTelemetry integration.
*/
public final class InMemoryLogRecordExporter implements LogRecordExporter {
private final Queue<LogData> finishedLogItems = new ConcurrentLinkedQueue<>();
private boolean isStopped = false;
private InMemoryLogExporter() {}
private InMemoryLogRecordExporter() {}
/**
* Returns a new instance of the {@code InMemoryLogExporter}.
* Returns a new instance of the {@link InMemoryLogRecordExporter}.
*
* @return a new instance of the {@code InMemoryLogExporter}.
* @return a new instance of the {@link InMemoryLogRecordExporter}.
*/
public static InMemoryLogExporter create() {
return new InMemoryLogExporter();
public static InMemoryLogRecordExporter create() {
return new InMemoryLogRecordExporter();
}
/**
@ -70,7 +72,7 @@ public final class InMemoryLogExporter implements LogExporter {
/**
* Clears the internal {@code List} of finished {@code Log}s.
*
* <p>Any subsequent call to export() function on this LogExporter, will return {@code
* <p>Any subsequent call to export() function on this exporter, will return {@code
* CompletableResultCode.ofFailure()}
*/
@Override

View File

@ -20,36 +20,38 @@ import java.util.concurrent.TimeUnit;
* An exporter is responsible for taking a collection of {@link LogData}s and transmitting them to
* their ultimate destination.
*/
public interface LogExporter extends Closeable {
public interface LogRecordExporter extends Closeable {
/**
* Returns a {@link LogExporter} which delegates all exports to the {@code exporters} in order.
* Returns a {@link LogRecordExporter} which delegates all exports to the {@code exporters} in
* order.
*
* <p>Can be used to export to multiple backends using the same {@link LogProcessor} like a {@link
* SimpleLogProcessor} or a {@link BatchLogProcessor}.
*/
static LogExporter composite(LogExporter... exporters) {
static LogRecordExporter composite(LogRecordExporter... exporters) {
return composite(Arrays.asList(exporters));
}
/**
* Returns a {@link LogExporter} which delegates all exports to the {@code exporters} in order.
* Returns a {@link LogRecordExporter} which delegates all exports to the {@code exporters} in
* order.
*
* <p>Can be used to export to multiple backends using the same {@link LogProcessor} like a {@link
* SimpleLogProcessor} or a {@link BatchLogProcessor}.
*/
static LogExporter composite(Iterable<LogExporter> exporters) {
List<LogExporter> exportersList = new ArrayList<>();
for (LogExporter exporter : exporters) {
static LogRecordExporter composite(Iterable<LogRecordExporter> exporters) {
List<LogRecordExporter> exportersList = new ArrayList<>();
for (LogRecordExporter exporter : exporters) {
exportersList.add(exporter);
}
if (exportersList.isEmpty()) {
return NoopLogExporter.getInstance();
return NoopLogRecordExporter.getInstance();
}
if (exportersList.size() == 1) {
return exportersList.get(0);
}
return MultiLogExporter.create(exportersList);
return MultiLogRecordExporter.create(exportersList);
}
/**
@ -76,7 +78,7 @@ public interface LogExporter extends Closeable {
*/
CompletableResultCode shutdown();
/** Closes this {@link LogExporter}, releasing any resources. */
/** Closes this {@link LogRecordExporter}, releasing any resources. */
@Override
default void close() {
shutdown().join(10, TimeUnit.SECONDS);

View File

@ -14,33 +14,33 @@ import java.util.logging.Level;
import java.util.logging.Logger;
/**
* {@link LogExporter} that forwards all received logs to a list of {@link LogExporter}.
* {@link LogRecordExporter} that forwards all received logs to a list of {@link LogRecordExporter}.
*
* <p>Can be used to export to multiple backends using the same {@link LogExporter} like a {@link
* SimpleLogProcessor} or a {@link BatchLogProcessor}.
* <p>Can be used to export to multiple backends using the same {@link LogRecordExporter} like a
* {@link SimpleLogProcessor} or a {@link BatchLogProcessor}.
*/
final class MultiLogExporter implements LogExporter {
private static final Logger logger = Logger.getLogger(MultiLogExporter.class.getName());
final class MultiLogRecordExporter implements LogRecordExporter {
private static final Logger logger = Logger.getLogger(MultiLogRecordExporter.class.getName());
private final LogExporter[] logExporters;
private final LogRecordExporter[] logRecordExporters;
/**
* Constructs and returns an instance of this class.
*
* @param logExporters the exporters logs should be sent to
* @param logRecordExporters the exporters logs should be sent to
* @return the aggregate log exporter
*/
static LogExporter create(List<LogExporter> logExporters) {
return new MultiLogExporter(logExporters.toArray(new LogExporter[0]));
static LogRecordExporter create(List<LogRecordExporter> logRecordExporters) {
return new MultiLogRecordExporter(logRecordExporters.toArray(new LogRecordExporter[0]));
}
@Override
public CompletableResultCode export(Collection<LogData> logs) {
List<CompletableResultCode> results = new ArrayList<>(logExporters.length);
for (LogExporter logExporter : logExporters) {
List<CompletableResultCode> results = new ArrayList<>(logRecordExporters.length);
for (LogRecordExporter logRecordExporter : logRecordExporters) {
CompletableResultCode exportResult;
try {
exportResult = logExporter.export(logs);
exportResult = logRecordExporter.export(logs);
} catch (RuntimeException e) {
// If an exception was thrown by the exporter
logger.log(Level.WARNING, "Exception thrown by the export.", e);
@ -53,17 +53,17 @@ final class MultiLogExporter implements LogExporter {
}
/**
* Flushes the data of all registered {@link LogExporter}s.
* Flushes the data of all registered {@link LogRecordExporter}s.
*
* @return the result of the operation
*/
@Override
public CompletableResultCode flush() {
List<CompletableResultCode> results = new ArrayList<>(logExporters.length);
for (LogExporter logExporter : logExporters) {
List<CompletableResultCode> results = new ArrayList<>(logRecordExporters.length);
for (LogRecordExporter logRecordExporter : logRecordExporters) {
CompletableResultCode flushResult;
try {
flushResult = logExporter.flush();
flushResult = logRecordExporter.flush();
} catch (RuntimeException e) {
// If an exception was thrown by the exporter
logger.log(Level.WARNING, "Exception thrown by the flush.", e);
@ -77,11 +77,11 @@ final class MultiLogExporter implements LogExporter {
@Override
public CompletableResultCode shutdown() {
List<CompletableResultCode> results = new ArrayList<>(logExporters.length);
for (LogExporter logExporter : logExporters) {
List<CompletableResultCode> results = new ArrayList<>(logRecordExporters.length);
for (LogRecordExporter logRecordExporter : logRecordExporters) {
CompletableResultCode shutdownResult;
try {
shutdownResult = logExporter.shutdown();
shutdownResult = logRecordExporter.shutdown();
} catch (RuntimeException e) {
// If an exception was thrown by the exporter
logger.log(Level.WARNING, "Exception thrown by the shutdown.", e);
@ -93,7 +93,7 @@ final class MultiLogExporter implements LogExporter {
return CompletableResultCode.ofAll(results);
}
private MultiLogExporter(LogExporter[] logExporters) {
this.logExporters = logExporters;
private MultiLogRecordExporter(LogRecordExporter[] logRecordExporters) {
this.logRecordExporters = logRecordExporters;
}
}

View File

@ -9,11 +9,11 @@ import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import java.util.Collection;
final class NoopLogExporter implements LogExporter {
final class NoopLogRecordExporter implements LogRecordExporter {
private static final LogExporter INSTANCE = new NoopLogExporter();
private static final LogRecordExporter INSTANCE = new NoopLogRecordExporter();
static LogExporter getInstance() {
static LogRecordExporter getInstance() {
return INSTANCE;
}

View File

@ -33,13 +33,13 @@ public final class SimpleLogProcessor implements LogProcessor {
private static final Logger logger = Logger.getLogger(SimpleLogProcessor.class.getName());
private final LogExporter logExporter;
private final LogRecordExporter logRecordExporter;
private final Set<CompletableResultCode> pendingExports =
Collections.newSetFromMap(new ConcurrentHashMap<>());
private final AtomicBoolean isShutdown = new AtomicBoolean(false);
/**
* Returns a new {@link SimpleLogProcessor} which exports logs to the {@link LogExporter}
* Returns a new {@link SimpleLogProcessor} which exports logs to the {@link LogRecordExporter}
* synchronously.
*
* <p>This processor will cause all logs to be exported directly as they finish, meaning each
@ -48,20 +48,20 @@ public final class SimpleLogProcessor implements LogProcessor {
* BatchLogProcessor} instead, including in special environments such as serverless runtimes.
* {@link SimpleLogProcessor} is generally meant to for testing only.
*/
public static LogProcessor create(LogExporter exporter) {
public static LogProcessor create(LogRecordExporter exporter) {
requireNonNull(exporter, "exporter");
return new SimpleLogProcessor(exporter);
}
SimpleLogProcessor(LogExporter logExporter) {
this.logExporter = requireNonNull(logExporter, "logExporter");
SimpleLogProcessor(LogRecordExporter logRecordExporter) {
this.logRecordExporter = requireNonNull(logRecordExporter, "logRecordExporter");
}
@Override
public void onEmit(ReadWriteLogRecord logRecord) {
try {
List<LogData> logs = Collections.singletonList(logRecord.toLogData());
CompletableResultCode result = logExporter.export(logs);
CompletableResultCode result = logRecordExporter.export(logs);
pendingExports.add(result);
result.whenComplete(
() -> {
@ -85,7 +85,7 @@ public final class SimpleLogProcessor implements LogProcessor {
CompletableResultCode flushResult = forceFlush();
flushResult.whenComplete(
() -> {
CompletableResultCode shutdownResult = logExporter.shutdown();
CompletableResultCode shutdownResult = logRecordExporter.shutdown();
shutdownResult.whenComplete(
() -> {
if (!flushResult.isSuccess() || !shutdownResult.isSuccess()) {

View File

@ -47,11 +47,11 @@ class BatchLogProcessorTest {
private static final String LOG_MESSAGE_2 = "Hello world 2!";
private static final long MAX_SCHEDULE_DELAY_MILLIS = 500;
@Mock private LogExporter mockLogExporter;
@Mock private LogRecordExporter mockLogRecordExporter;
@BeforeEach
void setUp() {
when(mockLogExporter.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
when(mockLogRecordExporter.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
}
private void emitLog(SdkLoggerProvider sdkLoggerProvider, String message) {
@ -65,7 +65,7 @@ class BatchLogProcessorTest {
@Test
void builderDefaults() {
BatchLogProcessorBuilder builder = BatchLogProcessor.builder(mockLogExporter);
BatchLogProcessorBuilder builder = BatchLogProcessor.builder(mockLogRecordExporter);
assertThat(builder.getScheduleDelayNanos())
.isEqualTo(
TimeUnit.MILLISECONDS.toNanos(BatchLogProcessorBuilder.DEFAULT_SCHEDULE_DELAY_MILLIS));
@ -82,45 +82,49 @@ class BatchLogProcessorTest {
void builderInvalidConfig() {
assertThatThrownBy(
() ->
BatchLogProcessor.builder(mockLogExporter)
BatchLogProcessor.builder(mockLogRecordExporter)
.setScheduleDelay(-1, TimeUnit.MILLISECONDS))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("delay must be non-negative");
assertThatThrownBy(() -> BatchLogProcessor.builder(mockLogExporter).setScheduleDelay(1, null))
assertThatThrownBy(
() -> BatchLogProcessor.builder(mockLogRecordExporter).setScheduleDelay(1, null))
.isInstanceOf(NullPointerException.class)
.hasMessage("unit");
assertThatThrownBy(() -> BatchLogProcessor.builder(mockLogExporter).setScheduleDelay(null))
assertThatThrownBy(
() -> BatchLogProcessor.builder(mockLogRecordExporter).setScheduleDelay(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("delay");
assertThatThrownBy(
() ->
BatchLogProcessor.builder(mockLogExporter)
BatchLogProcessor.builder(mockLogRecordExporter)
.setExporterTimeout(-1, TimeUnit.MILLISECONDS))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("timeout must be non-negative");
assertThatThrownBy(() -> BatchLogProcessor.builder(mockLogExporter).setExporterTimeout(1, null))
assertThatThrownBy(
() -> BatchLogProcessor.builder(mockLogRecordExporter).setExporterTimeout(1, null))
.isInstanceOf(NullPointerException.class)
.hasMessage("unit");
assertThatThrownBy(() -> BatchLogProcessor.builder(mockLogExporter).setExporterTimeout(null))
assertThatThrownBy(
() -> BatchLogProcessor.builder(mockLogRecordExporter).setExporterTimeout(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("timeout");
}
@Test
void emitMultipleLogs() {
WaitingLogExporter waitingLogExporter =
new WaitingLogExporter(2, CompletableResultCode.ofSuccess());
WaitingLogRecordExporter waitingLogRecordExporter =
new WaitingLogRecordExporter(2, CompletableResultCode.ofSuccess());
SdkLoggerProvider loggerProvider =
SdkLoggerProvider.builder()
.addLogProcessor(
BatchLogProcessor.builder(waitingLogExporter)
BatchLogProcessor.builder(waitingLogRecordExporter)
.setScheduleDelay(MAX_SCHEDULE_DELAY_MILLIS, TimeUnit.MILLISECONDS)
.build())
.build();
emitLog(loggerProvider, LOG_MESSAGE_1);
emitLog(loggerProvider, LOG_MESSAGE_2);
List<LogData> exported = waitingLogExporter.waitForExport();
List<LogData> exported = waitingLogRecordExporter.waitForExport();
assertThat(exported)
.satisfiesExactly(
logData -> assertThat(logData).hasBody(LOG_MESSAGE_1),
@ -129,12 +133,12 @@ class BatchLogProcessorTest {
@Test
void emitMoreLogsThanBufferSize() {
CompletableLogExporter logExporter = new CompletableLogExporter();
CompletableLogRecordExporter logRecordExporter = new CompletableLogRecordExporter();
SdkLoggerProvider sdkLoggerProvider =
SdkLoggerProvider.builder()
.addLogProcessor(
BatchLogProcessor.builder(logExporter)
BatchLogProcessor.builder(logRecordExporter)
.setMaxQueueSize(6)
.setMaxExportBatchSize(2)
.setScheduleDelay(MAX_SCHEDULE_DELAY_MILLIS, TimeUnit.MILLISECONDS)
@ -148,22 +152,22 @@ class BatchLogProcessorTest {
emitLog(sdkLoggerProvider, LOG_MESSAGE_1);
emitLog(sdkLoggerProvider, LOG_MESSAGE_1);
logExporter.succeed();
logRecordExporter.succeed();
await()
.untilAsserted(
() ->
assertThat(logExporter.getExported())
assertThat(logRecordExporter.getExported())
.hasSize(6)
.allSatisfy(logData -> assertThat(logData).hasBody(LOG_MESSAGE_1)));
}
@Test
void forceEmit() {
WaitingLogExporter waitingLogExporter =
new WaitingLogExporter(100, CompletableResultCode.ofSuccess(), 1);
WaitingLogRecordExporter waitingLogRecordExporter =
new WaitingLogRecordExporter(100, CompletableResultCode.ofSuccess(), 1);
BatchLogProcessor batchLogProcessor =
BatchLogProcessor.builder(waitingLogExporter)
BatchLogProcessor.builder(waitingLogRecordExporter)
.setMaxQueueSize(10_000)
// Force flush should send all logs, make sure the number of logs we check here is
// not divisible by the batch size.
@ -176,43 +180,43 @@ class BatchLogProcessorTest {
for (int i = 0; i < 50; i++) {
emitLog(sdkLoggerProvider, "notExported");
}
List<LogData> exported = waitingLogExporter.waitForExport();
List<LogData> exported = waitingLogRecordExporter.waitForExport();
assertThat(exported).isNotNull();
assertThat(exported.size()).isEqualTo(49);
for (int i = 0; i < 50; i++) {
emitLog(sdkLoggerProvider, "notExported");
}
exported = waitingLogExporter.waitForExport();
exported = waitingLogRecordExporter.waitForExport();
assertThat(exported).isNotNull();
assertThat(exported.size()).isEqualTo(49);
batchLogProcessor.forceFlush().join(10, TimeUnit.SECONDS);
exported = waitingLogExporter.getExported();
exported = waitingLogRecordExporter.getExported();
assertThat(exported).isNotNull();
assertThat(exported.size()).isEqualTo(2);
}
@Test
void emitLogsToMultipleExporters() {
WaitingLogExporter waitingLogExporter1 =
new WaitingLogExporter(2, CompletableResultCode.ofSuccess());
WaitingLogExporter waitingLogExporter2 =
new WaitingLogExporter(2, CompletableResultCode.ofSuccess());
WaitingLogRecordExporter waitingLogRecordExporter1 =
new WaitingLogRecordExporter(2, CompletableResultCode.ofSuccess());
WaitingLogRecordExporter waitingLogRecordExporter2 =
new WaitingLogRecordExporter(2, CompletableResultCode.ofSuccess());
SdkLoggerProvider sdkLoggerProvider =
SdkLoggerProvider.builder()
.addLogProcessor(
BatchLogProcessor.builder(
LogExporter.composite(
Arrays.asList(waitingLogExporter1, waitingLogExporter2)))
LogRecordExporter.composite(
Arrays.asList(waitingLogRecordExporter1, waitingLogRecordExporter2)))
.setScheduleDelay(MAX_SCHEDULE_DELAY_MILLIS, TimeUnit.MILLISECONDS)
.build())
.build();
emitLog(sdkLoggerProvider, LOG_MESSAGE_1);
emitLog(sdkLoggerProvider, LOG_MESSAGE_2);
List<LogData> exported1 = waitingLogExporter1.waitForExport();
List<LogData> exported2 = waitingLogExporter2.waitForExport();
List<LogData> exported1 = waitingLogRecordExporter1.waitForExport();
List<LogData> exported2 = waitingLogRecordExporter2.waitForExport();
assertThat(exported1)
.hasSize(2)
.satisfiesExactly(
@ -228,15 +232,15 @@ class BatchLogProcessorTest {
@Test
void emitMoreLogsThanTheMaximumLimit() {
int maxQueuedLogs = 8;
BlockingLogExporter blockingLogExporter = new BlockingLogExporter();
WaitingLogExporter waitingLogExporter =
new WaitingLogExporter(maxQueuedLogs, CompletableResultCode.ofSuccess());
BlockingLogRecordExporter blockingLogRecordExporter = new BlockingLogRecordExporter();
WaitingLogRecordExporter waitingLogRecordExporter =
new WaitingLogRecordExporter(maxQueuedLogs, CompletableResultCode.ofSuccess());
SdkLoggerProvider sdkTracerProvider =
SdkLoggerProvider.builder()
.addLogProcessor(
BatchLogProcessor.builder(
LogExporter.composite(
Arrays.asList(blockingLogExporter, waitingLogExporter)))
LogRecordExporter.composite(
Arrays.asList(blockingLogRecordExporter, waitingLogRecordExporter)))
.setScheduleDelay(MAX_SCHEDULE_DELAY_MILLIS, TimeUnit.MILLISECONDS)
.setMaxQueueSize(maxQueuedLogs)
.setMaxExportBatchSize(maxQueuedLogs / 2)
@ -247,7 +251,7 @@ class BatchLogProcessorTest {
// can be removed from the queue. Need to add a log to trigger the export otherwise the
// pipeline is never called.
emitLog(sdkTracerProvider, "blocking log");
blockingLogExporter.waitUntilIsBlocked();
blockingLogRecordExporter.waitUntilIsBlocked();
for (int i = 0; i < maxQueuedLogs; i++) {
// First export maxQueuedLogs, the worker thread is blocked so all items should be queued.
@ -260,28 +264,28 @@ class BatchLogProcessorTest {
}
// Release the blocking exporter
blockingLogExporter.unblock();
blockingLogRecordExporter.unblock();
// While we wait for maxQueuedLogs we ensure that the queue is also empty after this.
List<LogData> exported = waitingLogExporter.waitForExport();
List<LogData> exported = waitingLogRecordExporter.waitForExport();
assertThat(exported).isNotNull();
assertThat(exported).hasSize(maxQueuedLogs + 1);
// Clear, reset, add another batch of logs, and confirm they are exported
exported.clear();
waitingLogExporter.reset();
waitingLogRecordExporter.reset();
for (int i = 0; i < maxQueuedLogs; i++) {
emitLog(sdkTracerProvider, "log_3_" + i);
}
exported = waitingLogExporter.waitForExport();
exported = waitingLogRecordExporter.waitForExport();
assertThat(exported).isNotNull();
assertThat(exported).hasSize(maxQueuedLogs);
}
@Test
void ignoresNullLogs() {
BatchLogProcessor processor = BatchLogProcessor.builder(mockLogExporter).build();
BatchLogProcessor processor = BatchLogProcessor.builder(mockLogRecordExporter).build();
try {
assertThatCode(() -> processor.onEmit(null)).doesNotThrowAnyException();
} finally {
@ -290,29 +294,30 @@ class BatchLogProcessorTest {
}
@Test
@SuppressLogger(MultiLogExporter.class)
@SuppressLogger(MultiLogRecordExporter.class)
void exporterThrowsException() {
WaitingLogExporter waitingLogExporter =
new WaitingLogExporter(1, CompletableResultCode.ofSuccess());
WaitingLogRecordExporter waitingLogRecordExporter =
new WaitingLogRecordExporter(1, CompletableResultCode.ofSuccess());
doThrow(new IllegalArgumentException("No export for you."))
.when(mockLogExporter)
.when(mockLogRecordExporter)
.export(anyList());
SdkLoggerProvider sdkLoggerProvider =
SdkLoggerProvider.builder()
.addLogProcessor(
BatchLogProcessor.builder(
LogExporter.composite(Arrays.asList(mockLogExporter, waitingLogExporter)))
LogRecordExporter.composite(
Arrays.asList(mockLogRecordExporter, waitingLogRecordExporter)))
.setScheduleDelay(MAX_SCHEDULE_DELAY_MILLIS, TimeUnit.MILLISECONDS)
.build())
.build();
emitLog(sdkLoggerProvider, LOG_MESSAGE_1);
List<LogData> exported = waitingLogExporter.waitForExport();
List<LogData> exported = waitingLogRecordExporter.waitForExport();
assertThat(exported).satisfiesExactly(logData -> assertThat(logData).hasBody(LOG_MESSAGE_1));
waitingLogExporter.reset();
waitingLogRecordExporter.reset();
// Continue to export after the exception was received.
emitLog(sdkLoggerProvider, LOG_MESSAGE_2);
exported = waitingLogExporter.waitForExport();
exported = waitingLogRecordExporter.waitForExport();
assertThat(exported).satisfiesExactly(logData -> assertThat(logData).hasBody(LOG_MESSAGE_2));
}
@ -321,7 +326,7 @@ class BatchLogProcessorTest {
public void continuesIfExporterTimesOut() throws InterruptedException {
int exporterTimeoutMillis = 10;
BatchLogProcessor blp =
BatchLogProcessor.builder(mockLogExporter)
BatchLogProcessor.builder(mockLogRecordExporter)
.setExporterTimeout(exporterTimeoutMillis, TimeUnit.MILLISECONDS)
.setScheduleDelay(1, TimeUnit.MILLISECONDS)
.setMaxQueueSize(1)
@ -330,7 +335,7 @@ class BatchLogProcessorTest {
CountDownLatch exported = new CountDownLatch(1);
// We return a result we never complete, meaning it will timeout.
when(mockLogExporter.export(
when(mockLogRecordExporter.export(
argThat(
logs -> {
assertThat(logs)
@ -346,9 +351,9 @@ class BatchLogProcessorTest {
// Still processing new logs.
CountDownLatch exportedAgain = new CountDownLatch(1);
reset(mockLogExporter);
when(mockLogExporter.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
when(mockLogExporter.export(
reset(mockLogRecordExporter);
when(mockLogRecordExporter.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
when(mockLogRecordExporter.export(
argThat(
logs -> {
assertThat(logs)
@ -365,14 +370,14 @@ class BatchLogProcessorTest {
@Test
@Timeout(10)
void shutdownFlushes() {
WaitingLogExporter waitingLogExporter =
new WaitingLogExporter(1, CompletableResultCode.ofSuccess());
WaitingLogRecordExporter waitingLogRecordExporter =
new WaitingLogRecordExporter(1, CompletableResultCode.ofSuccess());
// Set the export delay to large value, in order to confirm the #flush() below works
SdkLoggerProvider sdkLoggerProvider =
SdkLoggerProvider.builder()
.addLogProcessor(
BatchLogProcessor.builder(waitingLogExporter)
BatchLogProcessor.builder(waitingLogRecordExporter)
.setScheduleDelay(10, TimeUnit.SECONDS)
.build())
.build();
@ -382,14 +387,14 @@ class BatchLogProcessorTest {
// Force a shutdown, which forces processing of all remaining logs.
sdkLoggerProvider.shutdown().join(10, TimeUnit.SECONDS);
List<LogData> exported = waitingLogExporter.getExported();
List<LogData> exported = waitingLogRecordExporter.getExported();
assertThat(exported).satisfiesExactly(logData -> assertThat(logData).hasBody(LOG_MESSAGE_2));
assertThat(waitingLogExporter.shutDownCalled.get()).isTrue();
assertThat(waitingLogRecordExporter.shutDownCalled.get()).isTrue();
}
@Test
void shutdownPropagatesSuccess() {
BatchLogProcessor processor = BatchLogProcessor.builder(mockLogExporter).build();
BatchLogProcessor processor = BatchLogProcessor.builder(mockLogRecordExporter).build();
CompletableResultCode result = processor.shutdown();
result.join(1, TimeUnit.SECONDS);
assertThat(result.isSuccess()).isTrue();
@ -397,14 +402,14 @@ class BatchLogProcessorTest {
@Test
void shutdownPropagatesFailure() {
when(mockLogExporter.shutdown()).thenReturn(CompletableResultCode.ofFailure());
BatchLogProcessor processor = BatchLogProcessor.builder(mockLogExporter).build();
when(mockLogRecordExporter.shutdown()).thenReturn(CompletableResultCode.ofFailure());
BatchLogProcessor processor = BatchLogProcessor.builder(mockLogRecordExporter).build();
CompletableResultCode result = processor.shutdown();
result.join(1, TimeUnit.SECONDS);
assertThat(result.isSuccess()).isFalse();
}
private static final class BlockingLogExporter implements LogExporter {
private static final class BlockingLogRecordExporter implements LogRecordExporter {
final Object monitor = new Object();
@ -465,7 +470,7 @@ class BatchLogProcessorTest {
}
}
private static class CompletableLogExporter implements LogExporter {
private static class CompletableLogRecordExporter implements LogRecordExporter {
private final List<CompletableResultCode> results = new ArrayList<>();
@ -508,7 +513,7 @@ class BatchLogProcessorTest {
}
}
static class WaitingLogExporter implements LogExporter {
static class WaitingLogRecordExporter implements LogRecordExporter {
private final List<LogData> logDataList = new ArrayList<>();
private final int numberToWaitFor;
@ -517,13 +522,14 @@ class BatchLogProcessorTest {
private int timeout = 10;
private final AtomicBoolean shutDownCalled = new AtomicBoolean(false);
WaitingLogExporter(int numberToWaitFor, CompletableResultCode exportResultCode) {
WaitingLogRecordExporter(int numberToWaitFor, CompletableResultCode exportResultCode) {
countDownLatch = new CountDownLatch(numberToWaitFor);
this.numberToWaitFor = numberToWaitFor;
this.exportResultCode = exportResultCode;
}
WaitingLogExporter(int numberToWaitFor, CompletableResultCode exportResultCode, int timeout) {
WaitingLogRecordExporter(
int numberToWaitFor, CompletableResultCode exportResultCode, int timeout) {
this(numberToWaitFor, exportResultCode);
this.timeout = timeout;
}

View File

@ -19,9 +19,9 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link InMemoryLogExporter}. */
class InMemoryLogExporterTest {
private final InMemoryLogExporter exporter = InMemoryLogExporter.create();
/** Unit tests for {@link InMemoryLogRecordExporter}. */
class InMemoryLogRecordExporterTest {
private final InMemoryLogRecordExporter exporter = InMemoryLogRecordExporter.create();
private SdkLoggerProvider loggerProvider;
private Logger logger;

View File

@ -1,133 +0,0 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.logs.export;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class MultiLogExporterTest {
@Mock private LogExporter logExporter1;
@Mock private LogExporter logExporter2;
private static final List<LogData> LOG_LIST =
Collections.singletonList(
TestLogData.builder().setBody("Message!").setSeverity(Severity.DEBUG).build());
@Test
void empty() {
LogExporter multiLogExporter = LogExporter.composite(Collections.emptyList());
multiLogExporter.export(LOG_LIST);
multiLogExporter.shutdown();
}
@Test
void oneLogExporter() {
LogExporter multiLogExporter = LogExporter.composite(Collections.singletonList(logExporter1));
when(logExporter1.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogExporter.export(LOG_LIST).isSuccess()).isTrue();
verify(logExporter1).export(same(LOG_LIST));
when(logExporter1.flush()).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogExporter.flush().isSuccess()).isTrue();
verify(logExporter1).flush();
when(logExporter1.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
multiLogExporter.shutdown();
verify(logExporter1).shutdown();
}
@Test
void twoLogExporter() {
LogExporter multiLogExporter = LogExporter.composite(Arrays.asList(logExporter1, logExporter2));
when(logExporter1.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofSuccess());
when(logExporter2.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogExporter.export(LOG_LIST).isSuccess()).isTrue();
verify(logExporter1).export(same(LOG_LIST));
verify(logExporter2).export(same(LOG_LIST));
when(logExporter1.flush()).thenReturn(CompletableResultCode.ofSuccess());
when(logExporter2.flush()).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogExporter.flush().isSuccess()).isTrue();
verify(logExporter1).flush();
verify(logExporter2).flush();
when(logExporter1.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
when(logExporter2.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
multiLogExporter.shutdown();
verify(logExporter1).shutdown();
verify(logExporter2).shutdown();
}
@Test
void twoLogExporter_OneReturnFailure() {
LogExporter multiLogExporter = LogExporter.composite(Arrays.asList(logExporter1, logExporter2));
when(logExporter1.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofSuccess());
when(logExporter2.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofFailure());
assertThat(multiLogExporter.export(LOG_LIST).isSuccess()).isFalse();
verify(logExporter1).export(same(LOG_LIST));
verify(logExporter2).export(same(LOG_LIST));
when(logExporter1.flush()).thenReturn(CompletableResultCode.ofSuccess());
when(logExporter2.flush()).thenReturn(CompletableResultCode.ofFailure());
assertThat(multiLogExporter.flush().isSuccess()).isFalse();
verify(logExporter1).flush();
verify(logExporter2).flush();
when(logExporter1.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
when(logExporter2.shutdown()).thenReturn(CompletableResultCode.ofFailure());
assertThat(multiLogExporter.shutdown().isSuccess()).isFalse();
verify(logExporter1).shutdown();
verify(logExporter2).shutdown();
}
@Test
@SuppressLogger(MultiLogExporter.class)
void twoLogExporter_FirstThrows() {
LogExporter multiLogExporter = LogExporter.composite(Arrays.asList(logExporter1, logExporter2));
Mockito.doThrow(new IllegalArgumentException("No export for you."))
.when(logExporter1)
.export(ArgumentMatchers.anyList());
when(logExporter2.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogExporter.export(LOG_LIST).isSuccess()).isFalse();
verify(logExporter1).export(same(LOG_LIST));
verify(logExporter2).export(same(LOG_LIST));
Mockito.doThrow(new IllegalArgumentException("No flush for you.")).when(logExporter1).flush();
when(logExporter2.flush()).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogExporter.flush().isSuccess()).isFalse();
verify(logExporter1).flush();
verify(logExporter2).flush();
Mockito.doThrow(new IllegalArgumentException("No shutdown for you."))
.when(logExporter1)
.shutdown();
when(logExporter2.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogExporter.shutdown().isSuccess()).isFalse();
verify(logExporter1).shutdown();
verify(logExporter2).shutdown();
}
}

View File

@ -0,0 +1,139 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.logs.export;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class MultiLogRecordExporterTest {
@Mock private LogRecordExporter logRecordExporter1;
@Mock private LogRecordExporter logRecordExporter2;
private static final List<LogData> LOG_LIST =
Collections.singletonList(
TestLogData.builder().setBody("Message!").setSeverity(Severity.DEBUG).build());
@Test
void empty() {
LogRecordExporter multiLogRecordExporter = LogRecordExporter.composite(Collections.emptyList());
multiLogRecordExporter.export(LOG_LIST);
multiLogRecordExporter.shutdown();
}
@Test
void oneLogRecordExporter() {
LogRecordExporter multiLogRecordExporter =
LogRecordExporter.composite(Collections.singletonList(logRecordExporter1));
when(logRecordExporter1.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogRecordExporter.export(LOG_LIST).isSuccess()).isTrue();
verify(logRecordExporter1).export(same(LOG_LIST));
when(logRecordExporter1.flush()).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogRecordExporter.flush().isSuccess()).isTrue();
verify(logRecordExporter1).flush();
when(logRecordExporter1.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
multiLogRecordExporter.shutdown();
verify(logRecordExporter1).shutdown();
}
@Test
void twoLogRecordExporter() {
LogRecordExporter multiLogRecordExporter =
LogRecordExporter.composite(Arrays.asList(logRecordExporter1, logRecordExporter2));
when(logRecordExporter1.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofSuccess());
when(logRecordExporter2.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogRecordExporter.export(LOG_LIST).isSuccess()).isTrue();
verify(logRecordExporter1).export(same(LOG_LIST));
verify(logRecordExporter2).export(same(LOG_LIST));
when(logRecordExporter1.flush()).thenReturn(CompletableResultCode.ofSuccess());
when(logRecordExporter2.flush()).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogRecordExporter.flush().isSuccess()).isTrue();
verify(logRecordExporter1).flush();
verify(logRecordExporter2).flush();
when(logRecordExporter1.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
when(logRecordExporter2.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
multiLogRecordExporter.shutdown();
verify(logRecordExporter1).shutdown();
verify(logRecordExporter2).shutdown();
}
@Test
void twoLogRecordExporter_OneReturnFailure() {
LogRecordExporter multiLogRecordExporter =
LogRecordExporter.composite(Arrays.asList(logRecordExporter1, logRecordExporter2));
when(logRecordExporter1.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofSuccess());
when(logRecordExporter2.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofFailure());
assertThat(multiLogRecordExporter.export(LOG_LIST).isSuccess()).isFalse();
verify(logRecordExporter1).export(same(LOG_LIST));
verify(logRecordExporter2).export(same(LOG_LIST));
when(logRecordExporter1.flush()).thenReturn(CompletableResultCode.ofSuccess());
when(logRecordExporter2.flush()).thenReturn(CompletableResultCode.ofFailure());
assertThat(multiLogRecordExporter.flush().isSuccess()).isFalse();
verify(logRecordExporter1).flush();
verify(logRecordExporter2).flush();
when(logRecordExporter1.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
when(logRecordExporter2.shutdown()).thenReturn(CompletableResultCode.ofFailure());
assertThat(multiLogRecordExporter.shutdown().isSuccess()).isFalse();
verify(logRecordExporter1).shutdown();
verify(logRecordExporter2).shutdown();
}
@Test
@SuppressLogger(MultiLogRecordExporter.class)
void twoLogRecordExporter_FirstThrows() {
LogRecordExporter multiLogRecordExporter =
LogRecordExporter.composite(Arrays.asList(logRecordExporter1, logRecordExporter2));
Mockito.doThrow(new IllegalArgumentException("No export for you."))
.when(logRecordExporter1)
.export(ArgumentMatchers.anyList());
when(logRecordExporter2.export(same(LOG_LIST))).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogRecordExporter.export(LOG_LIST).isSuccess()).isFalse();
verify(logRecordExporter1).export(same(LOG_LIST));
verify(logRecordExporter2).export(same(LOG_LIST));
Mockito.doThrow(new IllegalArgumentException("No flush for you."))
.when(logRecordExporter1)
.flush();
when(logRecordExporter2.flush()).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogRecordExporter.flush().isSuccess()).isFalse();
verify(logRecordExporter1).flush();
verify(logRecordExporter2).flush();
Mockito.doThrow(new IllegalArgumentException("No shutdown for you."))
.when(logRecordExporter1)
.shutdown();
when(logRecordExporter2.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
assertThat(multiLogRecordExporter.shutdown().isSuccess()).isFalse();
verify(logRecordExporter1).shutdown();
verify(logRecordExporter2).shutdown();
}
}

View File

@ -36,16 +36,16 @@ class SimpleLogProcessorTest {
private static final LogData LOG_DATA = TestLogData.builder().build();
@Mock private LogExporter logExporter;
@Mock private LogRecordExporter logRecordExporter;
@Mock private ReadWriteLogRecord readWriteLogRecord;
private LogProcessor logProcessor;
@BeforeEach
void setUp() {
logProcessor = SimpleLogProcessor.create(logExporter);
when(logExporter.export(anyCollection())).thenReturn(CompletableResultCode.ofSuccess());
when(logExporter.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
logProcessor = SimpleLogProcessor.create(logRecordExporter);
when(logRecordExporter.export(anyCollection())).thenReturn(CompletableResultCode.ofSuccess());
when(logRecordExporter.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
when(readWriteLogRecord.toLogData()).thenReturn(LOG_DATA);
}
@ -59,16 +59,16 @@ class SimpleLogProcessorTest {
@Test
void onEmit() {
logProcessor.onEmit(readWriteLogRecord);
verify(logExporter).export(Collections.singletonList(LOG_DATA));
verify(logRecordExporter).export(Collections.singletonList(LOG_DATA));
}
@Test
@SuppressLogger(SimpleLogProcessor.class)
void onEmit_ExporterError() {
when(logExporter.export(any())).thenThrow(new RuntimeException("Exporter error!"));
when(logRecordExporter.export(any())).thenThrow(new RuntimeException("Exporter error!"));
logProcessor.onEmit(readWriteLogRecord);
logProcessor.onEmit(readWriteLogRecord);
verify(logExporter, times(2)).export(anyList());
verify(logRecordExporter, times(2)).export(anyList());
}
@Test
@ -76,12 +76,12 @@ class SimpleLogProcessorTest {
CompletableResultCode export1 = new CompletableResultCode();
CompletableResultCode export2 = new CompletableResultCode();
when(logExporter.export(any())).thenReturn(export1, export2);
when(logRecordExporter.export(any())).thenReturn(export1, export2);
logProcessor.onEmit(readWriteLogRecord);
logProcessor.onEmit(readWriteLogRecord);
verify(logExporter, times(2)).export(Collections.singletonList(LOG_DATA));
verify(logRecordExporter, times(2)).export(Collections.singletonList(LOG_DATA));
CompletableResultCode flush = logProcessor.forceFlush();
assertThat(flush.isDone()).isFalse();
@ -99,23 +99,23 @@ class SimpleLogProcessorTest {
CompletableResultCode export1 = new CompletableResultCode();
CompletableResultCode export2 = new CompletableResultCode();
when(logExporter.export(any())).thenReturn(export1, export2);
when(logRecordExporter.export(any())).thenReturn(export1, export2);
logProcessor.onEmit(readWriteLogRecord);
logProcessor.onEmit(readWriteLogRecord);
verify(logExporter, times(2)).export(Collections.singletonList(LOG_DATA));
verify(logRecordExporter, times(2)).export(Collections.singletonList(LOG_DATA));
CompletableResultCode shutdown = logProcessor.shutdown();
assertThat(shutdown.isDone()).isFalse();
export1.succeed();
assertThat(shutdown.isDone()).isFalse();
verify(logExporter, never()).shutdown();
verify(logRecordExporter, never()).shutdown();
export2.succeed();
assertThat(shutdown.isDone()).isTrue();
assertThat(shutdown.isSuccess()).isTrue();
verify(logExporter).shutdown();
verify(logRecordExporter).shutdown();
}
}