diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/DefaultLogEmitter.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/DefaultLogEmitter.java new file mode 100644 index 00000000000..5126a31647d --- /dev/null +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/DefaultLogEmitter.java @@ -0,0 +1,81 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logs; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.logs.data.Severity; +import java.time.Instant; +import java.util.concurrent.TimeUnit; +import javax.annotation.concurrent.ThreadSafe; + +/** + * No-op implementations of {@link LogEmitter}. + * + *
This implementation should induce as close to zero overhead as possible. + */ +@ThreadSafe +class DefaultLogEmitter implements LogEmitter { + + private static final DefaultLogEmitter INSTANCE = new DefaultLogEmitter(); + private static final LogBuilder BUILDER_INSTANCE = new NoopLogBuilder(); + + static LogEmitter getInstance() { + return INSTANCE; + } + + @Override + public LogBuilder logBuilder() { + return BUILDER_INSTANCE; + } + + // Noop implementation of LogBuilder. + private static final class NoopLogBuilder implements LogBuilder { + + @Override + public LogBuilder setEpoch(long timestamp, TimeUnit unit) { + return this; + } + + @Override + public LogBuilder setEpoch(Instant instant) { + return this; + } + + @Override + public LogBuilder setContext(Context context) { + return this; + } + + @Override + public LogBuilder setSeverity(Severity severity) { + return this; + } + + @Override + public LogBuilder setSeverityText(String severityText) { + return this; + } + + @Override + public LogBuilder setName(String name) { + return this; + } + + @Override + public LogBuilder setBody(String body) { + return this; + } + + @Override + public LogBuilder setAttributes(Attributes attributes) { + return this; + } + + @Override + public void emit() {} + } +} diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/DefaultLogEmitterProvider.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/DefaultLogEmitterProvider.java new file mode 100644 index 00000000000..86d5a0ad103 --- /dev/null +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/DefaultLogEmitterProvider.java @@ -0,0 +1,41 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logs; + +/** A {@link LogEmitterProvider} that does nothing. */ +class DefaultLogEmitterProvider implements LogEmitterProvider { + + private static final DefaultLogEmitterProvider INSTANCE = new DefaultLogEmitterProvider(); + private static final LogEmitterBuilder BUILDER_INSTANCE = new NoopLogBuilder(); + + public static LogEmitterProvider getInstance() { + return INSTANCE; + } + + @Override + public LogEmitterBuilder logEmitterBuilder(String instrumentationName) { + return BUILDER_INSTANCE; + } + + private DefaultLogEmitterProvider() {} + + private static class NoopLogBuilder implements LogEmitterBuilder { + @Override + public LogEmitterBuilder setSchemaUrl(String schemaUrl) { + return this; + } + + @Override + public LogEmitterBuilder setInstrumentationVersion(String instrumentationVersion) { + return this; + } + + @Override + public LogEmitter build() { + return DefaultLogEmitter.getInstance(); + } + } +} diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/LogEmitterProvider.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/LogEmitterProvider.java new file mode 100644 index 00000000000..645bdb3ab79 --- /dev/null +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/LogEmitterProvider.java @@ -0,0 +1,48 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logs; + +import javax.annotation.concurrent.ThreadSafe; + +/** + * A registry for creating named {@link LogEmitter}s. + * + *
A LogEmitterProvider represents a configured (or noop) Log collection system that can be used + * to instrument code. + * + *
The name Provider is for consistency with other languages and it is NOT loaded + * using reflection. + */ +@ThreadSafe +public interface LogEmitterProvider { + + /** + * Gets or creates a named and versioned log instance. + * + * @param instrumentationName The name of the instrumentation library, not the name of the + * instrument*ed* library. + * @return a log emitter instance. + */ + default LogEmitter get(String instrumentationName) { + return logEmitterBuilder(instrumentationName).build(); + } + + /** + * Creates a LogEmitterBuilder for a named log instance. + * + * @param instrumentationName The name of the instrumentation library, not the name of the + * instrument*ed* library. + * @return a LogEmitterBuilder instance. + */ + LogEmitterBuilder logEmitterBuilder(String instrumentationName); + + /** + * Returns a no-op {@link LogEmitterProvider} which provides meters which do not record or emit. + */ + static LogEmitterProvider noop() { + return DefaultLogEmitterProvider.getInstance(); + } +} diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogEmitterProvider.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogEmitterProvider.java index f3c93bcc31b..07e99241378 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogEmitterProvider.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogEmitterProvider.java @@ -16,7 +16,7 @@ import java.util.logging.Logger; /** SDK registry for creating {@link LogEmitter}s. */ -public final class SdkLogEmitterProvider implements Closeable { +public final class SdkLogEmitterProvider implements LogEmitterProvider, Closeable { static final String DEFAULT_EMITTER_NAME = "unknown"; private static final Logger LOGGER = Logger.getLogger(SdkLogEmitterProvider.class.getName()); @@ -47,6 +47,7 @@ public static SdkLogEmitterProviderBuilder builder() { * @param instrumentationName the name of the instrumentation library * @return a log emitter instance */ + @Override public LogEmitter get(String instrumentationName) { return logEmitterBuilder(instrumentationName).build(); } @@ -57,6 +58,7 @@ public LogEmitter get(String instrumentationName) { * @param instrumentationName the name of the instrumentation library * @return a log emitter builder instance */ + @Override public LogEmitterBuilder logEmitterBuilder(String instrumentationName) { if (instrumentationName == null || instrumentationName.isEmpty()) { LOGGER.fine("LogEmitter requested without instrumentation name."); diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/DefaultLogEmitterProviderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/DefaultLogEmitterProviderTest.java new file mode 100644 index 00000000000..d559d74d696 --- /dev/null +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/DefaultLogEmitterProviderTest.java @@ -0,0 +1,29 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logs; + +import static org.junit.jupiter.api.Assertions.assertSame; + +import org.junit.jupiter.api.Test; + +class DefaultLogEmitterProviderTest { + + private final LogEmitterProvider logEmitterProvider = DefaultLogEmitterProvider.getInstance(); + + @Test + void builder_doesNotThrow() { + LogEmitterProvider.noop() + .logEmitterBuilder("test") + .setSchemaUrl("http://url") + .setInstrumentationVersion("version") + .build(); + } + + @Test + void builder_default() { + assertSame(logEmitterProvider.get("test"), DefaultLogEmitter.getInstance()); + } +} diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/DefaultLogEmitterTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/DefaultLogEmitterTest.java new file mode 100644 index 00000000000..92bd1fca2a8 --- /dev/null +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/DefaultLogEmitterTest.java @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logs; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.logs.data.Severity; +import java.time.Instant; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.Test; + +class DefaultLogEmitterTest { + + private static final LogEmitter logEmitter = DefaultLogEmitter.getInstance(); + + @Test + void noopLogEmitter_doesNotThrow() { + logEmitter + .logBuilder() + .setName("test") + .setBody("1") + .setSeverity(Severity.INFO) + .setEpoch(1L, TimeUnit.NANOSECONDS) + .setAttributes(Attributes.empty()) + .setContext(Context.current()) + .setEpoch(Instant.now()) + .setSeverityText("INFO") + .emit(); + } +}