Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for log emitter provider #3994

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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}.
*
* <p>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() {}
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
Original file line number Diff line number Diff line change
@@ -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.
*
* <p>A LogEmitterProvider represents a configured (or noop) Log collection system that can be used
* to instrument code.
*
* <p>The name <i>Provider</i> is for consistency with other languages and it is <b>NOT</b> 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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down Expand Up @@ -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();
}
Expand All @@ -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.");
Expand Down
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}